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

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

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

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

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

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

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

รวมทรัพยากร Dependency เหล่านี้ไว้ในไฟล์บิลด์

Maven

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

Gradle

groovy 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 จัดหาให้สำหรับเครื่องมือเชื่อมต่อทั้งหมด คุณต้องประกาศสิ่งต่อไปนี้ในไฟล์การกำหนดค่า

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

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

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

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

ตั้งค่าพร็อพเพอร์ตี้ระบบ config เพื่อส่งไฟล์การกำหนดค่า ใช้-D อาร์กิวเมนต์เมื่อเริ่มตัวเชื่อมต่อ เช่น

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

หากไม่ระบุอาร์กิวเมนต์นี้ SDK จะพยายามใช้ไฟล์ชื่อ connector-config.properties ในไดเรกทอรีภายใน

กำหนดกลยุทธ์การไปยังส่วนต่างๆ

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

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

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

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

ส่วนนี้อ้างอิงถึงโค้ดจาก FullTraversalSample

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

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

ก่อนเรียกใช้ application.start() ให้ใช้คลาส IndexingApplication.Builder เพื่อสร้างอินสแตนซ์ของเทมเพลต FullTraversalConnector เทมเพลตนี้ยอมรับออบเจ็กต์ Repository

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. ตรวจสอบว่า Configuration ยังไม่ได้เริ่มต้น
  2. เริ่มต้นออบเจ็กต์ Configuration ด้วยคู่คีย์-ค่าที่ Google จัดหาให้

ใช้การติดตั้งใช้งานอินเทอร์เฟซที่เก็บ

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

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

แต่ละเมธอดจะแสดงออบเจ็กต์ ApiOperation ซึ่งทําการจัดทําดัชนีโดยใช้ IndexingService.indexItem()

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

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

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

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

  1. ตั้งค่าสิทธิ์
  2. ตั้งค่าข้อมูลเมตา
  3. รวมเป็นRepositoryDoc
  4. แพ็กเกจแต่ละรายการลงในตัววนซ้ำที่ getAllDocs() ส่งคืน

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

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

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

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

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

ใช้คลาส Acl.Builder เพื่อตั้งค่าการเข้าถึง ข้อมูลโค้ดนี้จากตัวอย่างการข้ามทั้งหมดช่วยให้ผู้ใช้ในโดเมนทั้งหมด (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 ของ Cloud Search

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

ระบบจะจัดเก็บข้อมูลเมตาไว้ในออบเจ็กต์ Item หากต้องการสร้าง Item คุณต้องมี ID, ประเภทรายการ, ACL, URL และเวอร์ชันที่ไม่ซ้ำกัน ใช้คลาสตัวช่วย 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() จะแสดงผล CheckpointCloseableIterable ของออบเจ็กต์ RepositoryDoc ใช้ CheckpointCloseableIterableImpl.Builder ชั้นเรียน

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

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

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

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

ส่วนนี้อ้างอิงถึง ListTraversalSample

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

main() เมธอดจะสร้างอินสแตนซ์ Application และเรียกใช้ start() ใช้ IndexingApplication.Builder เพื่อสร้างอินสแตนซ์ของ ListingConnector เทมเพลต

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();
}

ใช้การติดตั้งใช้งานอินเทอร์เฟซที่เก็บ

ลบล้างเมธอดต่อไปนี้สำหรับ ListingConnector

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

ดำเนินการตามรายการ

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

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

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

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 เพื่อจัดแพ็กเกจรหัสและแฮช

ListTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();
return iterator;
เรียกและจัดการแต่ละรายการ

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

  1. ตรวจสอบว่ามีรหัสสินค้าในที่เก็บหรือไม่ หากไม่ถูกต้อง ให้ลบออก
  2. สำรวจดัชนีเพื่อดูสถานะ หากไม่มีการเปลี่ยนแปลง (ACCEPTED) ไม่ต้องดำเนินการใดๆ
  3. รายการที่มีการเปลี่ยนแปลงหรือรายการใหม่: ตั้งค่าสิทธิ์ ตั้งค่าข้อมูลเมตา รวมเป็น RepositoryDoc แล้วส่งคืน
จัดการรายการที่ถูกลบ

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

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);
}
จัดการรายการที่ไม่เปลี่ยนแปลง

สำรวจคิวการจัดทำดัชนีเพื่อจัดการรายการที่ไม่มีการเปลี่ยนแปลง

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 ที่เกี่ยวข้อง สำหรับ Cloud Search ในระหว่างการจัดทำดัชนี การสร้าง ACL ที่ซับซ้อน เช่น ACL ที่ใช้การรับค่า ต้องมีการวางแผนอย่างรอบคอบ ดูข้อมูลเพิ่มเติมได้ที่ ACL ของ Cloud Search

ใช้คลาส Acl.Builder เพื่อตั้งค่าการเข้าถึง ข้อมูลโค้ดนี้จากตัวอย่างการข้ามทั้งหมดช่วยให้ผู้ใช้ในโดเมนทั้งหมด (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 ของ Cloud Search

ตั้งค่าข้อมูลเมตาสำหรับรายการ
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();
สร้างรายการที่จัดทำดัชนีได้
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();

ใช้เมธอด setRequestMode() ของคลาส RepositoryDoc.Builder เพื่อตั้งค่าคำขอจัดทำดัชนีเป็น ASYNCHRONOUS หรือ SYNCHRONOUS ดังนี้

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

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

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

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

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

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

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

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

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

ใช้การติดตั้งใช้งานอินเทอร์เฟซที่เก็บ

ลบล้าง init(), getIds(), getDoc() และอาจลบล้าง getChanges() หรือ close()

ดำเนินการกราฟ

แทนที่ getIds() เพื่อดึงข้อมูลรหัสเริ่มต้นและ getDoc() เพื่อจัดการรายการและ ส่งรหัสย่อยไปยังคิว

ส่งรหัสสินค้าและค่าแฮช
GraphTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);
เรียกและจัดการแต่ละรายการ
  1. ตรวจสอบว่ามีรหัสในที่เก็บหรือไม่ หากไม่ต้องการ ให้ลบรายการออก
  2. สำหรับรายการที่มีอยู่ ให้ตั้งค่าสิทธิ์และข้อมูลเมตา แล้วรวมเข้ากับ RepositoryDoc
  3. ส่งรหัสย่อยไปยังคิวการจัดทำดัชนี
  4. คืน 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);
ตั้งค่าข้อมูลเมตาและสร้างรายการ
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();
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);
วางรหัสย่อยในคิวการจัดทำดัชนี
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

กำหนดกลยุทธ์การไปยังส่วนต่างๆ

กลยุทธ์ (เต็ม รายการ และกราฟ) มีแนวคิดเหมือนกับ SDK ใช้กลยุทธ์ที่เลือกโดยใช้ REST API

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

ลงทะเบียนสคีมา แล้วป้อนข้อมูลดัชนีโดยใช้

  1. (ไม่บังคับ) items.upload สำหรับไฟล์ที่มีขนาดใหญ่กว่า 100 KiB
  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/",
        "objectType": "movie"
      },
      "structuredData": {
        "object": {
          "properties": [
            {
              "name": "movieTitle",
              "textValues": { "values": ["Titanic"] }
            }
          ]
        }
      },
      "content": {
        "inlineContent": "A seventeen-year-old aristocrat falls in love...",
        "contentFormat": "TEXT"
      },
      "version": "01",
      "itemType": "CONTENT_ITEM"
    }
    
  4. (ไม่บังคับ) ใช้ items.get เพื่อยืนยันการจัดทำดัชนี

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

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