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

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

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

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

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

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

ตั้งค่าทรัพยากร 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 และจัดทำดัชนีรายการ ในโหนดรากเท่านั้นเป็นรายการใหม่หรือได้รับการอัปเดตตั้งแต่การจัดทำดัชนีครั้งล่าสุด สุดท้าย เครื่องมือเชื่อมต่อจะส่งผ่านรหัสย่อย จากนั้นจึงจัดทำดัชนีรายการในโหนดย่อยที่เป็นรายการใหม่หรือได้รับการอัปเดตแล้ว เครื่องมือเชื่อมต่อจะดำเนินต่อไปเรื่อยๆ ผ่านโหนดย่อยทั้งหมดจนกว่าจะแก้ไขปัญหาทุกรายการแล้ว โดยทั่วไปแล้ว การข้ามผ่านดังกล่าวมักใช้สำหรับที่เก็บแบบลำดับชั้นโดยที่รายการรหัสทั้งหมดไม่สามารถทำได้จริง

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

กลยุทธ์การข้ามผ่านเหล่านี้แต่ละรายการนำมาใช้โดยคลาสเครื่องมือเชื่อมต่อเทมเพลตใน 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() ระบบจะเรียกเมธอดนี้ 1 ครั้งสำหรับการข้ามผ่านตามกำหนดการแต่ละครั้ง (ตามที่กำหนดโดยการกำหนดค่า)

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

  • (ไม่บังคับ) เมธอด 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 มีข้อมูลที่จำเป็นในการให้ระดับการเข้าถึงที่ถูกต้องสำหรับรายการ

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

หมายเหตุ: Cloud SearchIndexing 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 จะดำเนินการเรียกใช้การจัดทำดัชนีแต่ละรายการภายในตัววนซ้ำ

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

ขั้นตอนถัดไป 2-3 อย่างที่คุณอาจดำเนินการมีดังนี้

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

ระบบจะใช้คิวการจัดทำดัชนีของ 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() ระบบจะเรียกใช้เมธอดนี้ 1 ครั้งสำหรับการส่งผ่านเพิ่มที่ตั้งเวลาไว้แต่ละรายการ (ตามที่กำหนดโดยการกำหนดค่า) เพื่อเรียกรายการที่แก้ไขและจัดทำดัชนี

  • (ไม่บังคับ) เมธอด 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 มีข้อมูลที่จำเป็นในการให้ระดับการเข้าถึงที่ถูกต้องสำหรับรายการ

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

หมายเหตุ: Cloud SearchIndexing 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

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

ขั้นตอนถัดไป 2-3 อย่างที่คุณอาจดำเนินการมีดังนี้

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

ระบบจะใช้คิวการจัดทำดัชนีของ 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() ระบบจะเรียกใช้เมธอดนี้ 1 ครั้งสำหรับการส่งผ่านเพิ่มที่ตั้งเวลาไว้แต่ละรายการ (ตามที่กำหนดโดยการกำหนดค่า) เพื่อเรียกรายการที่แก้ไขและจัดทำดัชนี

  • (ไม่บังคับ) เมธอด 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 มีข้อมูลที่จำเป็นในการให้ระดับการเข้าถึงที่ถูกต้องสำหรับรายการ

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

หมายเหตุ: Cloud SearchIndexing 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();

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

ขั้นตอนถัดไป 2-3 อย่างที่คุณอาจดำเนินการมีดังนี้

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

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

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

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

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

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

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

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

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

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

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

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

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

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

องค์ประกอบทั้งหมดที่จัดทำดัชนีได้สำหรับ 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