একটি বিষয়বস্তু সংযোগকারী তৈরি করুন

কন্টেন্ট কানেক্টর হলো একটি সফটওয়্যার প্রোগ্রাম যা একটি এন্টারপ্রাইজ রিপোজিটরিতে থাকা ডেটা পরিভ্রমণ করে এবং একটি ডেটা সোর্সকে ডেটা দিয়ে পূর্ণ করে। কন্টেন্ট কানেক্টর তৈরির জন্য গুগল নিম্নলিখিত বিকল্পগুলো প্রদান করে:

একটি সাধারণ কন্টেন্ট কানেক্টর নিম্নলিখিত কাজগুলো সম্পাদন করে:

  1. কনফিগারেশন প্যারামিটারগুলো পড়ে এবং প্রক্রিয়া করে।
  2. তৃতীয় পক্ষের রিপোজিটরি থেকে ' আইটেম ' নামক সূচীবদ্ধযোগ্য ডেটার বিচ্ছিন্ন খণ্ড নিয়ে আসে।
  3. ACL, মেটাডেটা এবং কন্টেন্ট ডেটাকে একত্রিত করে ইনডেক্সযোগ্য আইটেম তৈরি করে।
  4. ক্লাউড সার্চ ডেটা সোর্সে আইটেমগুলোকে সূচীবদ্ধ করে।
  5. (ঐচ্ছিক) রিপোজিটরি থেকে পরিবর্তনের নোটিফিকেশন শোনে। ক্লাউড সার্চ ডেটা সোর্সকে সিঙ্কে রাখার জন্য পরিবর্তনের নোটিফিকেশনগুলো ইনডেক্সিং অনুরোধে রূপান্তরিত হয়। কানেক্টরটি কেবল তখনই এই কাজটি সম্পাদন করে, যদি রিপোজিটরিটি পরিবর্তন শনাক্তকরণ সমর্থন করে।

কন্টেন্ট কানেক্টর SDK ব্যবহার করে একটি কন্টেন্ট কানেক্টর তৈরি করুন।

নিম্নলিখিত বিভাগগুলিতে কন্টেন্ট কানেক্টর SDK ব্যবহার করে কীভাবে একটি কন্টেন্ট কানেক্টর তৈরি করতে হয় তা ব্যাখ্যা করা হয়েছে।

নির্ভরতা সেট আপ করুন

আপনার বিল্ড ফাইলে এই নির্ভরতাগুলো অন্তর্ভুক্ত করুন।

ম্যাভেন

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

গুগল ক্লাউড সার্চ এসডিকে-তে সকল কানেক্টরের জন্য গুগল-প্রদত্ত প্যারামিটার অন্তর্ভুক্ত রয়েছে। আপনাকে আপনার কনফিগারেশন ফাইলে নিম্নলিখিতগুলি অবশ্যই ঘোষণা করতে হবে:

  • কন্টেন্ট কানেক্টর : api.sourceId এবং api.serviceAccountPrivateKeyFile ঘোষণা করুন। এগুলো আপনার রিপোজিটরি এবং অ্যাক্সেসের জন্য প্রয়োজনীয় প্রাইভেট কী শনাক্ত করে।
  • আইডেন্টিটি কানেক্টর : আপনার বাহ্যিক আইডেন্টিটি সোর্স শনাক্ত করতে api.identitySourceId ডিক্লেয়ার করুন। ইউজার সিঙ্কিংয়ের জন্য, api.customerId (আপনার গুগল ওয়ার্কস্পেস অ্যাকাউন্টের ইউনিক আইডি) ডিক্লেয়ার করুন।

অন্যান্য গুগল-প্রদত্ত প্যারামিটারগুলো শুধুমাত্র তাদের ডিফল্ট মান ওভাররাইড করার জন্য ঘোষণা করুন। আইডি এবং কী তৈরি করার বিষয়ে বিস্তারিত জানতে, গুগল-প্রদত্ত প্যারামিটারসমূহ দেখুন।

আপনি আপনার কনফিগারেশন ফাইলে রিপোজিটরি-নির্দিষ্ট প্যারামিটারও নির্ধারণ করতে পারেন।

কনফিগারেশন ফাইলটি কানেক্টরের কাছে পাঠান।

কনফিগারেশন ফাইলটি পাস করার জন্য config সিস্টেম প্রপার্টি সেট করুন। কানেক্টরটি চালু করার সময় -D আর্গুমেন্টটি ব্যবহার করুন। উদাহরণস্বরূপ:

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

আপনি যদি এই আর্গুমেন্টটি বাদ দেন, তাহলে SDK স্থানীয় ডিরেক্টরিতে থাকা connector-config.properties নামের ফাইলটি ব্যবহার করার চেষ্টা করে।

আপনার চলাচলের কৌশল নির্ধারণ করুন

একটি কন্টেন্ট কানেক্টরের প্রধান কাজ হলো একটি রিপোজিটরি ট্র্যাভার্স করা এবং এর ডেটা ইন্ডেক্স করা। আপনাকে অবশ্যই আপনার রিপোজিটরির আকার এবং লেআউটের উপর ভিত্তি করে একটি স্ট্র্যাটেজি প্রয়োগ করতে হবে। আপনি নিজের মতো করে ডিজাইন করতে পারেন অথবা 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();
}

আপনার main() মেথড Application.build() কল করার পর SDK, initConfig() কল করে। initConfig() মেথডটি হলো:

  1. Configuration আগে থেকেই প্রারম্ভিক অবস্থায় নেই তা নিশ্চিত করে।
  2. গুগল-প্রদত্ত কী-ভ্যালু পেয়ার দিয়ে Configuration অবজেক্টটি ইনিশিয়ালাইজ করে।

রিপোজিটরি ইন্টারফেস বাস্তবায়ন করুন

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 ব্যবহার করে:

গিটহাবরিপোজিটরি.জাভা
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-টি অন্তর্ভুক্ত করুন, যাতে গুগল ক্লাউড সার্চ সঠিক অ্যাক্সেস লেভেল প্রদান করতে পারে।

কন্টেন্ট কানেক্টর SDK-তে বেশিরভাগ রিপোজিটরির ACL মডেল করার জন্য ক্লাস এবং মেথড অন্তর্ভুক্ত রয়েছে। আপনার রিপোজিটরির ACL বিশ্লেষণ করুন এবং ইন্ডেক্সিংয়ের সময় ক্লাউড সার্চের জন্য অনুরূপ ACL তৈরি করুন। ইনহেরিটেন্স ব্যবহার করে এমন জটিল ACL মডেল করার জন্য সতর্ক পরিকল্পনা প্রয়োজন। আরও তথ্যের জন্য, ক্লাউড সার্চ ACLs দেখুন।

অ্যাক্সেস সেট করতে 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- গুলোতে থাকা তথ্যের প্রয়োজন হয়।

একটি আইটেমের জন্য মেটাডেটা সেট করুন

মেটাডেটা একটি Item অবজেক্টে সংরক্ষিত থাকে। একটি Item তৈরি করতে আপনার একটি অনন্য আইডি, আইটেমের ধরন, 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() অনুরোধটি সম্পাদন করে।

ইনডেক্সিং রিকোয়েস্টকে ASYNCHRONOUS বা SYNCHRONOUS এ সেট করতে RepositoryDoc.Builder ক্লাসের setRequestMode() মেথডটি ব্যবহার করুন।

ASYNCHRONOUS
এই মোডে ইন্ডেক্সিং থেকে সার্ভিং পর্যন্ত ল্যাটেন্সি বেশি, কিন্তু এটি একটি বৃহত্তর থ্রুপুট কোটা সমর্থন করে। একটি সম্পূর্ণ রিপোজিটরির প্রাথমিক ইন্ডেক্সিং (ব্যাকফিল)-এর জন্য অ্যাসিঙ্ক্রোনাস মোড ব্যবহার করুন।
SYNCHRONOUS
এই মোডে ইন্ডেক্সিং থেকে সার্ভিং পর্যন্ত ল্যাটেন্সি কম, কিন্তু থ্রুপুট কোটা কম। রিপোজিটরি আপডেট এবং পরিবর্তন ইন্ডেক্স করার জন্য সিনক্রোনাস মোড ব্যবহার করুন। নির্দিষ্ট করে না দেওয়া হলে, রিকোয়েস্ট মোড ডিফল্টভাবে SYNCHRONOUS হয়ে যায়।
প্রতিটি ইনডেক্সযোগ্য আইটেমকে একটি ইটারেটরের মধ্যে প্যাকেজ করুন।

getAllDocs() মেথডটি RepositoryDoc অবজেক্টের একটি CheckpointCloseableIterable রিটার্ন করে। CheckpointCloseableIterableImpl.Builder ক্লাসটি ব্যবহার করুন।

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

পরবর্তী পদক্ষেপ

একটি টেমপ্লেট ক্লাস ব্যবহার করে একটি লিস্ট ট্রাভার্সাল কানেক্টর তৈরি করুন।

ক্লাউড সার্চ ইন্ডেক্সিং কিউ রিপোজিটরি আইটেমগুলির জন্য আইডি এবং ঐচ্ছিক হ্যাশ ধারণ করে। একটি লিস্ট ট্র্যাভার্সাল কানেক্টর এই কিউতে আইডি পুশ করে এবং ইন্ডেক্সিংয়ের জন্য সেগুলি পুনরুদ্ধার করে। ক্লাউড সার্চ আইটেমের অবস্থা, যেমন ডিলিট হওয়া, নির্ধারণ করতে এই কিউগুলি রক্ষণাবেক্ষণ করে। ক্লাউড সার্চ ইন্ডেক্সিং কিউ দেখুন।

এই বিভাগে 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();
}

রিপোজিটরি ইন্টারফেস বাস্তবায়ন করুন

ListingConnector জন্য নিম্নলিখিত মেথডগুলো ওভাররাইড করুন:

  • init() : রিপোজিটরি সেটআপের জন্য।
  • getIds() : সকল রেকর্ডের আইডি এবং হ্যাশ পুনরুদ্ধার করার জন্য।
  • getDoc() : ইনডেক্স থেকে আইটেম যোগ, আপডেট বা মুছে ফেলার জন্য।
  • (ঐচ্ছিক) getChanges() : পরিবর্তন শনাক্তকরণ ব্যবহার করে ক্রমবর্ধমান আপডেটের জন্য।
  • (ঐচ্ছিক) close() : রিপোজিটরি পরিষ্কার করার জন্য।

তালিকাটি অতিক্রম করুন

আইডি এবং হ্যাশ পুনরুদ্ধার করতে getIds() ওভাররাইড করুন। ক্লাউড সার্চ ইন্ডেক্সিং কিউ-এর প্রতিটি আইটেম পরিচালনা করতে 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);
}
একটি আইটেমের জন্য অনুমতি নির্ধারণ করুন

রিপোজিটরি কোনো আইটেমে অ্যাক্সেস আছে এমন ব্যবহারকারী বা গ্রুপ শনাক্ত করতে অ্যাক্সেস কন্ট্রোল লিস্ট (ACL) ব্যবহার করে। একটি ACL-এ অনুমোদিত ব্যবহারকারী বা গ্রুপের আইডিগুলো তালিকাভুক্ত থাকে।

ব্যবহারকারীরা যেন শুধুমাত্র তাদের অ্যাক্সেস করার অনুমোদিত সার্চ রেজাল্টগুলোই দেখতে পান, তা নিশ্চিত করতে আপনাকে অবশ্যই আপনার রিপোজিটরির ACL-গুলো প্রতিলিপি করতে হবে। কোনো আইটেম ইন্ডেক্স করার সময় ACL-টি অন্তর্ভুক্ত করুন, যাতে গুগল ক্লাউড সার্চ সঠিক অ্যাক্সেস লেভেল প্রদান করতে পারে।

কন্টেন্ট কানেক্টর SDK-তে বেশিরভাগ রিপোজিটরির ACL মডেল করার জন্য ক্লাস এবং মেথড অন্তর্ভুক্ত রয়েছে। আপনার রিপোজিটরির ACL বিশ্লেষণ করুন এবং ইন্ডেক্সিংয়ের সময় ক্লাউড সার্চের জন্য অনুরূপ ACL তৈরি করুন। ইনহেরিটেন্স ব্যবহার করে এমন জটিল ACL মডেল করার জন্য সতর্ক পরিকল্পনা প্রয়োজন। আরও তথ্যের জন্য, ক্লাউড সার্চ ACLs দেখুন।

অ্যাক্সেস সেট করতে 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- গুলোতে থাকা তথ্যের প্রয়োজন হয়।

একটি আইটেমের জন্য মেটাডেটা সেট করুন
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();

ইনডেক্সিং রিকোয়েস্টকে ASYNCHRONOUS বা SYNCHRONOUS এ সেট করতে RepositoryDoc.Builder ক্লাসের setRequestMode() মেথডটি ব্যবহার করুন।

ASYNCHRONOUS
এই মোডে ইন্ডেক্সিং থেকে সার্ভিং পর্যন্ত ল্যাটেন্সি বেশি, কিন্তু এটি একটি বৃহত্তর থ্রুপুট কোটা সমর্থন করে। একটি সম্পূর্ণ রিপোজিটরির প্রাথমিক ইন্ডেক্সিং (ব্যাকফিল)-এর জন্য অ্যাসিঙ্ক্রোনাস মোড ব্যবহার করুন।
SYNCHRONOUS
এই মোডে ইন্ডেক্সিং থেকে সার্ভিং পর্যন্ত ল্যাটেন্সি কম, কিন্তু থ্রুপুট কোটা কম। রিপোজিটরি আপডেট এবং পরিবর্তন ইন্ডেক্স করার জন্য সিনক্রোনাস মোড ব্যবহার করুন। নির্দিষ্ট করে না দেওয়া হলে, রিকোয়েস্ট মোড ডিফল্টভাবে SYNCHRONOUS হয়ে যায়।

পরবর্তী পদক্ষেপ

এখানে কয়েকটি পরবর্তী পদক্ষেপ রয়েছে যা আপনি নিতে পারেন:

একটি টেমপ্লেট ক্লাস ব্যবহার করে একটি গ্রাফ ট্র্যাভার্সাল কানেক্টর তৈরি করুন।

ক্লাউড সার্চ ইন্ডেক্সিং কিউ রিপোজিটরির প্রতিটি আইটেমের জন্য আইডি এবং ঐচ্ছিক হ্যাশ ভ্যালু ধারণ করে। একটি গ্রাফ ট্র্যাভার্সাল কানেক্টর আইটেম আইডিগুলোকে গুগল ক্লাউড সার্চ ইন্ডেক্সিং কিউ-তে পুশ করে এবং ইন্ডেক্সিংয়ের জন্য এক এক করে সেগুলো পুনরুদ্ধার করে। গুগল ক্লাউড সার্চ কিউগুলো রক্ষণাবেক্ষণ করে এবং আইটেমের অবস্থা নির্ধারণ করতে কিউয়ের বিষয়বস্তু তুলনা করে, যেমন কোনো আইটেম রিপোজিটরি থেকে মুছে ফেলা হয়েছে কিনা। ক্লাউড সার্চ ইন্ডেক্সিং কিউ সম্পর্কে আরও তথ্যের জন্য, “The Google Cloud Search Indexing Queue” দেখুন।

ইনডেক্সিং চলাকালীন, ডেটা রিপোজিটরি থেকে আইটেমের বিষয়বস্তু আনা হয় এবং যেকোনো চাইল্ড আইটেম আইডি কিউ-তে যুক্ত করা হয়। কানেক্টরটি পুনরাবৃত্তিমূলকভাবে প্যারেন্ট এবং চাইল্ড আইডিগুলো প্রসেস করতে থাকে যতক্ষণ না সমস্ত আইটেম হ্যান্ডেল করা হয়।

কানেক্টরের এন্ট্রি পয়েন্ট বাস্তবায়ন করুন

একটি কানেক্টরের এন্ট্রি পয়েন্ট হলো 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 ব্যবহার করে কীভাবে একটি কন্টেন্ট কানেক্টর তৈরি করতে হয় তা ব্যাখ্যা করা হয়েছে।

আপনার চলাচলের কৌশল নির্ধারণ করুন

স্ট্র্যাটেজিগুলো (Full, List, এবং Graph) ধারণাগতভাবে SDK-এর মতোই। REST API ব্যবহার করে আপনার নির্বাচিত স্ট্র্যাটেজিটি প্রয়োগ করুন।

আপনার ট্রাভার্সাল কৌশল বাস্তবায়ন করুন এবং আইটেমগুলো সূচীবদ্ধ করুন।

আপনার স্কিমাটি নিবন্ধন করুন, তারপর নিম্নলিখিত পদ্ধতি ব্যবহার করে ইনডেক্সটি পূরণ করুন:

  1. (ঐচ্ছিক) ১০০ কিলোবাইটের চেয়ে বড় ফাইলের জন্য items.upload
  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 Indexing Queue) ব্যবহার করুন। কিউতে আইটেম যোগ করতে items.push ব্যবহার করুন।