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

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

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

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

โดยทั่วไปแล้ว ตัวเชื่อมต่อเนื้อหาจะทำงานต่อไปนี้

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

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

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

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

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

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 เช่น ชุดไดเรกทอรีหรือหน้าเว็บ

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

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

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

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

คลาส 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 คุณต้องมี สตริงที่ไม่ซ้ำกันอย่างน้อย 1 รายการ, ประเภทรายการ, 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 จะเรียกใช้การเรียกดัชนีแต่ละครั้งที่อยู่ใน Iterator

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ใช้กลยุทธ์การข้ามและการจัดทำดัชนีรายการ

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

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

  1. (ไม่บังคับ) ใช้ items.upload เพื่ออัปโหลดไฟล์ที่มีขนาดใหญ่กว่า 100 KiB สำหรับการจัดทำดัชนี สำหรับไฟล์ขนาดเล็ก ให้ฝังเนื้อหาเป็น 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