कॉन्टेंट कनेक्टर बनाना

कॉन्टेंट कनेक्टर एक सॉफ़्टवेयर प्रोग्राम होता है. यह किसी एंटरप्राइज़ रिपॉज़िटरी में मौजूद डेटा को प्रोसेस करता है और डेटा सोर्स में भरता है. Google, कॉन्टेंट कनेक्टर डेवलप करने के लिए ये विकल्प उपलब्ध कराता है:

  • Content Connector SDK. यह Java प्रोग्रामर के लिए एक अच्छा विकल्प है. एसडीके, REST API के चारों ओर एक रैपर है. इसकी मदद से, कनेक्टर तुरंत बनाए जा सकते हैं. एसडीके का इस्तेमाल करके कॉन्टेंट कनेक्टर बनाने के लिए, Content Connector SDK का इस्तेमाल करके कॉन्टेंट कनेक्टर बनाना लेख पढ़ें.

  • लो-लेवल REST API या एपीआई लाइब्रेरी. अगर आपको Java का इस्तेमाल नहीं करना है या आपका कोडबेस, REST API या लाइब्रेरी के साथ बेहतर तरीके से काम करता है, तो इन विकल्पों का इस्तेमाल करें. REST API का इस्तेमाल करके कॉन्टेंट कनेक्टर बनाने के लिए, REST API का इस्तेमाल करके कॉन्टेंट कनेक्टर बनाना लेख पढ़ें.

आम तौर पर, कॉन्टेंट कनेक्टर ये काम करता है:

  1. यह कुकी, कॉन्फ़िगरेशन पैरामीटर को पढ़ती है और उन्हें प्रोसेस करती है.
  2. यह तीसरे पक्ष के डेटा संग्रह स्थान से इंडेक्स किए जा सकने वाले डेटा के अलग-अलग हिस्सों को खींचता है. इन्हें "आइटम" कहा जाता है.
  3. यह इंडेक्स किए जा सकने वाले आइटम में, एसीएल, मेटाडेटा, और कॉन्टेंट डेटा को जोड़ता है.
  4. यह Cloud Search डेटा सोर्स में मौजूद आइटम को इंडेक्स करता है.
  5. (ज़रूरी नहीं) यह रिपॉज़िटरी में हुए बदलावों की सूचनाएं सुनता है. बदलाव की सूचनाएं, इंडेक्स करने के अनुरोधों में बदल जाती हैं, ताकि Cloud Search डेटा सोर्स को सिंक में रखा जा सके. कनेक्टर सिर्फ़ तब यह टास्क पूरा करता है, जब रिपॉज़िटरी में बदलाव का पता लगाने की सुविधा काम करती हो.

Content Connector SDK का इस्तेमाल करके, कॉन्टेंट कनेक्टर बनाना

यहां दिए गए सेक्शन में, Content Connector SDK का इस्तेमाल करके कॉन्टेंट कनेक्टर बनाने का तरीका बताया गया है.

डिपेंडेंसी सेट अप करना

इन डिपेंडेंसी को अपनी बिल्ड फ़ाइल में शामिल करें.

Maven

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

ग्रेडल

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 नाम की फ़ाइल का इस्तेमाल करने की कोशिश करता है.

ट्रावर्सल की रणनीति तय करना

कॉन्टेंट कनेक्टर का मुख्य काम, किसी रिपॉज़िटरी को ट्रैवर्स करना और उसके डेटा को इंडेक्स करना होता है. आपको अपनी रिपॉज़िटरी के साइज़ और लेआउट के हिसाब से रणनीति लागू करनी होगी. आपके पास अपनी रणनीति बनाने या एसडीके से कोई रणनीति चुनने का विकल्प होता है:

पूरे डेटा को ट्रैवर्स करने की रणनीति
पूरी रिपॉज़िटरी को स्कैन करता है और हर आइटम को इंडेक्स करता है. यह रणनीति उन छोटी रिपॉज़िटरी के लिए सबसे सही है जहां हर इंडेक्सिंग के दौरान, पूरे ट्रैवर्सल का ओवरहेड मैनेज किया जा सकता है. इसका इस्तेमाल ऐसी छोटी रिपॉज़िटरी के लिए करें जिनमें ज़्यादातर स्टैटिक, नॉन-हायरार्किकल डेटा होता है या जब बदलाव का पता लगाना मुश्किल होता है.
सूची को ट्रैवर्स करने की रणनीति
यह पूरी रिपॉज़िटरी को स्कैन करके, हर आइटम का स्टेटस तय करता है. इसके बाद, सिर्फ़ नए या अपडेट किए गए आइटम को इंडेक्स करता है. इसका इस्तेमाल, बड़े और गैर-क्रमिक इंडेक्स में इंक्रीमेंटल अपडेट के लिए करें. ऐसा तब करें, जब बदलाव का पता लगाने की सुविधा काम न कर रही हो.
ग्राफ़ ट्रैवर्सल
यह पैरंट नोड को स्कैन करके, उसके आइटम का स्टेटस पता लगाता है. इसके बाद, उस नोड में मौजूद नए या अपडेट किए गए आइटम को इंडेक्स करता है. इसके बाद, यह चाइल्ड नोड को बार-बार प्रोसेस करता है. इसका इस्तेमाल, क्रम के हिसाब से व्यवस्थित रिपॉज़िटरी के लिए करें. जैसे, डायरेक्ट्री स्ट्रक्चर या वेबसाइटें. इनमें सभी आईडी की सूची बनाना व्यावहारिक नहीं होता.

एसडीके, इन रणनीतियों को टेंप्लेट कनेक्टर क्लास में लागू करता है. इन टेंप्लेट से, डेवलपमेंट की प्रोसेस को तेज़ी से पूरा किया जा सकता है. टेंप्लेट का इस्तेमाल करने के लिए, इससे जुड़ा सेक्शन देखें:

टेंप्लेट क्लास का इस्तेमाल करके, पूरा ट्रैवर्सल कनेक्टर बनाना

यह सेक्शन, FullTraversalSample के कोड के बारे में बताता है.

कनेक्टर एंट्री पॉइंट लागू करना

एंट्री पॉइंट, main() तरीका है. इससे Application इंस्टेंस बनता है और कनेक्टर को चलाने के लिए start() कॉल करता है.

application.start() को कॉल करने से पहले, FullTraversalConnector टेंप्लेट को इंस्टैंशिएट करने के लिए, IndexingApplication.Builder क्लास का इस्तेमाल करें. यह टेंप्लेट, 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();
}

आपका main() तरीका Application.build() को कॉल करता है. इसके बाद, एसडीके initConfig() को कॉल करता है. initConfig() तरीका:

  1. यह कुकी यह पक्का करती है कि Configuration पहले से शुरू न किया गया हो.
  2. यह फ़ंक्शन, Google की ओर से दिए गए की-वैल्यू पेयर के साथ Configuration ऑब्जेक्ट को शुरू करता है.

Repository इंटरफ़ेस लागू करना

Repository ऑब्जेक्ट, रिपॉज़िटरी आइटम को ट्रैवर्स और इंडेक्स करता है. टेंप्लेट का इस्तेमाल करते समय, आपको Repository इंटरफ़ेस में सिर्फ़ कुछ तरीकों को बदलना होगा. FullTraversalConnector के लिए, यह वैल्यू बदलें:

  • init(): रिपॉज़िटरी को सेट अप और शुरू करने के लिए.
  • getAllDocs(): सभी आइटम को ट्रैवर्स और इंडेक्स करने के लिए. इसे हर शेड्यूल किए गए ट्रैवर्सल के लिए एक बार कॉल किया जाता है.
  • (ज़रूरी नहीं) getChanges(): अगर आपकी रिपॉज़िटरी में बदलाव का पता लगाने की सुविधा काम करती है, तो इस सुविधा को बदलें, ताकि बदले गए आइटम को वापस पाया जा सके और उन्हें इंडेक्स किया जा सके.
  • (ज़रूरी नहीं) close(): शटडाउन के दौरान रिपॉज़िटरी को क्लीनअप करने के लिए.

हर तरीका, एक ApiOperation ऑब्जेक्ट दिखाता है. यह ऑब्जेक्ट, IndexingService.indexItem() का इस्तेमाल करके इंडेक्सिंग करता है.

कस्टम कॉन्फ़िगरेशन पैरामीटर पाना

अपने कनेक्टर के कॉन्फ़िगरेशन को मैनेज करने के लिए, आपको Configuration ऑब्जेक्ट से कोई भी कस्टम पैरामीटर वापस पाना होगा. इस टास्क को अपनी क्लास के Repository init() तरीके से पूरा करें.

Configuration क्लास में, अलग-अलग तरह के डेटा को वापस पाने के तरीके शामिल होते हैं. हर तरीका, एक ConfigValue ऑब्जेक्ट दिखाता है. वैल्यू पाने के लिए, ConfigValue ऑब्जेक्ट के get() तरीके का इस्तेमाल करें. FullTraversalSample के इस स्निपेट में, कस्टम पूर्णांक वैल्यू को वापस पाने का तरीका बताया गया है:

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

एक से ज़्यादा वैल्यू वाले पैरामीटर को वापस पाने और पार्स करने के लिए, Configuration क्लास के टाइप पार्सर में से किसी एक का इस्तेमाल करें. ट्यूटोरियल कनेक्टर का यह स्निपेट, GitHub रिपॉज़िटरी के नामों की सूची पाने के लिए getMultiValue का इस्तेमाल करता है:

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

पूरा ट्रैवर्सल करना

पूरे ट्रैवर्सल को लागू करने के लिए, getAllDocs() को बदलें. अगर इंडेक्सिंग में रुकावट आती है, तो यह तरीका इंडेक्सिंग को फिर से शुरू करने के लिए एक चेकपॉइंट स्वीकार करता है. हर आइटम के लिए:

  1. अनुमतियां सेट करें.
  2. मेटाडेटा सेट करें.
  3. उन्हें एक RepositoryDoc में जोड़ें.
  4. getAllDocs() से मिले इटरेटर में हर आइटम को पैकेज करें.

अगर आइटम सेट एक कॉल के लिए बहुत बड़ा है, तो चेकपॉइंट का इस्तेमाल करें और hasMore(true) को कॉल करें.

किसी आइटम के लिए अनुमतियां सेट करना

रिपॉज़िटरी, ऐक्सेस कंट्रोल लिस्ट (एसीएल) का इस्तेमाल करती हैं. इससे उन उपयोगकर्ताओं या ग्रुप की पहचान की जाती है जिनके पास किसी आइटम का ऐक्सेस होता है. एसीएल में, अनुमति पा चुके उपयोगकर्ताओं या ग्रुप के आईडी की सूची होती है.

यह पक्का करने के लिए कि उपयोगकर्ताओं को सिर्फ़ वे खोज नतीजे दिखें जिन्हें ऐक्सेस करने की अनुमति उनके पास है, आपको अपनी रिपॉज़िटरी के एएसएल दोहराने होंगे. किसी आइटम को इंडेक्स करते समय, एसीएल को शामिल करें. इससे Google Cloud Search, ऐक्सेस का सही लेवल दे पाएगा.

Content Connector SDK में, ज़्यादातर रिपॉज़िटरी के एएलसी को मॉडल करने के लिए क्लास और तरीके शामिल होते हैं. अपनी रिपॉज़िटरी की एएलसी का विश्लेषण करें और इंडेक्सिंग के दौरान 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 बनाने के लिए, आपको यूनीक आईडी, आइटम टाइप, एसीएल, यूआरएल, और वर्शन की ज़रूरत होती है. 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() अनुरोध करता है.

RepositoryDoc.Builder क्लास के setRequestMode() तरीके का इस्तेमाल करके, इंडेक्स करने के अनुरोध को ASYNCHRONOUS या SYNCHRONOUS पर सेट करें:

ASYNCHRONOUS
इस मोड में इंडेक्सिंग से लेकर नतीजे दिखाने तक में ज़्यादा समय लगता है. हालांकि, इसमें थ्रूपुट का ज़्यादा कोटा मिलता है. पूरी रिपॉज़िटरी की शुरुआती इंडेक्सिंग (बैकफ़िल) के लिए, एसिंक्रोनस मोड का इस्तेमाल करें.
SYNCHRONOUS
इस मोड में, इंडेक्सिंग से लेकर कॉन्टेंट दिखाने तक का इंतज़ार का समय कम होता है. हालांकि, इसमें थ्रूपुट कोटा कम होता है. रिपॉज़िटरी के अपडेट और बदलावों को इंडेक्स करने के लिए, सिंक्रोनस मोड का इस्तेमाल करें. अगर अनुरोध मोड के बारे में नहीं बताया गया है, तो डिफ़ॉल्ट रूप से SYNCHRONOUS लागू हो जाता है.
इंडेक्स किए जा सकने वाले हर आइटम को इटरेटर में पैकेज करें

getAllDocs() वाला तरीका, RepositoryDoc ऑब्जेक्ट का CheckpointCloseableIterable दिखाता है. CheckpointCloseableIterableImpl.Builder क्लास का इस्तेमाल करें.

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

अगले चरण

टेंप्लेट क्लास का इस्तेमाल करके, लिस्ट ट्रैवर्सल कनेक्टर बनाना

Cloud Search की इंडेक्सिंग की कतार में, रिपॉज़िटरी आइटम के लिए आईडी और वैकल्पिक हैश होते हैं. सूची ट्रैवर्सल कनेक्टर, आईडी को इस कतार में पुश करता है और इंडेक्सिंग के लिए उन्हें वापस पाता है. Cloud Search इन कतारों को मैनेज करता है, ताकि आइटम के स्टेटस का पता लगाया जा सके. जैसे, मिटाए गए आइटम. Cloud Search इंडेक्स करने की प्रोसेस में शामिल आइटम की सूची देखें.

यह सेक्शन, ListTraversalSample के बारे में बताता है.

कनेक्टर एंट्री पॉइंट लागू करना

main() तरीके से Application इंस्टेंस बनाया जाता है और start() को कॉल किया जाता है. ListingConnector टेंप्लेट को इंस्टैंशिएट करने के लिए, IndexingApplication.Builder का इस्तेमाल करें.

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() को बदलें. Cloud Search इंडेक्सिंग की कतार में मौजूद हर आइटम को मैनेज करने के लिए, getDoc() को बदलें.

आइटम आईडी और हैश वैल्यू पुश करना

आईडी और कॉन्टेंट हैश फ़ेच करने के लिए, 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);
}
किसी आइटम के लिए अनुमतियां सेट करना

रिपॉज़िटरी, ऐक्सेस कंट्रोल लिस्ट (एसीएल) का इस्तेमाल करती हैं. इससे उन उपयोगकर्ताओं या ग्रुप की पहचान की जाती है जिनके पास किसी आइटम का ऐक्सेस होता है. एसीएल में, अनुमति पा चुके उपयोगकर्ताओं या ग्रुप के आईडी की सूची होती है.

यह पक्का करने के लिए कि उपयोगकर्ताओं को सिर्फ़ वे खोज नतीजे दिखें जिन्हें ऐक्सेस करने की अनुमति उनके पास है, आपको अपनी रिपॉज़िटरी के एएसएल दोहराने होंगे. किसी आइटम को इंडेक्स करते समय, एसीएल को शामिल करें. इससे Google Cloud Search, ऐक्सेस का सही लेवल दे पाएगा.

Content Connector SDK में, ज़्यादातर रिपॉज़िटरी के एएलसी को मॉडल करने के लिए क्लास और तरीके शामिल होते हैं. अपनी रिपॉज़िटरी की एएलसी का विश्लेषण करें और इंडेक्सिंग के दौरान 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 के एसीएल में दी गई जानकारी की ज़रूरत होती है.

किसी आइटम के लिए मेटाडेटा सेट करना
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();

RepositoryDoc.Builder क्लास के setRequestMode() तरीके का इस्तेमाल करके, इंडेक्स करने के अनुरोध को ASYNCHRONOUS या SYNCHRONOUS पर सेट करें:

ASYNCHRONOUS
इस मोड में इंडेक्सिंग से लेकर नतीजे दिखाने तक में ज़्यादा समय लगता है. हालांकि, इसमें थ्रूपुट का ज़्यादा कोटा मिलता है. पूरी रिपॉज़िटरी की शुरुआती इंडेक्सिंग (बैकफ़िल) के लिए, एसिंक्रोनस मोड का इस्तेमाल करें.
SYNCHRONOUS
इस मोड में, इंडेक्सिंग से लेकर कॉन्टेंट दिखाने तक का इंतज़ार का समय कम होता है. हालांकि, इसमें थ्रूपुट कोटा कम होता है. रिपॉज़िटरी के अपडेट और बदलावों को इंडेक्स करने के लिए, सिंक्रोनस मोड का इस्तेमाल करें. अगर अनुरोध मोड के बारे में नहीं बताया गया है, तो डिफ़ॉल्ट रूप से SYNCHRONOUS लागू हो जाता है.

अगले चरण

यहां कुछ ऐसे तरीके दिए गए हैं जिन्हें आज़माया जा सकता है:

  • (ज़रूरी नहीं) बंद करने से पहले किसी भी संसाधन को रिलीज़ करने के लिए, close() तरीके का इस्तेमाल करें.
  • (ज़रूरी नहीं) Content Connector SDK का इस्तेमाल करके, पहचान कनेक्टर बनाएं.

टेंप्लेट क्लास का इस्तेमाल करके, ग्राफ़ ट्रैवर्सल कनेक्टर बनाना

Cloud Search की इंडेक्सिंग क्यू में, रिपॉज़िटरी में मौजूद हर आइटम के लिए आईडी और हैश वैल्यू (वैकल्पिक) सेव होती हैं. ग्राफ़ ट्रैवर्सल कनेक्टर, आइटम आईडी को Google Cloud Search की इंडेक्सिंग कतार में भेजता है. साथ ही, इंडेक्सिंग के लिए उन्हें एक-एक करके वापस पाता है. Google Cloud Search, कतारों को मैनेज करता है. साथ ही, कतारों में मौजूद कॉन्टेंट की तुलना करता है, ताकि आइटम की स्थिति का पता लगाया जा सके. जैसे, किसी आइटम को रिपॉज़िटरी से मिटाया गया है या नहीं. Cloud Search की इंडेक्सिंग की कतार के बारे में ज़्यादा जानने के लिए, Google Cloud Search की इंडेक्सिंग की कतार लेख पढ़ें.

इंडेक्सिंग के दौरान, डेटा रिपॉज़िटरी से आइटम का कॉन्टेंट फ़ेच किया जाता है. साथ ही, किसी भी चाइल्ड आइटम के आईडी को क्यू में पुश किया जाता है. कनेक्टर, पैरंट और चाइल्ड आईडी को तब तक प्रोसेस करता है, जब तक सभी आइटम प्रोसेस नहीं हो जाते.

कनेक्टर का एंट्री पॉइंट लागू करना

कनेक्टर का एंट्री पॉइंट, main() तरीका है. यह तरीका, Application क्लास का एक इंस्टेंस बनाता है और कनेक्टर को चलाने के लिए, इसके start() तरीके को कॉल करता है.

application.start() को कॉल करने से पहले, ListingConnector टेंप्लेट को इंस्टैंशिएट करने के लिए, IndexingApplication.Builder क्लास का इस्तेमाल करें. ListingConnector, Repository ऑब्जेक्ट को स्वीकार करता है. आपको इसके तरीकों को लागू करना होगा.

Repository इंटरफ़ेस लागू करना

init(), getIds(), getDoc(), और getChanges() या close() को बदलें. 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 का इस्तेमाल करके कॉन्टेंट कनेक्टर बनाने का तरीका बताया गया है.

ट्रावर्सल की रणनीति तय करना

रणनीतियां (पूरी, सूची, और ग्राफ़) एसडीके के लिए कॉन्सेप्ट के तौर पर एक जैसी होती हैं. 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 का इस्तेमाल करें.