สร้างเครื่องมือเชื่อมต่อเนื้อหา

เครื่องมือเชื่อมต่อเนื้อหาเป็นโปรแกรมซอฟต์แวร์ที่ใช้เพื่อข้ามผ่านข้อมูลในที่เก็บขององค์กรและป้อนข้อมูลแหล่งข้อมูล Google มีตัวเลือกต่อไปนี้สำหรับการพัฒนาเครื่องมือเชื่อมต่อเนื้อหา

  • Content Connector SDK ซึ่งเป็นตัวเลือกที่ดี หากคุณกำลังเขียนโปรแกรมใน Java Content Connector SDK คือ Wrapper ของ REST API ช่วยให้คุณสร้างเครื่องมือเชื่อมต่อได้อย่างรวดเร็ว ในการสร้างเครื่องมือเชื่อมต่อเนื้อหาโดยใช้ SDK โปรดดูสร้างเครื่องมือเชื่อมต่อเนื้อหาโดยใช้ Content Connector SDK

  • REST API หรือไลบรารี API ระดับต่ำ ใช้ตัวเลือกเหล่านี้หากคุณไม่ได้เขียนโปรแกรมใน Java หรือหากโค้ดเบสรองรับ REST API หรือไลบรารีมากกว่า หากต้องการสร้างเครื่องมือเชื่อมต่อเนื้อหาโดยใช้ REST API โปรดดูสร้างเครื่องมือเชื่อมต่อเนื้อหาโดยใช้ REST API

เครื่องมือเชื่อมต่อเนื้อหาทั่วไปจะทำงานต่อไปนี้

  1. อ่านและประมวลผลพารามิเตอร์การกำหนดค่า
  2. ดึงข้อมูลที่จัดทำดัชนีได้บางส่วนซึ่งมีชื่อว่า "items" จากที่เก็บเนื้อหาของบุคคลที่สาม
  3. รวม ACL, ข้อมูลเมตา และข้อมูลเนื้อหาเป็นรายการที่สามารถจัดทำดัชนีได้
  4. จัดทำดัชนีรายการไปยังแหล่งข้อมูลของ Cloud Search
  5. (ไม่บังคับ) ฟังการเปลี่ยนแปลงการแจ้งเตือนจากที่เก็บเนื้อหาของบุคคลที่สาม ระบบจะแปลงการแจ้งเตือนการเปลี่ยนแปลงเป็นคำขอการจัดทำดัชนีเพื่อให้แหล่งข้อมูล Cloud Search ซิงค์กับที่เก็บของบุคคลที่สามอยู่เสมอ เครื่องมือเชื่อมต่อจะทำงานนี้ต่อเมื่อที่เก็บรองรับการตรวจหาการเปลี่ยนแปลงเท่านั้น

สร้างเครื่องมือเชื่อมต่อเนื้อหาโดยใช้ Content Connector SDK

ส่วนต่อไปนี้จะอธิบายวิธีสร้างเครื่องมือเชื่อมต่อเนื้อหาโดยใช้ SDK ของ Content Connector

ตั้งค่าทรัพยากร Dependency

คุณต้องรวมทรัพยากร Dependency บางอย่างในไฟล์บิลด์เพื่อใช้ SDK คลิกแท็บด้านล่างเพื่อดูทรัพยากร Dependency สำหรับสภาพแวดล้อมของบิลด์

Maven

<dependency>
<groupId>com.google.enterprise.cloudsearch</groupId>
<artifactId>google-cloudsearch-indexing-connector-sdk</artifactId>
<version>v1-0.0.3</version>
</dependency>

Gradle

compile group: 'com.google.enterprise.cloudsearch',
        name: 'google-cloudsearch-indexing-connector-sdk',
        version: 'v1-0.0.3'

สร้างการกำหนดค่าเครื่องมือเชื่อมต่อ

เครื่องมือเชื่อมต่อทั้งหมดมีไฟล์การกำหนดค่าที่ประกอบด้วยพารามิเตอร์ที่เครื่องมือเชื่อมต่อใช้ เช่น รหัสสำหรับที่เก็บ ระบบจะกำหนดพารามิเตอร์เป็นคู่คีย์-ค่า เช่น api.sourceId=1234567890abcdef

Google Cloud Search SDK มีพารามิเตอร์การกำหนดค่าที่ Google มีให้หลายรายการที่เครื่องมือเชื่อมต่อทั้งหมดใช้ คุณต้องประกาศพารามิเตอร์ที่ Google จัดหาต่อไปนี้ในไฟล์การกำหนดค่า

  • สำหรับเครื่องมือเชื่อมต่อเนื้อหา คุณต้องประกาศ api.sourceId และ api.serviceAccountPrivateKeyFile เนื่องจากพารามิเตอร์เหล่านี้ระบุตำแหน่งของที่เก็บและคีย์ส่วนตัวที่จำเป็นต่อการเข้าถึงที่เก็บ
  • สำหรับเครื่องมือเชื่อมต่อข้อมูลประจำตัว คุณต้องประกาศ api.identitySourceId เนื่องจากพารามิเตอร์นี้ระบุตำแหน่งของแหล่งที่มาของข้อมูลประจำตัวภายนอก หากซิงค์ผู้ใช้ คุณต้องประกาศ api.customerId เป็นรหัสที่ไม่ซ้ำกันสำหรับบัญชี Google Workspace ขององค์กรด้วย

คุณไม่จำเป็นต้องประกาศพารามิเตอร์เหล่านั้นในไฟล์การกำหนดค่า ยกเว้นกรณีที่คุณต้องการลบล้างค่าเริ่มต้นของพารามิเตอร์อื่นๆ ที่ Google มีให้ โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับพารามิเตอร์การกำหนดค่าที่ Google มีให้ เช่น วิธีสร้างรหัสและคีย์บางรายการในพารามิเตอร์การกำหนดค่าที่ Google มีให้

นอกจากนี้ คุณยังกำหนดพารามิเตอร์เฉพาะที่เก็บของคุณเองเพื่อใช้ในไฟล์การกำหนดค่าได้ด้วย

ส่งไฟล์การกำหนดค่าไปยังเครื่องมือเชื่อมต่อ

ตั้งค่าพร็อพเพอร์ตี้ของระบบ config เพื่อส่งไฟล์การกำหนดค่าไปยังเครื่องมือเชื่อมต่อ คุณสามารถตั้งค่าพร็อพเพอร์ตี้ได้โดยใช้อาร์กิวเมนต์ -D เมื่อเริ่มต้นเครื่องมือเชื่อมต่อ เช่น คำสั่งต่อไปนี้จะเริ่มเครื่องมือเชื่อมต่อด้วยไฟล์การกำหนดค่า MyConfig.properties

java -classpath myconnector.jar;... -Dconfig=MyConfig.properties MyConnector

หากไม่มีอาร์กิวเมนต์นี้ SDK จะพยายามเข้าถึงไฟล์การกำหนดค่าเริ่มต้นชื่อ connector-config.properties

กำหนดกลยุทธ์การข้ามผ่าน

ฟังก์ชันหลักของเครื่องมือเชื่อมต่อเนื้อหาคือข้ามผ่านที่เก็บและจัดทำดัชนีข้อมูล คุณต้องใช้กลยุทธ์การข้ามผ่านตามขนาดและการจัดวางข้อมูลในที่เก็บ คุณจะออกแบบกลยุทธ์ของตัวคุณเองหรือเลือกจากกลยุทธ์ต่อไปนี้ที่ใช้ใน SDK ก็ได้

กลยุทธ์การข้ามผ่านเต็มรูปแบบ

กลยุทธ์การข้ามผ่านแบบเต็มรูปแบบจะสแกนที่เก็บทั้งหมดและจัดทำดัชนีรายการทั้งหมด กลยุทธ์นี้มักใช้เมื่อคุณมีที่เก็บขนาดเล็กและมีค่าใช้จ่ายในการดำเนินการข้ามผ่านทั้งหมดทุกครั้งที่จัดทำดัชนี

กลยุทธ์การข้ามผ่านนี้เหมาะสำหรับที่เก็บขนาดเล็กที่มีข้อมูลส่วนใหญ่คงที่และไม่มีลำดับชั้น คุณอาจใช้กลยุทธ์การข้ามผ่านนี้เมื่อการตรวจจับการเปลี่ยนแปลงทำได้ยากหรือที่ที่เก็บไม่รองรับ

กลยุทธ์การส่งผ่านรายการ

กลยุทธ์การข้ามผ่านรายการจะสแกนที่เก็บทั้งหมด รวมถึงโหนดย่อยทั้งหมด เพื่อกำหนดสถานะของแต่ละรายการ จากนั้นเครื่องมือเชื่อมต่อจะทำการข้ามครั้งที่ 2 และจัดทำดัชนีเฉพาะรายการใหม่หรือที่มีการอัปเดตหลังจากการจัดทำดัชนีครั้งล่าสุด กลยุทธ์นี้มักใช้ในการอัปเดตดัชนีที่มีอยู่ทีละน้อย (แทนที่จะต้องทำการข้ามผ่านแบบสมบูรณ์ทุกครั้งที่คุณอัปเดตดัชนี)

กลยุทธ์การข้ามผ่านนี้เหมาะกับกรณีที่ที่เก็บการเปลี่ยนแปลงทำได้ยากหรือไม่รองรับ คุณมีข้อมูลที่ไม่ใช่ลำดับชั้น และใช้กับชุดข้อมูลขนาดใหญ่มาก

การส่งผ่านกราฟ

กลยุทธ์การข้ามผ่านกราฟจะสแกนโหนดระดับบนสุดทั้งโหนดเพื่อกำหนดสถานะของแต่ละรายการ จากนั้นเครื่องมือเชื่อมต่อจะรับการส่งครั้งที่ 2 และจัดทำดัชนีเฉพาะรายการในโหนดรากซึ่งเป็นรายการใหม่หรือได้รับการอัปเดตตั้งแต่การจัดทำดัชนีครั้งล่าสุด สุดท้าย เครื่องมือเชื่อมต่อจะส่งรหัสย่อยแล้วจัดทำดัชนีรายการในโหนดย่อยที่เป็นรายการใหม่หรือได้รับการอัปเดต เครื่องมือเชื่อมต่อจะเรียนรู้ไปเรื่อยๆ ผ่านโหนดย่อยทั้งหมดจนกว่าจะจัดการได้ครบทั้งหมดแล้ว โดยทั่วไปแล้วการข้ามผ่านดังกล่าวจะใช้สำหรับที่เก็บแบบลำดับชั้นซึ่งการแสดงรหัสทั้งหมดไม่ได้ใช้งานได้จริง

กลยุทธ์นี้เหมาะสำหรับหากคุณมีข้อมูลตามลำดับชั้นที่ต้องมีการรวบรวมข้อมูล เช่น ไดเรกทอรีหรือหน้าเว็บหลายหน้า

แต่ละกลยุทธ์การข้ามผ่านเหล่านี้จะใช้โดยคลาสเครื่องมือเชื่อมต่อเทมเพลตใน SDK แม้ว่าคุณจะใช้กลยุทธ์การข้ามผ่านของตัวเองได้ แต่เทมเพลตเหล่านี้ช่วยเร่งการพัฒนาเครื่องมือเชื่อมต่อได้อย่างมาก ในการสร้างเครื่องมือเชื่อมต่อโดยใช้เทมเพลต ให้ไปที่ส่วนที่เกี่ยวข้องกับกลยุทธ์การข้ามผ่าน

สร้างเครื่องมือเชื่อมต่อการข้ามผ่านแบบสมบูรณ์โดยใช้คลาสเทมเพลต

เอกสารส่วนนี้หมายถึงข้อมูลโค้ดจากตัวอย่าง FullTraversalSample

ใช้งานจุดแรกเข้าของเครื่องมือเชื่อมต่อ

จุดแรกเข้าของเครื่องมือเชื่อมต่อคือเมธอด main() งานหลักของเมธอดนี้คือการสร้างอินสแตนซ์ของคลาส Application และเรียกใช้เมธอด start() เพื่อเรียกใช้เครื่องมือเชื่อมต่อ

ก่อนเรียกใช้ application.start() ให้ใช้คลาส IndexingApplication.Builder เพื่อสร้างอินสแตนซ์ FullTraversalConnector เทมเพลต FullTraversalConnector ยอมรับออบเจ็กต์ Repository ที่มีเมธอดที่คุณใช้ ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีใช้เมธอด main()

FullTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a full
 * traversal connector.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new SampleRepository();
  IndexingConnector connector = new FullTraversalConnector(repository);
  IndexingApplication application = new IndexingApplication.Builder(connector, args).build();
  application.start();
}

SDK จะเรียกใช้เมธอด initConfig() ในเบื้องหลังหลังจากที่เรียกใช้เมธอด main() ของเครื่องมือเชื่อมต่อ Application.build เมธอด initConfig() จะทํางานต่อไปนี้

  1. เรียกใช้เมธอด Configuation.isInitialized() เพื่อให้มั่นใจว่า Configuration ยังไม่ได้เริ่มต้น
  2. เริ่มต้นออบเจ็กต์ Configuration ด้วยคู่คีย์-ค่าที่ Google จัดหา คู่คีย์-ค่าแต่ละคู่จะเก็บไว้ในออบเจ็กต์ ConfigValue ภายในออบเจ็กต์ Configuration

ใช้อินเทอร์เฟซ Repository

วัตถุประสงค์เพียงอย่างเดียวของออบเจ็กต์ Repository คือเพื่อดำเนินการข้ามผ่านและการจัดทำดัชนีรายการที่เก็บ เมื่อใช้เทมเพลต คุณต้องลบล้างเมธอดภายในอินเทอร์เฟซ Repository เท่านั้นเพื่อสร้างเครื่องมือเชื่อมต่อเนื้อหา วิธีการที่คุณลบล้างจะขึ้นอยู่กับกลยุทธ์เทมเพลตและการข้ามผ่านที่คุณใช้ สำหรับ FullTraversalConnector ให้ลบล้างเมธอดต่อไปนี้

  • เมธอด init() หากต้องการดำเนินการตั้งค่าและเริ่มต้นพื้นที่เก็บข้อมูล ให้ลบล้างเมธอด init()

  • เมธอด getAllDocs() หากต้องการข้ามผ่านและจัดทำดัชนีรายการทั้งหมดในที่เก็บข้อมูล ให้ลบล้างเมธอด getAllDocs() เมธอดนี้จะถูกเรียกครั้งเดียวสำหรับแต่ละการส่งผ่านตามกำหนดการ (ตามที่กำหนดโดยการกำหนดค่า)

  • (ไม่บังคับ) เมธอด getChanges() หากที่เก็บรองรับการตรวจหาการเปลี่ยนแปลง ให้ลบล้างเมธอด getChanges() ระบบจะเรียกวิธีนี้เพียงครั้งเดียวสำหรับการข้ามผ่านส่วนเพิ่มตามกำหนดการแต่ละรายการ (ตามที่กำหนดโดยการกำหนดค่า) เพื่อเรียกข้อมูลรายการที่แก้ไขและจัดทำดัชนี

  • (ไม่บังคับ) เมธอด close() หากต้องการล้างข้อมูลที่เก็บ ให้ลบล้างเมธอด close() ระบบจะเรียกวิธีนี้เพียงครั้งเดียวระหว่างการปิดเครื่องเชื่อมต่อ

เมธอดแต่ละเมธอดของออบเจ็กต์ Repository แสดงผลออบเจ็กต์ ApiOperation บางประเภท ออบเจ็กต์ ApiOperation ดำเนินการในรูปแบบการเรียก IndexingService.indexItem() เดียวหรือหลายรายการให้จัดทำดัชนีที่เก็บจริง

รับพารามิเตอร์การกำหนดค่าที่กำหนดเอง

คุณจะต้องรับพารามิเตอร์ที่กำหนดเองจากออบเจ็กต์ Configuration เพื่อให้สอดคล้องกับการกำหนดค่าของเครื่องมือเชื่อมต่อ โดยปกติงานนี้จะทำในเมธอด init() ของชั้นเรียน Repository

คลาส Configuration มีหลายวิธีในการรับข้อมูลประเภทต่างๆ จากการกำหนดค่า แต่ละวิธีจะแสดงผลออบเจ็กต์ ConfigValue จากนั้นจะใช้เมธอด get() ของออบเจ็กต์ ConfigValue เพื่อดึงค่าจริง ข้อมูลโค้ดจาก FullTraversalSample ต่อไปนี้แสดงวิธีดึงค่าจำนวนเต็มที่กำหนดเองค่าเดียวจากออบเจ็กต์ Configuration

FullTraversalSample.java
@Override
public void init(RepositoryContext context) {
  log.info("Initializing repository");
  numberOfDocuments = Configuration.getInteger("sample.documentCount", 10).get();
}

หากต้องการรับและแยกวิเคราะห์พารามิเตอร์ที่มีหลายค่า ให้ใช้โปรแกรมแยกวิเคราะห์ประเภท Configuration ประเภทใดประเภทหนึ่งเพื่อแยกวิเคราะห์ข้อมูลเป็นกลุ่มที่ไม่ต่อเนื่อง ข้อมูลโค้ดจากเครื่องมือเชื่อมต่อบทแนะนำจะใช้เมธอด getMultiValue เพื่อรับชื่อที่เก็บ GitHub แบบรายการ

GithubRepository.java
ConfigValue<List<String>> repos = Configuration.getMultiValue(
    "github.repos",
    Collections.emptyList(),
    Configuration.STRING_PARSER);

ดำเนินการข้ามผ่านโดยสมบูรณ์

ลบล้าง getAllDocs() เพื่อดำเนินการข้ามผ่านโดยสมบูรณ์และจัดทำดัชนีที่เก็บ เมธอด getAllDocs() ยอมรับจุดเช็คพอยท์ ระบบจะใช้จุดตรวจสอบเพื่อดำเนินการจัดทำดัชนีต่อที่รายการเฉพาะหากกระบวนการหยุดชะงัก สำหรับแต่ละรายการในที่เก็บ ให้ทำตามขั้นตอนต่อไปนี้ในเมธอด getAllDocs()

  1. ตั้งค่าสิทธิ์
  2. ตั้งค่าข้อมูลเมตาสำหรับรายการที่คุณกำลังจัดทำดัชนี
  3. รวมข้อมูลเมตาและรายการลงในไฟล์เดียวที่จัดทำดัชนีได้ RepositoryDoc
  4. จัดแพ็กเกจแต่ละรายการที่จัดทำดัชนีได้ลงในตัววนซ้ำที่ส่งคืนโดยเมธอด getAllDocs() โปรดทราบว่าจริงๆ แล้ว getAllDocs() จะแสดงผล CheckpointCloseableIterable ซึ่งเป็นการทำซ้ำออบเจ็กต์ ApiOperation โดยแต่ละออบเจ็กต์จะแสดงคำขอ API ที่ดำเนินการใน RepositoryDoc เช่น การจัดทำดัชนี

หากชุดรายการมีขนาดใหญ่เกินกว่าที่จะประมวลผลในการเรียกครั้งเดียว ให้ใส่จุดตรวจสอบและตั้งค่า hasMore(true) เพื่อระบุว่ามีรายการเพิ่มเติมที่พร้อมจัดทำดัชนี

ตั้งค่าสิทธิ์สำหรับรายการ

ที่เก็บของคุณใช้รายการควบคุมการเข้าถึง (ACL) เพื่อระบุผู้ใช้หรือกลุ่มที่มีสิทธิ์เข้าถึงรายการ ACL คือรายการรหัสของกลุ่มหรือผู้ใช้ที่เข้าถึงรายการดังกล่าวได้

คุณต้องทำสำเนา ACL ที่ที่เก็บของคุณใช้เพื่อให้แน่ใจว่ามีเพียงผู้ใช้ที่มีสิทธิ์เข้าถึงรายการเท่านั้นที่สามารถดูรายการนั้นในผลการค้นหา คุณต้องระบุ ACL ของรายการเมื่อจัดทำดัชนีรายการเพื่อให้ Google Cloud Search มีข้อมูลที่จำเป็นในการให้ระดับการเข้าถึงรายการที่ถูกต้อง

Content Connector SDK มีชุดคลาสและเมธอด ACL ที่หลากหลายเพื่อสร้างโมเดล ACL ของที่เก็บส่วนใหญ่ คุณต้องวิเคราะห์ ACL สำหรับแต่ละรายการในที่เก็บ และสร้าง ACL ที่เกี่ยวข้องสำหรับ Google Cloud Search เมื่อคุณจัดทำดัชนีรายการ หาก ACL ของที่เก็บใช้แนวคิดต่างๆ เช่น การสืบทอด ACL การสร้างโมเดลที่ ACL อาจเป็นเรื่องยาก ดูข้อมูลเพิ่มเติมเกี่ยวกับ ACL ของ Google Cloud Search ได้ที่ ACL ของ Google Cloud Search

หมายเหตุ: Cloud Search Indexing API รองรับ ACL แบบโดเมนเดียว ไม่รองรับ ACL ข้ามโดเมน ใช้คลาส Acl.Builder เพื่อตั้งค่าการเข้าถึงแต่ละรายการโดยใช้ ACL ข้อมูลโค้ดต่อไปนี้นำมาจากตัวอย่างการส่งผ่านทั้งหมด ทำให้ผู้ใช้หรือ "ผู้ใช้หลัก" ทั้งหมด (getCustomerPrincipal()) เป็น "ผู้อ่าน" ของรายการทั้งหมด (.setReaders()) เมื่อทำการค้นหา

FullTraversalSample.java
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

คุณต้องทำความเข้าใจ ACL เพื่อสร้างโมเดล ACL สำหรับที่เก็บอย่างถูกต้อง เช่น คุณอาจกำลังจัดทำดัชนีไฟล์ภายในระบบไฟล์ที่ใช้โมเดลการรับค่าบางประเภทที่โฟลเดอร์ย่อยจะรับค่าสิทธิ์จากโฟลเดอร์หลัก การสร้างแบบจำลองการสืบทอด ACL ต้องมีข้อมูลเพิ่มเติมที่ครอบคลุมใน ACL ของ Google Cloud Search

ตั้งค่าข้อมูลเมตาสำหรับรายการ

ระบบจะจัดเก็บข้อมูลเมตาไว้ในออบเจ็กต์ Item หากต้องการสร้าง Item คุณต้องมีรหัสสตริงที่ไม่ซ้ำกัน, ประเภทรายการ, ACL, URL และเวอร์ชันขั้นต่ำของสินค้าดังกล่าว ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้าง Item โดยใช้คลาสตัวช่วยของ IndexingItemBuilder

FullTraversalSample.java
// Url is required. Use google.com as a placeholder for this sample.
String viewUrl = "https://www.google.com";

// Version is required, set to current timestamp.
byte[] version = Longs.toByteArray(System.currentTimeMillis());

// Using the SDK item builder class to create the document with appropriate attributes
// (this can be expanded to include metadata fields etc.)
Item item = IndexingItemBuilder.fromConfiguration(Integer.toString(id))
    .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
    .setAcl(acl)
    .setSourceRepositoryUrl(IndexingItemBuilder.FieldOrValue.withValue(viewUrl))
    .setVersion(version)
    .build();

สร้างรายการที่จัดทำดัชนีได้

เมื่อตั้งค่าข้อมูลเมตาสำหรับรายการแล้ว คุณจะสร้างรายการจริงที่จัดทำดัชนีได้โดยใช้คลาส RepositoryDoc.Builder ตัวอย่างต่อไปนี้แสดงวิธีสร้างรายการเดี่ยวที่จัดทำดัชนีได้

FullTraversalSample.java
// For this sample, content is just plain text
String content = String.format("Hello world from sample doc %d", id);
ByteArrayContent byteContent = ByteArrayContent.fromString("text/plain", content);

// Create the fully formed document
RepositoryDoc doc = new RepositoryDoc.Builder()
    .setItem(item)
    .setContent(byteContent, IndexingService.ContentFormat.TEXT)
    .build();

RepositoryDoc เป็น ApiOperation ประเภทหนึ่งที่ดำเนินการตามคำขอ IndexingService.indexItem() จริง

นอกจากนี้ คุณยังใช้เมธอด setRequestMode() ของคลาส RepositoryDoc.Builder เพื่อระบุคำขอการจัดทำดัชนีเป็น ASYNCHRONOUS หรือ SYNCHRONOUS ได้ด้วย โดยทำดังนี้

ASYNCHRONOUS
โหมดอะซิงโครนัสทำให้เกิดความล่าช้าในการจัดทำดัชนีเพื่อแสดงและรองรับโควต้าอัตราการส่งข้อมูลจำนวนมากสำหรับคำขอจัดทำดัชนี เราขอแนะนำโหมดอะซิงโครนัสสำหรับการจัดทำดัชนีเริ่มต้น (โฆษณาทดแทน) ของที่เก็บทั้งหมด
SYNCHRONOUS
โหมดซิงโครนัสทำให้เวลาในการตอบสนองสำหรับการจัดทำดัชนีเพื่อแสดงโฆษณาสั้นลง และรองรับโควต้าอัตราการส่งข้อมูลที่จำกัด เราขอแนะนำโหมดซิงโครนัสสำหรับการจัดทำดัชนีการอัปเดตและการเปลี่ยนแปลงที่เก็บ หากไม่ระบุ โหมดคำขอจะมีค่าเริ่มต้นเป็น SYNCHRONOUS

จัดแพ็กเกจแต่ละรายการที่จัดทำดัชนีได้ในตัวทำซ้ำ

เมธอด getAllDocs() จะแสดงผล Iterator โดยเฉพาะออบเจ็กต์ CheckpointCloseableIterable ของ RepositoryDoc คุณใช้คลาส CheckpointClosableIterableImpl.Builder เพื่อสร้างและแสดงผลตัววนซ้ำได้ ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีสร้าง และแสดงผลตัววนซ้ำ

FullTraversalSample.java
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(allDocs).build();

SDK เรียกใช้การเรียกใช้การจัดทำดัชนีแต่ละครั้งที่อยู่ภายในตัวทำซ้ำ

ขั้นตอนถัดไป

ขั้นตอนถัดไปที่ทำได้มีดังนี้

สร้างเครื่องมือเชื่อมต่อการข้ามผ่านรายการโดยใช้คลาสเทมเพลต

คิวการจัดทำดัชนีของ Cloud Search จะใช้เพื่อเก็บรหัสและค่าแฮชที่ไม่บังคับสำหรับแต่ละรายการในที่เก็บ เครื่องมือเชื่อมต่อการข้ามผ่านรายการจะพุชรหัสรายการไปยังคิวการจัดทำดัชนีของ Google Cloud Search และเรียกข้อมูลทีละรายการเพื่อการจัดทำดัชนี Google Cloud Search จะเก็บคิวและเปรียบเทียบเนื้อหาของคิวเพื่อระบุสถานะของรายการ เช่น มีการลบรายการออกจากที่เก็บหรือไม่ ดูข้อมูลเพิ่มเติมเกี่ยวกับคิวการจัดทำดัชนีของ Cloud Search ได้ที่คิวการจัดทำดัชนีของ Cloud Search

เอกสารส่วนนี้หมายถึงข้อมูลโค้ดจากตัวอย่าง ListTraversalSample

ใช้งานจุดแรกเข้าของเครื่องมือเชื่อมต่อ

จุดแรกเข้าของเครื่องมือเชื่อมต่อคือเมธอด main() งานหลักของเมธอดนี้คือการสร้างอินสแตนซ์ของคลาส Application และเรียกใช้เมธอด start() เพื่อเรียกใช้เครื่องมือเชื่อมต่อ

ก่อนเรียกใช้ application.start() ให้ใช้คลาส IndexingApplication.Builder เพื่อสร้างอินสแตนซ์ ListingConnector เทมเพลต ListingConnector ยอมรับออบเจ็กต์ Repository ที่มีเมธอดที่คุณจะใช้ ข้อมูลโค้ดต่อไปนี้แสดงวิธียืนยัน ListingConnector และ Repository ที่เกี่ยวข้อง

ListTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a
 * list traversal connector.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new SampleRepository();
  IndexingConnector connector = new ListingConnector(repository);
  IndexingApplication application = new IndexingApplication.Builder(connector, args).build();
  application.start();
}

SDK จะเรียกใช้เมธอด initConfig() ในเบื้องหลังหลังจากที่เรียกใช้เมธอด main() ของเครื่องมือเชื่อมต่อ Application.build เมธอด initConfig():

  1. เรียกใช้เมธอด Configuation.isInitialized() เพื่อให้มั่นใจว่า Configuration ยังไม่ได้เริ่มต้น
  2. เริ่มต้นออบเจ็กต์ Configuration ด้วยคู่คีย์-ค่าที่ Google จัดหา คู่คีย์-ค่าแต่ละคู่จะเก็บไว้ในออบเจ็กต์ ConfigValue ภายในออบเจ็กต์ Configuration

ใช้อินเทอร์เฟซ Repository

วัตถุประสงค์เพียงอย่างเดียวของออบเจ็กต์ Repository คือเพื่อดำเนินการข้ามผ่านและการจัดทำดัชนีรายการที่เก็บ เมื่อใช้เทมเพลต คุณต้องลบล้างเมธอดภายในอินเทอร์เฟซ Repository เท่านั้นเพื่อสร้างเครื่องมือเชื่อมต่อเนื้อหา วิธีการที่คุณลบล้างจะขึ้นอยู่กับเทมเพลตและกลยุทธ์การข้ามผ่านที่คุณใช้ สำหรับ ListingConnector ให้ลบล้างเมธอดต่อไปนี้

  • เมธอด init() หากต้องการดำเนินการตั้งค่าและเริ่มต้นพื้นที่เก็บข้อมูล ให้ลบล้างเมธอด init()

  • เมธอด getIds() หากต้องการเรียกข้อมูลรหัสและค่าแฮชสำหรับระเบียนทั้งหมดในที่เก็บ ให้ลบล้างเมธอด getIds()

  • เมธอด getDoc() หากต้องการเพิ่มรายการใหม่ อัปเดต แก้ไข หรือลบรายการออกจากดัชนี ให้ลบล้างเมธอด getDoc()

  • (ไม่บังคับ) เมธอด getChanges() หากที่เก็บรองรับการตรวจหาการเปลี่ยนแปลง ให้ลบล้างเมธอด getChanges() ระบบจะเรียกวิธีนี้เพียงครั้งเดียวสำหรับการข้ามผ่านส่วนเพิ่มตามกำหนดการแต่ละรายการ (ตามที่กำหนดโดยการกำหนดค่า) เพื่อเรียกข้อมูลรายการที่แก้ไขและจัดทำดัชนี

  • (ไม่บังคับ) เมธอด close() หากต้องการล้างข้อมูลที่เก็บ ให้ลบล้างเมธอด close() ระบบจะเรียกวิธีนี้เพียงครั้งเดียวระหว่างการปิดเครื่องเชื่อมต่อ

เมธอดแต่ละเมธอดของออบเจ็กต์ Repository แสดงผลออบเจ็กต์ ApiOperation บางประเภท ออบเจ็กต์ ApiOperation ดำเนินการในรูปแบบการเรียก IndexingService.indexItem() เดียวหรือหลายรายการให้จัดทำดัชนีที่เก็บจริง

รับพารามิเตอร์การกำหนดค่าที่กำหนดเอง

คุณจะต้องรับพารามิเตอร์ที่กำหนดเองจากออบเจ็กต์ Configuration เพื่อให้สอดคล้องกับการกำหนดค่าของเครื่องมือเชื่อมต่อ โดยปกติงานนี้จะทำในเมธอด init() ของชั้นเรียน Repository

คลาส Configuration มีหลายวิธีในการรับข้อมูลประเภทต่างๆ จากการกำหนดค่า แต่ละวิธีจะแสดงผลออบเจ็กต์ ConfigValue จากนั้นจะใช้เมธอด get() ของออบเจ็กต์ ConfigValue เพื่อดึงค่าจริง ข้อมูลโค้ดจาก FullTraversalSample ต่อไปนี้แสดงวิธีดึงค่าจำนวนเต็มที่กำหนดเองค่าเดียวจากออบเจ็กต์ Configuration

FullTraversalSample.java
@Override
public void init(RepositoryContext context) {
  log.info("Initializing repository");
  numberOfDocuments = Configuration.getInteger("sample.documentCount", 10).get();
}

หากต้องการรับและแยกวิเคราะห์พารามิเตอร์ที่มีหลายค่า ให้ใช้โปรแกรมแยกวิเคราะห์ประเภท Configuration ประเภทใดประเภทหนึ่งเพื่อแยกวิเคราะห์ข้อมูลเป็นกลุ่มที่ไม่ต่อเนื่อง ข้อมูลโค้ดจากเครื่องมือเชื่อมต่อบทแนะนำจะใช้เมธอด getMultiValue เพื่อรับชื่อที่เก็บ GitHub แบบรายการ

GithubRepository.java
ConfigValue<List<String>> repos = Configuration.getMultiValue(
    "github.repos",
    Collections.emptyList(),
    Configuration.STRING_PARSER);

ดำเนินการข้ามผ่านรายการ

ลบล้างเมธอด getIds() เพื่อเรียกข้อมูลรหัสและค่าแฮชสำหรับระเบียนทั้งหมดในที่เก็บ เมธอด getIds() ยอมรับจุดเช็คพอยท์ ระบบจะใช้จุดตรวจสอบเพื่อกลับไปจัดทำดัชนีที่รายการที่เจาะจงต่อหากกระบวนการหยุดชะงัก

จากนั้น ลบล้างเมธอด getDoc() เพื่อจัดการแต่ละรายการในคิวการจัดทำดัชนีของ Cloud Search

รหัสสินค้าพุชและค่าแฮช

ลบล้าง getIds() เพื่อดึงข้อมูลรหัสสินค้าและค่าแฮชเนื้อหาที่เชื่อมโยงจากที่เก็บ จากนั้นระบบจะรวมคู่รหัสและค่าแฮชไว้ในคำขอการดำเนินการพุชไปยังคิวการจัดทำดัชนีของ Cloud Search โดยทั่วไปแล้ว ระบบจะพุชรหัสรูทหรือรหัสหลักก่อน ตามด้วยรหัสย่อยจนกว่าจะประมวลผลรายการทั้งลำดับชั้นแล้ว

เมธอด getIds() จะยอมรับจุดเช็คพอยท์ที่แสดงรายการสุดท้ายที่จะจัดทำดัชนี คุณจะใช้จุดตรวจสอบเพื่อดำเนินการจัดทำดัชนีต่อที่รายการเฉพาะได้ หากกระบวนการหยุดชะงัก สำหรับแต่ละรายการในที่เก็บ ให้ทำตามขั้นตอนต่อไปนี้ในเมธอด getIds()

  • รับรหัสรายการแต่ละรายการและค่าแฮชที่เกี่ยวข้องจากที่เก็บ
  • จัดคู่รหัสและค่าแฮชแต่ละรายการเป็น PushItems
  • รวม PushItems แต่ละรายการเข้าด้วยกันเป็นตัววนซ้ำที่แสดงผลโดยเมธอด getIds() โปรดทราบว่าจริงๆ แล้ว getIds() จะแสดงผล CheckpointCloseableIterable ซึ่งเป็นการทำซ้ำออบเจ็กต์ ApiOperation โดยแต่ละออบเจ็กต์จะแสดงคำขอ API ที่ดำเนินการใน RepositoryDoc เช่น พุชรายการไปยังคิว

ข้อมูลโค้ดต่อไปนี้แสดงวิธีรับรหัสสินค้าและค่าแฮชแต่ละรายการ แล้วแทรกลงใน PushItems PushItems เป็นคำขอ ApiOperation เพื่อพุชรายการไปยังคิวการจัดทำดัชนีของ Cloud Search

ListTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
for (Map.Entry<Integer, Long> entry : this.documents.entrySet()) {
  String documentId = Integer.toString(entry.getKey());
  String hash = this.calculateMetadataHash(entry.getKey());
  PushItem item = new PushItem().setMetadataHash(hash);
  log.info("Pushing " + documentId);
  allIds.addPushItem(documentId, item);
}

ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้คลาส PushItems.Builder เพื่อรวมรหัสและค่าแฮชไว้ในพุชเดียวApiOperation

ListTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();
return iterator;

ระบบจะพุชรายการไปยังคิวการจัดทำดัชนีของ Cloud Search เพื่อประมวลผลต่อไป

ดึงข้อมูลและจัดการแต่ละรายการ

ลบล้าง getDoc() เพื่อจัดการแต่ละรายการในคิวการจัดทำดัชนีของ Cloud Search รายการอาจเป็นรายการใหม่ แก้ไข ไม่เปลี่ยนแปลง หรือไม่มีอยู่ในที่เก็บต้นทางอีกต่อไป ดึงข้อมูลและจัดทำดัชนีแต่ละรายการที่เป็นรายการใหม่หรือที่มีการแก้ไข นำรายการออกจากดัชนีที่ไม่มีอยู่ในที่เก็บต้นทางแล้ว

เมธอด getDoc() จะยอมรับรายการจากคิวการจัดทำดัชนีของ Google Cloud Search สำหรับแต่ละรายการในคิว ให้ทำตามขั้นตอนต่อไปนี้ในเมธอด getDoc()

  1. ตรวจสอบว่ามีรหัสของรายการนั้นในคิวการจัดทำดัชนีของ Cloud Search ในที่เก็บหรือไม่ หากไม่ ให้ลบรายการออกจากดัชนี

  2. สำรวจดัชนีเพื่อดูสถานะรายการ และหากไม่มีการเปลี่ยนแปลง (ACCEPTED) ไม่ต้องดำเนินการใดๆ

  3. ดัชนีมีการเปลี่ยนแปลงหรือรายการใหม่:

    1. ตั้งค่าสิทธิ์
    2. ตั้งค่าข้อมูลเมตาสำหรับรายการที่คุณกำลังจัดทำดัชนี
    3. รวมข้อมูลเมตาและรายการลงในไฟล์เดียวที่จัดทำดัชนีได้ RepositoryDoc
    4. ส่งคืน RepositoryDoc

หมายเหตุ: เทมเพลต ListingConnector ไม่รองรับการแสดงผล null ในเมธอด getDoc() แสดงผลลัพธ์ null รายการใน NullPointerException.

จัดการรายการที่ลบไปแล้ว

ข้อมูลโค้ดต่อไปนี้แสดงวิธีตรวจสอบว่ามีรายการอยู่ในที่เก็บหรือไม่ และหากไม่อยู่ในที่เก็บ ให้ลบออก

ListTraversalSample.java
String resourceName = item.getName();
int documentId = Integer.parseInt(resourceName);

if (!documents.containsKey(documentId)) {
  // Document no longer exists -- delete it
  log.info(() -> String.format("Deleting document %s", item.getName()));
  return ApiOperations.deleteItem(resourceName);
}

โปรดทราบว่า documents เป็นโครงสร้างข้อมูลที่แสดงถึงที่เก็บ หากไม่พบ documentID ใน documents ให้แสดงผล APIOperations.deleteItem(resourceName) เพื่อลบรายการออกจากดัชนี

จัดการรายการที่ไม่เปลี่ยนแปลง

ข้อมูลโค้ดต่อไปนี้แสดงวิธีสำรวจสถานะรายการในคิวการจัดทำดัชนีของ Cloud Search และจัดการรายการที่ไม่มีการเปลี่ยนแปลง

ListTraversalSample.java
String currentHash = this.calculateMetadataHash(documentId);
if (this.canSkipIndexing(item, currentHash)) {
  // Document neither modified nor deleted, ack the push
  log.info(() -> String.format("Document %s not modified", item.getName()));
  PushItem pushItem = new PushItem().setType("NOT_MODIFIED");
  return new PushItems.Builder().addPushItem(resourceName, pushItem).build();
}

หากต้องการดูว่าไม่มีการแก้ไขรายการใด ให้ตรวจสอบสถานะของรายการ รวมทั้งข้อมูลเมตาอื่นๆ ที่อาจบ่งชี้ถึงการเปลี่ยนแปลง ในตัวอย่างนี้ แฮชข้อมูลเมตาใช้เพื่อระบุว่ามีการเปลี่ยนแปลงรายการนั้นหรือไม่

ListTraversalSample.java
/**
 * Checks to see if an item is already up to date
 *
 * @param previousItem Polled item
 * @param currentHash  Metadata hash of the current github object
 * @return PushItem operation
 */
private boolean canSkipIndexing(Item previousItem, String currentHash) {
  if (previousItem.getStatus() == null || previousItem.getMetadata() == null) {
    return false;
  }
  String status = previousItem.getStatus().getCode();
  String previousHash = previousItem.getMetadata().getHash();
  return "ACCEPTED".equals(status)
      && previousHash != null
      && previousHash.equals(currentHash);
}

ตั้งค่าสิทธิ์สำหรับรายการ

ที่เก็บของคุณใช้รายการควบคุมการเข้าถึง (ACL) เพื่อระบุผู้ใช้หรือกลุ่มที่มีสิทธิ์เข้าถึงรายการ ACL คือรายการรหัสของกลุ่มหรือผู้ใช้ที่เข้าถึงรายการดังกล่าวได้

คุณต้องทำสำเนา ACL ที่ที่เก็บของคุณใช้เพื่อให้แน่ใจว่ามีเพียงผู้ใช้ที่มีสิทธิ์เข้าถึงรายการเท่านั้นที่สามารถดูรายการนั้นในผลการค้นหา คุณต้องระบุ ACL ของรายการเมื่อจัดทำดัชนีรายการเพื่อให้ Google Cloud Search มีข้อมูลที่จำเป็นในการให้ระดับการเข้าถึงรายการที่ถูกต้อง

Content Connector SDK มีชุดคลาสและเมธอด ACL ที่หลากหลายเพื่อสร้างโมเดล ACL ของที่เก็บส่วนใหญ่ คุณต้องวิเคราะห์ ACL สำหรับแต่ละรายการในที่เก็บ และสร้าง ACL ที่เกี่ยวข้องสำหรับ Google Cloud Search เมื่อคุณจัดทำดัชนีรายการ หาก ACL ของที่เก็บใช้แนวคิดต่างๆ เช่น การสืบทอด ACL การสร้างโมเดลที่ ACL อาจเป็นเรื่องยาก ดูข้อมูลเพิ่มเติมเกี่ยวกับ ACL ของ Google Cloud Search ได้ที่ ACL ของ Google Cloud Search

หมายเหตุ: Cloud Search Indexing API รองรับ ACL แบบโดเมนเดียว ไม่รองรับ ACL ข้ามโดเมน ใช้คลาส Acl.Builder เพื่อตั้งค่าการเข้าถึงแต่ละรายการโดยใช้ ACL ข้อมูลโค้ดต่อไปนี้นำมาจากตัวอย่างการส่งผ่านทั้งหมด ทำให้ผู้ใช้หรือ "ผู้ใช้หลัก" ทั้งหมด (getCustomerPrincipal()) เป็น "ผู้อ่าน" ของรายการทั้งหมด (.setReaders()) เมื่อทำการค้นหา

FullTraversalSample.java
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

คุณต้องทำความเข้าใจ ACL เพื่อสร้างโมเดล ACL สำหรับที่เก็บอย่างถูกต้อง เช่น คุณอาจกำลังจัดทำดัชนีไฟล์ภายในระบบไฟล์ที่ใช้โมเดลการรับค่าบางประเภทที่โฟลเดอร์ย่อยจะรับค่าสิทธิ์จากโฟลเดอร์หลัก การสร้างแบบจำลองการสืบทอด ACL ต้องมีข้อมูลเพิ่มเติมที่ครอบคลุมใน ACL ของ Google Cloud Search

ตั้งค่าข้อมูลเมตาสำหรับรายการ

ระบบจะจัดเก็บข้อมูลเมตาไว้ในออบเจ็กต์ Item หากต้องการสร้าง Item คุณต้องมีรหัสสตริงที่ไม่ซ้ำกัน, ประเภทรายการ, ACL, URL และเวอร์ชันขั้นต่ำของสินค้าดังกล่าว ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้าง Item โดยใช้คลาสตัวช่วยของ IndexingItemBuilder

ListTraversalSample.java
// Url is required. Use google.com as a placeholder for this sample.
String viewUrl = "https://www.google.com";

// Version is required, set to current timestamp.
byte[] version = Longs.toByteArray(System.currentTimeMillis());

// Set metadata hash so queue can detect changes
String metadataHash = this.calculateMetadataHash(documentId);

// Using the SDK item builder class to create the document with
// appropriate attributes. This can be expanded to include metadata
// fields etc.
Item item = IndexingItemBuilder.fromConfiguration(Integer.toString(documentId))
    .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
    .setAcl(acl)
    .setSourceRepositoryUrl(IndexingItemBuilder.FieldOrValue.withValue(viewUrl))
    .setVersion(version)
    .setHash(metadataHash)
    .build();

สร้างรายการที่จัดทำดัชนีได้

เมื่อคุณตั้งค่าข้อมูลเมตาสำหรับรายการแล้ว คุณสามารถสร้างรายการจริงที่จัดทำดัชนีได้โดยใช้ RepositoryDoc.Builder ตัวอย่างต่อไปนี้แสดงวิธีสร้างรายการเดี่ยวที่จัดทำดัชนีได้

ListTraversalSample.java
// For this sample, content is just plain text
String content = String.format("Hello world from sample doc %d", documentId);
ByteArrayContent byteContent = ByteArrayContent.fromString("text/plain", content);

// Create the fully formed document
RepositoryDoc doc = new RepositoryDoc.Builder()
    .setItem(item)
    .setContent(byteContent, IndexingService.ContentFormat.TEXT)
    .build();

RepositoryDoc คือ ApiOperation ประเภทหนึ่งที่ดำเนินการตามคำขอ IndexingService.indexItem() ที่แท้จริง

นอกจากนี้ คุณยังใช้เมธอด setRequestMode() ของคลาส RepositoryDoc.Builder เพื่อระบุคำขอการจัดทำดัชนีเป็น ASYNCHRONOUS หรือ SYNCHRONOUS ได้ด้วย โดยทำดังนี้

ASYNCHRONOUS
โหมดอะซิงโครนัสทำให้เกิดความล่าช้าในการจัดทำดัชนีเพื่อแสดงและรองรับโควต้าอัตราการส่งข้อมูลจำนวนมากสำหรับคำขอจัดทำดัชนี เราขอแนะนำโหมดอะซิงโครนัสสำหรับการจัดทำดัชนีเริ่มต้น (โฆษณาทดแทน) ของที่เก็บทั้งหมด
SYNCHRONOUS
โหมดซิงโครนัสทำให้เวลาในการตอบสนองสำหรับการจัดทำดัชนีเพื่อแสดงโฆษณาสั้นลง และรองรับโควต้าอัตราการส่งข้อมูลที่จำกัด เราขอแนะนำโหมดซิงโครนัสสำหรับการจัดทำดัชนีการอัปเดตและการเปลี่ยนแปลงที่เก็บ หากไม่ระบุ โหมดคำขอจะมีค่าเริ่มต้นเป็น SYNCHRONOUS

ขั้นตอนถัดไป

ขั้นตอนถัดไปที่ทำได้มีดังนี้

สร้างเครื่องมือเชื่อมต่อการข้ามผ่านกราฟโดยใช้คลาสเทมเพลต

คิวการจัดทำดัชนีของ Cloud Search จะใช้เพื่อเก็บรหัสและค่าแฮชที่ไม่บังคับสำหรับแต่ละรายการในที่เก็บ เครื่องมือเชื่อมต่อการข้ามผ่านกราฟจะพุชรหัสรายการไปยังคิวการจัดทำดัชนีของ Google Cloud Search และเรียกข้อมูลทีละรายการสำหรับการจัดทำดัชนี Google Cloud Search จะเก็บคิวและเปรียบเทียบเนื้อหาของคิวเพื่อระบุสถานะของรายการ เช่น มีการลบรายการออกจากที่เก็บหรือไม่ ดูข้อมูลเพิ่มเติมเกี่ยวกับคิวการจัดทำดัชนีของ Cloud Search ได้ที่คิวการจัดทำดัชนีของ Google Cloud Search

ในระหว่างดัชนี ระบบจะดึงเนื้อหาของรายการจากที่เก็บข้อมูล และจะมีการพุชรหัสรายการย่อยไปยังคิว เครื่องมือเชื่อมต่อจะประมวลผลรหัสหลักและย่อยซ้ำจนกว่าจะจัดการรายการทั้งหมด

เอกสารส่วนนี้หมายถึงข้อมูลโค้ดจากตัวอย่าง GraphTraversalSample

ใช้งานจุดแรกเข้าของเครื่องมือเชื่อมต่อ

จุดแรกเข้าของเครื่องมือเชื่อมต่อคือเมธอด main() งานหลักของเมธอดนี้คือการสร้างอินสแตนซ์ของคลาส Application และเรียกใช้เมธอด start() เพื่อเรียกใช้เครื่องมือเชื่อมต่อ

ก่อนเรียกใช้ application.start() ให้ใช้คลาส IndexingApplication.Builder เพื่อสร้างเทมเพลต ListingConnector ListingConnector ยอมรับออบเจ็กต์ Repository ที่มีเมธอดที่คุณใช้

ข้อมูลโค้ดต่อไปนี้แสดงวิธียืนยัน ListingConnector และ Repository ที่เกี่ยวข้อง

GraphTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a graph
 * traversal connector.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new SampleRepository();
  IndexingConnector connector = new ListingConnector(repository);
  IndexingApplication application = new IndexingApplication.Builder(connector, args).build();
  application.start();
}

SDK จะเรียกใช้เมธอด initConfig() ในเบื้องหลังหลังจากที่เรียกใช้เมธอด main() ของเครื่องมือเชื่อมต่อ Application.build เมธอด initConfig():

  1. เรียกใช้เมธอด Configuation.isInitialized() เพื่อให้มั่นใจว่า Configuration ยังไม่ได้เริ่มต้น
  2. เริ่มต้นออบเจ็กต์ Configuration ด้วยคู่คีย์-ค่าที่ Google จัดหา คู่คีย์-ค่าแต่ละคู่จะเก็บไว้ในออบเจ็กต์ ConfigValue ภายในออบเจ็กต์ Configuration

ใช้อินเทอร์เฟซ Repository

วัตถุประสงค์เพียงอย่างเดียวของออบเจ็กต์ Repository คือเพื่อดำเนินการข้ามผ่านและการจัดทำดัชนีรายการที่เก็บ เมื่อใช้เทมเพลต คุณต้องลบล้างเมธอดภายในอินเทอร์เฟซ Repository เท่านั้นเพื่อสร้างเครื่องมือเชื่อมต่อเนื้อหา วิธีการที่คุณลบล้างจะขึ้นอยู่กับเทมเพลตและกลยุทธ์การข้ามผ่านที่คุณใช้ สำหรับ ListingConnector คุณจะลบล้างเมธอดต่อไปนี้

  • เมธอด init() หากต้องการดำเนินการตั้งค่าและเริ่มต้นพื้นที่เก็บข้อมูล ให้ลบล้างเมธอด init()

  • เมธอด getIds() หากต้องการเรียกข้อมูลรหัสและค่าแฮชสำหรับระเบียนทั้งหมดในที่เก็บ ให้ลบล้างเมธอด getIds()

  • เมธอด getDoc() หากต้องการเพิ่มรายการใหม่ อัปเดต แก้ไข หรือลบรายการออกจากดัชนี ให้ลบล้างเมธอด getDoc()

  • (ไม่บังคับ) เมธอด getChanges() หากที่เก็บรองรับการตรวจหาการเปลี่ยนแปลง ให้ลบล้างเมธอด getChanges() ระบบจะเรียกวิธีนี้เพียงครั้งเดียวสำหรับการข้ามผ่านส่วนเพิ่มตามกำหนดการแต่ละรายการ (ตามที่กำหนดโดยการกำหนดค่า) เพื่อเรียกข้อมูลรายการที่แก้ไขและจัดทำดัชนี

  • (ไม่บังคับ) เมธอด close() หากต้องการล้างข้อมูลที่เก็บ ให้ลบล้างเมธอด close() ระบบจะเรียกวิธีนี้เพียงครั้งเดียวระหว่างการปิดเครื่องเชื่อมต่อ

เมธอดของออบเจ็กต์ Repository แต่ละรายการจะแสดงออบเจ็กต์ ApiOperation บางประเภท ออบเจ็กต์ ApiOperation จะดำเนินการในรูปแบบของการเรียก IndexingService.indexItem() รายการเดียวหรือหลายรายการให้จัดทำดัชนีที่เก็บจริง

รับพารามิเตอร์การกำหนดค่าที่กำหนดเอง

คุณจะต้องรับพารามิเตอร์ที่กำหนดเองจากออบเจ็กต์ Configuration เพื่อให้สอดคล้องกับการกำหนดค่าของเครื่องมือเชื่อมต่อ โดยปกติงานนี้จะทำในเมธอด init() ของชั้นเรียน Repository

คลาส Configuration มีหลายวิธีในการรับข้อมูลประเภทต่างๆ จากการกำหนดค่า แต่ละวิธีจะแสดงผลออบเจ็กต์ ConfigValue จากนั้นจะใช้เมธอด get() ของออบเจ็กต์ ConfigValue เพื่อดึงค่าจริง ข้อมูลโค้ดจาก FullTraversalSample ต่อไปนี้แสดงวิธีดึงค่าจำนวนเต็มที่กำหนดเองค่าเดียวจากออบเจ็กต์ Configuration

FullTraversalSample.java
@Override
public void init(RepositoryContext context) {
  log.info("Initializing repository");
  numberOfDocuments = Configuration.getInteger("sample.documentCount", 10).get();
}

หากต้องการรับและแยกวิเคราะห์พารามิเตอร์ที่มีหลายค่า ให้ใช้โปรแกรมแยกวิเคราะห์ประเภท Configuration ประเภทใดประเภทหนึ่งเพื่อแยกวิเคราะห์ข้อมูลเป็นกลุ่มที่ไม่ต่อเนื่อง ข้อมูลโค้ดจากเครื่องมือเชื่อมต่อบทแนะนำจะใช้เมธอด getMultiValue เพื่อรับชื่อที่เก็บ GitHub แบบรายการ

GithubRepository.java
ConfigValue<List<String>> repos = Configuration.getMultiValue(
    "github.repos",
    Collections.emptyList(),
    Configuration.STRING_PARSER);

ทำการส่งผ่านกราฟ

ลบล้างเมธอด getIds() เพื่อเรียกข้อมูลรหัสและค่าแฮชสำหรับระเบียนทั้งหมดในที่เก็บ เมธอด getIds() ยอมรับจุดเช็คพอยท์ ระบบจะใช้จุดตรวจสอบเพื่อกลับไปจัดทำดัชนีที่รายการที่เจาะจงต่อหากกระบวนการหยุดชะงัก

จากนั้น ลบล้างเมธอด getDoc() เพื่อจัดการแต่ละรายการในคิวการจัดทำดัชนีของ Cloud Search

รหัสสินค้าพุชและค่าแฮช

ลบล้าง getIds() เพื่อดึงข้อมูลรหัสสินค้าและค่าแฮชเนื้อหาที่เชื่อมโยงจากที่เก็บ จากนั้นระบบจะรวมคู่รหัสและค่าแฮชไว้ในคำขอการดำเนินการพุชไปยังคิวการจัดทำดัชนีของ Cloud Search โดยทั่วไปแล้ว ระบบจะพุชรหัสรูทหรือรหัสหลักก่อน ตามด้วยรหัสย่อยจนกว่าจะประมวลผลรายการทั้งลำดับชั้นแล้ว

เมธอด getIds() จะยอมรับจุดเช็คพอยท์ที่แสดงรายการสุดท้ายที่จะจัดทำดัชนี คุณจะใช้จุดตรวจสอบเพื่อดำเนินการจัดทำดัชนีต่อที่รายการเฉพาะได้ หากกระบวนการหยุดชะงัก สำหรับแต่ละรายการในที่เก็บ ให้ทำตามขั้นตอนต่อไปนี้ในเมธอด getIds()

  • รับรหัสรายการแต่ละรายการและค่าแฮชที่เกี่ยวข้องจากที่เก็บ
  • จัดคู่รหัสและค่าแฮชแต่ละรายการเป็น PushItems
  • รวม PushItems แต่ละรายการเป็นตัวทำซ้ำ ซึ่งแสดงผลโดยเมธอด getIds() โปรดทราบว่าจริงๆ แล้ว getIds() จะแสดงผล CheckpointCloseableIterable ซึ่งเป็นการทำซ้ำออบเจ็กต์ ApiOperation โดยแต่ละออบเจ็กต์จะแสดงคำขอ API ที่ดำเนินการใน RepositoryDoc เช่น พุชรายการไปยังคิว

ข้อมูลโค้ดต่อไปนี้แสดงวิธีรับรหัสสินค้าและค่าแฮชแต่ละรายการ แล้วแทรกลงใน PushItems PushItems เป็นคำขอ ApiOperation เพื่อพุชรายการไปยังคิวการจัดทำดัชนีของ Cloud Search

GraphTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);

ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้คลาส PushItems.Builder เพื่อรวมรหัสและค่าแฮชไว้ในพุช ApiOperation เพียงครั้งเดียว

GraphTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();

ระบบจะพุชรายการไปยังคิวการจัดทำดัชนีของ Cloud Search เพื่อประมวลผลต่อไป

ดึงข้อมูลและจัดการแต่ละรายการ

ลบล้าง getDoc() เพื่อจัดการแต่ละรายการในคิวการจัดทำดัชนีของ Cloud Search รายการอาจเป็นรายการใหม่ แก้ไข ไม่เปลี่ยนแปลง หรือไม่มีอยู่ในที่เก็บต้นทางอีกต่อไป ดึงข้อมูลและจัดทำดัชนีแต่ละรายการที่เป็นรายการใหม่หรือที่มีการแก้ไข นำรายการออกจากดัชนีที่ไม่มีอยู่ในที่เก็บต้นทางแล้ว

เมธอด getDoc() จะยอมรับรายการจากคิวการจัดทำดัชนีของ Cloud Search สำหรับแต่ละรายการในคิว ให้ทำตามขั้นตอนต่อไปนี้ในเมธอด getDoc()

  1. ตรวจสอบว่ามีรหัสของรายการนั้นในคิวการจัดทำดัชนีของ Cloud Search ในที่เก็บหรือไม่ หากไม่ ให้ลบรายการออกจากดัชนี หากมีรายการดังกล่าวอยู่ ให้ดำเนินขั้นตอนถัดไป

  2. ดัชนีมีการเปลี่ยนแปลงหรือรายการใหม่:

    1. ตั้งค่าสิทธิ์
    2. ตั้งค่าข้อมูลเมตาสำหรับรายการที่คุณกำลังจัดทำดัชนี
    3. รวมข้อมูลเมตาและรายการลงในไฟล์เดียวที่จัดทำดัชนีได้ RepositoryDoc
    4. วางรหัสย่อยในคิวการจัดทำดัชนีของ Cloud Search เพื่อประมวลผลเพิ่มเติม
    5. ส่งคืน RepositoryDoc

จัดการรายการที่ลบไปแล้ว

ข้อมูลโค้ดต่อไปนี้แสดงวิธีตรวจสอบว่ารายการอยู่ในดัชนีหรือไม่ หรือไม่ให้ลบออก

GraphTraversalSample.java
String resourceName = item.getName();
if (documentExists(resourceName)) {
  return buildDocumentAndChildren(resourceName);
}
// Document doesn't exist, delete it
log.info(() -> String.format("Deleting document %s", resourceName));
return ApiOperations.deleteItem(resourceName);

ตั้งค่าสิทธิ์สำหรับรายการ

ที่เก็บของคุณใช้รายการควบคุมการเข้าถึง (ACL) เพื่อระบุผู้ใช้หรือกลุ่มที่มีสิทธิ์เข้าถึงรายการ ACL คือรายการรหัสของกลุ่มหรือผู้ใช้ที่เข้าถึงรายการดังกล่าวได้

คุณต้องทำสำเนา ACL ที่ที่เก็บของคุณใช้เพื่อให้แน่ใจว่ามีเพียงผู้ใช้ที่มีสิทธิ์เข้าถึงรายการเท่านั้นที่สามารถดูรายการนั้นในผลการค้นหา คุณต้องระบุ ACL ของรายการเมื่อจัดทำดัชนีรายการเพื่อให้ Google Cloud Search มีข้อมูลที่จำเป็นในการให้ระดับการเข้าถึงรายการที่ถูกต้อง

Content Connector SDK มีชุดคลาสและเมธอด ACL ที่หลากหลายเพื่อสร้างโมเดล ACL ของที่เก็บส่วนใหญ่ คุณต้องวิเคราะห์ ACL สำหรับแต่ละรายการในที่เก็บ และสร้าง ACL ที่เกี่ยวข้องสำหรับ Google Cloud Search เมื่อคุณจัดทำดัชนีรายการ หาก ACL ของที่เก็บใช้แนวคิดต่างๆ เช่น การสืบทอด ACL การสร้างโมเดลที่ ACL อาจเป็นเรื่องยาก ดูข้อมูลเพิ่มเติมเกี่ยวกับ ACL ของ Google Cloud Search ได้ที่ ACL ของ Google Cloud Search

หมายเหตุ: Cloud Search Indexing API รองรับ ACL แบบโดเมนเดียว ไม่รองรับ ACL ข้ามโดเมน ใช้คลาส Acl.Builder เพื่อตั้งค่าการเข้าถึงแต่ละรายการโดยใช้ ACL ข้อมูลโค้ดต่อไปนี้นำมาจากตัวอย่างการส่งผ่านทั้งหมด ทำให้ผู้ใช้หรือ "ผู้ใช้หลัก" ทั้งหมด (getCustomerPrincipal()) เป็น "ผู้อ่าน" ของรายการทั้งหมด (.setReaders()) เมื่อทำการค้นหา

FullTraversalSample.java
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

คุณต้องทำความเข้าใจ ACL เพื่อสร้างโมเดล ACL สำหรับที่เก็บอย่างถูกต้อง เช่น คุณอาจกำลังจัดทำดัชนีไฟล์ภายในระบบไฟล์ที่ใช้โมเดลการรับค่าบางประเภทที่โฟลเดอร์ย่อยจะรับค่าสิทธิ์จากโฟลเดอร์หลัก การสร้างแบบจำลองการสืบทอด ACL ต้องมีข้อมูลเพิ่มเติมที่ครอบคลุมใน ACL ของ Google Cloud Search

ตั้งค่าข้อมูลเมตาสำหรับรายการ

ระบบจะจัดเก็บข้อมูลเมตาไว้ในออบเจ็กต์ Item หากต้องการสร้าง Item คุณต้องมีรหัสสตริงที่ไม่ซ้ำกัน, ประเภทรายการ, ACL, URL และเวอร์ชันขั้นต่ำของสินค้าดังกล่าว ข้อมูลโค้ดต่อไปนี้แสดงวิธีสร้าง Item โดยใช้คลาสตัวช่วยของ IndexingItemBuilder

GraphTraversalSample.java
// Url is required. Use google.com as a placeholder for this sample.
String viewUrl = "https://www.google.com";

// Version is required, set to current timestamp.
byte[] version = Longs.toByteArray(System.currentTimeMillis());

// Using the SDK item builder class to create the document with
// appropriate attributes. This can be expanded to include metadata
// fields etc.
Item item = IndexingItemBuilder.fromConfiguration(documentId)
    .setItemType(IndexingItemBuilder.ItemType.CONTENT_ITEM)
    .setAcl(acl)
    .setSourceRepositoryUrl(IndexingItemBuilder.FieldOrValue.withValue(viewUrl))
    .setVersion(version)
    .build();

สร้างรายการที่จัดทำดัชนีได้

เมื่อคุณตั้งค่าข้อมูลเมตาสำหรับรายการแล้ว คุณสามารถสร้างรายการจริงที่จัดทำดัชนีได้โดยใช้ RepositoryDoc.Builder ตัวอย่างต่อไปนี้แสดงวิธีสร้างรายการเดี่ยวที่จัดทำดัชนีได้

GraphTraversalSample.java
// For this sample, content is just plain text
String content = String.format("Hello world from sample doc %s", documentId);
ByteArrayContent byteContent = ByteArrayContent.fromString("text/plain", content);

RepositoryDoc.Builder docBuilder = new RepositoryDoc.Builder()
    .setItem(item)
    .setContent(byteContent, IndexingService.ContentFormat.TEXT);

RepositoryDoc เป็น ApiOperation ประเภทหนึ่งที่ดำเนินการตามคำขอ IndexingService.indexItem() จริง

นอกจากนี้ คุณยังใช้เมธอด setRequestMode() ของคลาส RepositoryDoc.Builder เพื่อระบุคำขอการจัดทำดัชนีเป็น ASYNCHRONOUS หรือ SYNCHRONOUS ได้ด้วย โดยทำดังนี้

ASYNCHRONOUS
โหมดอะซิงโครนัสทำให้เกิดความล่าช้าในการจัดทำดัชนีเพื่อแสดงและรองรับโควต้าอัตราการส่งข้อมูลจำนวนมากสำหรับคำขอจัดทำดัชนี เราขอแนะนำโหมดอะซิงโครนัสสำหรับการจัดทำดัชนีเริ่มต้น (โฆษณาทดแทน) ของที่เก็บทั้งหมด
SYNCHRONOUS
โหมดซิงโครนัสทำให้เวลาในการตอบสนองสำหรับการจัดทำดัชนีเพื่อแสดงโฆษณาสั้นลง และรองรับโควต้าอัตราการส่งข้อมูลที่จำกัด เราขอแนะนำโหมดซิงโครนัสสำหรับการจัดทำดัชนีการอัปเดตและการเปลี่ยนแปลงที่เก็บ หากไม่ระบุ โหมดคำขอจะมีค่าเริ่มต้นเป็น SYNCHRONOUS

วางรหัสย่อยในคิวการจัดทำดัชนีของ Cloud Search

ข้อมูลโค้ดต่อไปนี้แสดงวิธีรวมรหัสย่อยไว้ในคิวสำหรับการประมวลผล สำหรับรายการหลักที่กำลังประมวลผลอยู่ รหัสเหล่านี้จะได้รับการประมวลผลหลังจากจัดทำดัชนีรายการระดับบนสุดแล้ว

GraphTraversalSample.java
// Queue the child nodes to visit after indexing this document
Set<String> childIds = getChildItemNames(documentId);
for (String id : childIds) {
  log.info(() -> String.format("Pushing child node %s", id));
  PushItem pushItem = new PushItem();
  docBuilder.addChildId(id, pushItem);
}

RepositoryDoc doc = docBuilder.build();

ขั้นตอนถัดไป

ขั้นตอนถัดไปที่ทำได้มีดังนี้

สร้างเครื่องมือเชื่อมต่อเนื้อหาโดยใช้ REST API

ส่วนต่อไปนี้จะอธิบายวิธีสร้างเครื่องมือเชื่อมต่อเนื้อหาโดยใช้ REST API

กำหนดกลยุทธ์การข้ามผ่าน

ฟังก์ชันหลักของเครื่องมือเชื่อมต่อเนื้อหาคือข้ามผ่านที่เก็บและจัดทำดัชนีข้อมูล คุณต้องใช้กลยุทธ์การข้ามผ่านตามขนาดและการจัดวางข้อมูลในที่เก็บ กลยุทธ์การส่งผ่าน ที่ใช้กันมากที่สุด 3 แบบมีดังนี้

กลยุทธ์การข้ามผ่านเต็มรูปแบบ

กลยุทธ์การข้ามผ่านแบบเต็มรูปแบบจะสแกนที่เก็บทั้งหมดและจัดทำดัชนีรายการทั้งหมด กลยุทธ์นี้มักใช้เมื่อคุณมีที่เก็บขนาดเล็กและมีค่าใช้จ่ายในการดำเนินการข้ามผ่านทั้งหมดทุกครั้งที่จัดทำดัชนี

กลยุทธ์การข้ามผ่านนี้เหมาะสำหรับที่เก็บขนาดเล็กที่มีข้อมูลส่วนใหญ่คงที่และไม่มีลำดับชั้น คุณอาจใช้กลยุทธ์การข้ามผ่านนี้เมื่อการตรวจจับการเปลี่ยนแปลงทำได้ยากหรือที่ที่เก็บไม่รองรับ

กลยุทธ์การส่งผ่านรายการ

กลยุทธ์การข้ามผ่านรายการจะสแกนที่เก็บทั้งหมด รวมถึงโหนดย่อยทั้งหมด เพื่อกำหนดสถานะของแต่ละรายการ จากนั้นเครื่องมือเชื่อมต่อจะทำการข้ามครั้งที่ 2 และจัดทำดัชนีเฉพาะรายการใหม่หรือที่มีการอัปเดตหลังจากการจัดทำดัชนีครั้งล่าสุด กลยุทธ์นี้มักใช้ในการอัปเดตดัชนีที่มีอยู่ทีละน้อย (แทนที่จะต้องทำการข้ามผ่านแบบสมบูรณ์ทุกครั้งที่คุณอัปเดตดัชนี)

กลยุทธ์การข้ามผ่านนี้เหมาะกับกรณีที่ที่เก็บการเปลี่ยนแปลงทำได้ยากหรือไม่รองรับ คุณมีข้อมูลที่ไม่ใช่ลำดับชั้น และใช้กับชุดข้อมูลขนาดใหญ่มาก

การส่งผ่านกราฟ

กลยุทธ์การข้ามผ่านกราฟจะสแกนโหนดระดับบนสุดทั้งโหนดเพื่อกำหนดสถานะของแต่ละรายการ จากนั้นเครื่องมือเชื่อมต่อจะรับการส่งครั้งที่ 2 และจัดทำดัชนีเฉพาะรายการในโหนดรากซึ่งเป็นรายการใหม่หรือได้รับการอัปเดตตั้งแต่การจัดทำดัชนีครั้งล่าสุด สุดท้าย เครื่องมือเชื่อมต่อจะส่งรหัสย่อยแล้วจัดทำดัชนีรายการในโหนดย่อยที่เป็นรายการใหม่หรือได้รับการอัปเดต เครื่องมือเชื่อมต่อจะเรียนรู้ไปเรื่อยๆ ผ่านโหนดย่อยทั้งหมดจนกว่าจะจัดการได้ครบทั้งหมดแล้ว โดยทั่วไปแล้วการข้ามผ่านดังกล่าวจะใช้สำหรับที่เก็บแบบลำดับชั้นซึ่งการแสดงรหัสทั้งหมดไม่ได้ใช้งานได้จริง

กลยุทธ์นี้เหมาะสำหรับหากคุณมีข้อมูลตามลำดับชั้นที่ต้องมีการรวบรวมข้อมูล เช่น ไดเรกทอรีซีรีส์หรือหน้าเว็บ

ใช้กลยุทธ์การส่งผ่านและรายการดัชนี

องค์ประกอบทั้งหมดที่จัดทำดัชนีได้สำหรับ Cloud Search จะเรียกว่ารายการใน Cloud Search API รายการอาจเป็นไฟล์ โฟลเดอร์ บรรทัดในไฟล์ CSV หรือระเบียนฐานข้อมูล

เมื่อลงทะเบียนสคีมาแล้ว คุณจะป้อนข้อมูลดัชนีได้โดยทำดังนี้

  1. (ไม่บังคับ) การใช้ items.upload เพื่ออัปโหลดไฟล์ที่มีขนาดใหญ่กว่า 100KiB สำหรับการจัดทำดัชนี สำหรับไฟล์ขนาดเล็ก ให้ฝังเนื้อหาเป็น inlineContent โดยใช้ items.index

  2. (ไม่บังคับ) การใช้ media.upload เพื่ออัปโหลดไฟล์สื่อสำหรับการจัดทำดัชนี

  3. กำลังใช้ items.index เพื่อจัดทำดัชนีรายการ เช่น หากสคีมาใช้คำจำกัดความของออบเจ็กต์ในสคีมาภาพยนตร์ คำขอจัดทำดัชนีสำหรับรายการเดียวจะมีลักษณะดังนี้

    {
      "name": "datasource/<data_source_id>/items/titanic",
      "acl": {
        "readers": [
          {
            "gsuitePrincipal": {
              "gsuiteDomain": true
            }
          }
        ]
      },
      "metadata": {
        "title": "Titanic",
        "viewUrl": "http://www.imdb.com/title/tt2234155/?ref_=nv_sr_1",
        "objectType": "movie"
      },
      "structuredData": {
        "object": {
          "properties": [
            {
              "name": "movieTitle",
              "textValues": {
                "values": [
                  "Titanic"
                ]
              }
            },
            {
              "name": "releaseDate",
              "dateValues": {
                "values": [
                  {
                    "year": 1997,
                    "month": 12,
                    "day": 19
                  }
                ]
              }
            },
            {
              "name": "actorName",
              "textValues": {
                "values": [
                  "Leonardo DiCaprio",
                  "Kate Winslet",
                  "Billy Zane"
                ]
              }
            },
            {
              "name": "genre",
              "enumValues": {
                "values": [
                  "Drama",
                  "Action"
                ]
              }
            },
            {
              "name": "userRating",
              "integerValues": {
                "values": [
                  8
                ]
              }
            },
            {
              "name": "mpaaRating",
              "textValues": {
                "values": [
                  "PG-13"
                ]
              }
            },
            {
              "name": "duration",
              "textValues": {
                "values": [
                  "3 h 14 min"
                ]
              }
            }
          ]
        }
      },
      "content": {
        "inlineContent": "A seventeen-year-old aristocrat falls in love with a kind but poor artist aboard the luxurious, ill-fated R.M.S. Titanic.",
        "contentFormat": "TEXT"
      },
      "version": "01",
      "itemType": "CONTENT_ITEM"
    }
    
  4. (ไม่บังคับ) การใช้การเรียก items.get เพื่อยืนยันว่าสินค้าได้รับการจัดทำดัชนีแล้ว

ในการดำเนินการข้ามผ่านโดยสมบูรณ์ คุณจะต้องจัดทำดัชนีที่เก็บทั้งหมดใหม่เป็นระยะๆ หากต้องการดำเนินการข้ามผ่านรายการหรือกราฟ คุณต้องติดตั้งโค้ดเพื่อจัดการการเปลี่ยนแปลงที่เก็บ

จัดการการเปลี่ยนแปลงที่เก็บ

คุณจะรวบรวมและจัดทำดัชนีแต่ละรายการจากที่เก็บเป็นระยะๆ เพื่อจัดทำดัชนีอย่างเต็มรูปแบบ แม้ว่าจะมีประสิทธิภาพในการทำให้ดัชนีของคุณเป็นเวอร์ชันล่าสุด แต่การจัดทำดัชนีแบบเต็มอาจมีค่าใช้จ่ายสูงเมื่อต้องจัดการกับที่เก็บขนาดใหญ่หรือมีลำดับชั้น

คุณยังใช้คิวการจัดทำดัชนีของ Google Cloud เป็นกลไกในการติดตามการเปลี่ยนแปลงและจัดทำดัชนีเฉพาะรายการที่มีการเปลี่ยนแปลงได้อีกด้วย แทนที่จะใช้การเรียกดัชนีเพื่อจัดทำดัชนีที่เก็บทั้งหมดบ่อยๆ คุณสามารถใช้คำขอ items.push เพื่อพุชรายการลงในคิวสำหรับการสำรวจและการอัปเดตในภายหลัง ดูข้อมูลเพิ่มเติมเกี่ยวกับคิวการจัดทำดัชนีของ Google Cloud ได้ที่คิวการจัดทำดัชนีของ Google Cloud

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Cloud Search API ได้ที่ Cloud Search API