إنشاء موصِّل محتوى

موصل المحتوى هو برنامج يتنقّل بين البيانات في مستودع مؤسسة ويملأ مصدر بيانات. توفّر Google الخيارات التالية لتطوير موصّلات المحتوى:

  • حزمة تطوير البرامج (SDK) الخاصة بموصل المحتوى هذا الخيار مناسب لمبرمجي Java. مجموعة تطوير البرامج (SDK) هي برنامج تضمين لواجهة REST API تتيح لك إنشاء موصِّلات بسرعة. لإنشاء موصّل محتوى باستخدام حزمة SDK، راجِع إنشاء موصّل محتوى باستخدام حزمة Content Connector SDK.

  • واجهة برمجة تطبيقات REST منخفضة المستوى أو مكتبات واجهة برمجة التطبيقات استخدِم هذه الخيارات إذا كنت لا تستخدم Java أو إذا كان الرمز البرمجي الخاص بك يتوافق بشكل أفضل مع واجهة برمجة تطبيقات REST أو مكتبة. لإنشاء موصّل محتوى باستخدام REST API، يُرجى الاطّلاع على إنشاء موصّل محتوى باستخدام REST API.

يُجري موصّل المحتوى النموذجي المهام التالية:

  1. تقرأ هذه السمة مَعلمات الإعداد وتعالجها.
  2. يستخرج هذا الموصل أجزاء منفصلة من البيانات القابلة للفهرسة، تُعرف باسم "العناصر"، من المستودع التابع للجهة الخارجية.
  3. يجمع بين قوائم التحكّم بالوصول والبيانات الوصفية وبيانات المحتوى في عناصر قابلة للفهرسة.
  4. يفهرس العناصر في مصدر بيانات Cloud Search.
  5. (اختياري) يستمع إلى إشعارات التغيير من المستودع. يتم تحويل الإشعارات المتعلقة بالتغييرات إلى طلبات فهرسة للحفاظ على مزامنة مصدر بيانات Cloud Search. لا ينفّذ الموصّل هذه المهمة إلا إذا كان المستودع يتيح رصد التغييرات.

إنشاء موصّل محتوى باستخدام Content Connector SDK

توضّح الأقسام التالية كيفية إنشاء أداة ربط محتوى باستخدام حزمة تطوير البرامج (SDK) الخاصة بأداة ربط المحتوى.

إعداد التبعيات

أدرِج هذه التبعيات في ملف الإصدار.

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.

تتضمّن حزمة تطوير البرامج (SDK) في Google Cloud Search مَعلمات مقدَّمة من 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 بين عناصر المستودع ويفهرسها. عند استخدام نموذج، ما عليك سوى إلغاء بعض الطرق في واجهة Repository. بالنسبة إلى FullTraversalConnector، يمكنك إلغاء ما يلي:

  • init(): لإعداد المستودع وتهيئته.
  • getAllDocs(): للتنقّل بين جميع العناصر وفهرستها يتم استدعاء هذه الدالة مرة واحدة لكل عملية اجتياز مجدولة.
  • (اختياري) getChanges(): إذا كان المستودع يتيح رصد التغييرات، يمكنك تجاهل هذا الإعداد لاسترداد العناصر المعدَّلة وفهرستها.
  • (اختياري) close(): لتنظيف المستودع أثناء إيقاف التشغيل.

تعرض كل طريقة عنصر ApiOperation، الذي ينفّذ الفهرسة باستخدام IndexingService.indexItem().

الحصول على مَعلمات الإعدادات المخصّصة

للتعامل مع إعدادات الموصل، يجب استرداد أي مَعلمات مخصّصة من عنصر Configuration. نفِّذ هذه المهمة في طريقة init() الخاصة بفئة Repository.

يتضمّن الصف 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) لتحديد المستخدمين أو المجموعات الذين لديهم إذن بالوصول إلى عنصر معيّن. وتتضمّن قائمة التحكّم بالوصول معرّفات المستخدمين أو المجموعات المسموح لهم بالوصول.

لضمان اطّلاع المستخدمين على نتائج البحث التي يمكنهم الوصول إليها فقط، عليك تكرار قوائم التحكّم بالوصول الخاصة بالمستودع. أدرِج قائمة التحكّم بالوصول عند فهرسة عنصر ما ليتمكّن Google Cloud Search من توفير مستوى الوصول الصحيح.

تتضمّن حزمة تطوير البرامج (SDK) الخاصة بأداة Content Connector فئات وطُرقًا لتصميم قوائم التحكّم بالوصول (ACL) لمعظم المستودعات. تحليل قوائم التحكّم بالوصول في المستودع وإنشاء قوائم تحكّم بالوصول مماثلة في Cloud Search أثناء الفهرسة يتطلّب تصميم قوائم التحكم في الوصول المعقّدة، مثل تلك التي تستخدم ميزة "الميراث"، تخطيطًا دقيقًا. لمزيد من المعلومات، يُرجى الاطّلاع على قوائم التحكّم بالوصول في 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();

يتطلّب تصميم قوائم التحكّم بالوصول الخاصة بالمستودع بشكل صحيح، خاصةً تلك التي تستخدم نماذج الوراثة، المعلومات الواردة في قوائم التحكّم بالوصول في Cloud Search.

ضبط البيانات الوصفية لعنصر

يتم تخزين بيانات التعريف في عنصر Item. لإنشاء Item، تحتاج إلى رقم تعريف فريد ونوع العنصر وقائمة التحكّم بالوصول وعنوان 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();

الخطوات التالية

إنشاء أداة ربط لتصفّح القوائم باستخدام فئة نموذج

يحتوي &quot;قائمة انتظار الفهرسة في Cloud Search&quot; على أرقام تعريف وتجزئة اختيارية لعناصر المستودع. يدفع موصل اجتياز القائمة أرقام التعريف إلى هذه قائمة الانتظار ويسترجعها للفهرسة. تحتفظ 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();
}

تنفيذ واجهة Repository

تجاوز الطرق التالية لـ ListingConnector:

  • init(): لإعداد المستودع
  • getIds(): لاسترداد المعرّفات والتجزئة لجميع السجلات.
  • getDoc(): لإضافة عناصر إلى الفهرس أو تعديلها أو حذفها
  • (اختياري) getChanges(): لتحديثات تدريجية باستخدام ميزة رصد التغيير
  • (اختياري) close(): لتنظيف المستودع.

تنفيذ عملية اجتياز القائمة

استبدِل getIds() لاسترداد أرقام التعريف والتجزئة. يمكنك إلغاء getDoc() للتعامل مع كل عنصر في قائمة انتظار الفهرسة في Cloud Search.

إرسال معرّفات السلع وقيم التجزئة

تجاوز getIds() لجلب المعرّفات ورموز التجزئة للمحتوى يتم تجميعها في PushItems وإرسالها إلى &quot;قائمة انتظار الفهرسة&quot;.

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) لتحديد المستخدمين أو المجموعات الذين لديهم إذن بالوصول إلى عنصر معيّن. وتتضمّن قائمة التحكّم بالوصول معرّفات المستخدمين أو المجموعات المسموح لهم بالوصول.

لضمان اطّلاع المستخدمين على نتائج البحث التي يمكنهم الوصول إليها فقط، عليك تكرار قوائم التحكّم بالوصول الخاصة بالمستودع. أدرِج قائمة التحكّم بالوصول عند فهرسة عنصر ما ليتمكّن Google Cloud Search من توفير مستوى الوصول الصحيح.

تتضمّن حزمة تطوير البرامج (SDK) الخاصة بأداة Content Connector فئات وطُرقًا لتصميم قوائم التحكّم بالوصول (ACL) لمعظم المستودعات. تحليل قوائم التحكّم بالوصول في المستودع وإنشاء قوائم تحكّم بالوصول مماثلة في Cloud Search أثناء الفهرسة يتطلّب تصميم قوائم 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();

يتطلّب تصميم قوائم التحكّم بالوصول الخاصة بالمستودع بشكل صحيح، لا سيما تلك التي تستخدم نماذج الوراثة، المعلومات الواردة في قوائم التحكّم بالوصول في 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 في حال عدم تحديده.

الخطوات التالية

في ما يلي بعض الخطوات التالية التي يمكنك اتّخاذها:

إنشاء أداة ربط لتصفّح الرسوم البيانية باستخدام فئة نموذج

يحتوي &quot;قائمة انتظار الفهرسة&quot; في Cloud Search على أرقام تعريف وقيم تجزئة اختيارية لكل عنصر في المستودع. يدفع موصّل اجتياز الرسم البياني معرّفات العناصر إلى قائمة انتظار الفهرسة في Google Cloud Search ويسترجعها واحدًا تلو الآخر لفهرستها. يحتفظ Google Cloud Search بقوائم انتظار ويقارن محتوى القوائم لتحديد حالة العناصر، مثل ما إذا كان قد تم حذف عنصر من المستودع. لمزيد من المعلومات حول قائمة انتظار الفهرسة في Cloud Search، يُرجى الاطّلاع على قائمة انتظار الفهرسة في Google Cloud Search.

أثناء الفهرسة، يتم استرداد محتوى العنصر من مستودع البيانات، ويتم إرسال أي أرقام تعريف لعناصر فرعية إلى قائمة الانتظار. يعالج الموصل بشكل متكرّر أرقام تعريف العناصر الرئيسية والعناصر الفرعية إلى أن يتم التعامل مع جميع العناصر.

تنفيذ نقطة دخول الموصّل

نقطة الدخول إلى الموصّل هي الطريقة main(). تنشئ هذه الطريقة مثيلاً لفئة Application وتستدعي الطريقة start() لتشغيل الموصل.

قبل طلب application.start()، استخدِم الفئة IndexingApplication.Builder لإنشاء نسخة من النموذج ListingConnector. يقبل ListingConnector عنصر Repository تنفّذ طرقه.

تنفيذ واجهة 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 كيلوبايت.
  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 لإضافة عناصر إلى قائمة المحتوى التالي.