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

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

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

  1. কনফিগারেশন প্যারামিটারগুলি পড়ে এবং প্রক্রিয়া করে।
  2. তৃতীয় পক্ষের সংগ্রহস্থল থেকে " items " নামক সূচীযোগ্য ডেটার বিচ্ছিন্ন অংশ টেনে আনে।
  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

Google Cloud Search SDK-তে সমস্ত সংযোগকারীর জন্য Google-এর সরবরাহিত প্যারামিটার অন্তর্ভুক্ত থাকে। আপনার কনফিগারেশন ফাইলে আপনাকে নিম্নলিখিতগুলি ঘোষণা করতে হবে:

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

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

আপনি আপনার কনফিগারেশন ফাইলে রিপোজিটরি-নির্দিষ্ট পরামিতিগুলিও সংজ্ঞায়িত করতে পারেন।

কনফিগারেশন ফাইলটি সংযোগকারীতে পাস করুন।

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

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

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

আপনার ট্রাভার্সাল কৌশল নির্ধারণ করুন

একটি কন্টেন্ট সংযোগকারীর প্রাথমিক কাজ হল একটি সংগ্রহস্থল অতিক্রম করা এবং এর ডেটা সূচী করা। আপনার সংগ্রহস্থলের আকার এবং বিন্যাসের উপর ভিত্তি করে আপনাকে একটি কৌশল বাস্তবায়ন করতে হবে। আপনি নিজের ডিজাইন করতে পারেন অথবা SDK থেকে একটি কৌশল বেছে নিতে পারেন:

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

SDK এই কৌশলগুলি টেমপ্লেট সংযোগকারী ক্লাসগুলিতে প্রয়োগ করে। এই টেমপ্লেটগুলি আপনার বিকাশকে দ্রুততর করতে পারে। একটি টেমপ্লেট ব্যবহার করতে, সংশ্লিষ্ট বিভাগটি দেখুন:

একটি টেমপ্লেট ক্লাস ব্যবহার করে একটি সম্পূর্ণ ট্র্যাভার্সাল সংযোগকারী তৈরি করুন

এই বিভাগটি FullTraversalSample থেকে কোড উল্লেখ করে।

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

এন্ট্রি পয়েন্ট হল main() পদ্ধতি। এটি একটি Application ইনস্ট্যান্স তৈরি করে এবং সংযোগকারী চালানোর জন্য start() কল করে।

application.start() কল করার আগে, FullTraversalConnector টেমপ্লেটটি ইন্সট্যান্ট করার জন্য IndexingApplication.Builder ক্লাস ব্যবহার করুন। এই টেমপ্লেটটি একটি Repository অবজেক্ট গ্রহণ করে।

ফুলট্রাভার্সালস্যাম্পল.জাভা
/**
 * 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 এর এই স্নিপেটটি দেখায় কিভাবে একটি কাস্টম পূর্ণসংখ্যা মান পুনরুদ্ধার করতে হয়:

ফুলট্রাভার্সালস্যাম্পল.জাভা
@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) কল করুন।

একটি আইটেমের জন্য অনুমতি সেট করুন

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

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

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

অ্যাক্সেস সেট করতে Acl.Builder ক্লাস ব্যবহার করুন। সম্পূর্ণ ট্র্যাভার্সাল নমুনার এই স্নিপেটটি সমস্ত ডোমেন ব্যবহারকারীদের ( getCustomerPrincipal() ) সমস্ত আইটেম ( setReaders() ) পড়তে দেয়:

ফুলট্রাভার্সালস্যাম্পল.জাভা
// 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 সহায়ক ক্লাস ব্যবহার করুন।

ফুলট্রাভার্সালস্যাম্পল.জাভা
// 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 ক্লাস ব্যবহার করুন।

ফুলট্রাভার্সালস্যাম্পল.জাভা
// 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 ক্লাস ব্যবহার করুন।

ফুলট্রাভার্সালস্যাম্পল.জাভা
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(allDocs).build();

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

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

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

এই বিভাগটি ListTraversalSample কে নির্দেশ করে।

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

main() পদ্ধতিটি একটি Application ইনস্ট্যান্স তৈরি করে এবং start() কল করে। ListingConnector টেমপ্লেটটি ইন্সট্যান্ট করতে IndexingApplication.Builder ব্যবহার করুন।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
/**
 * 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 অনুরোধে এগুলি প্যাকেজ করুন।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
PushItems.Builder allIds = new PushItems.Builder();
for (Map.Entry<Integer, Long> entry : this.documents.entrySet()) {
  String documentId = Integer.toString(entry.getKey());
  String hash = this.calculateMetadataHash(entry.getKey());
  PushItem item = new PushItem().setMetadataHash(hash);
  log.info("Pushing " + documentId);
  allIds.addPushItem(documentId, item);
}

আইডি এবং হ্যাশ প্যাকেজ করতে PushItems.Builder ব্যবহার করুন।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();
return iterator;
প্রতিটি আইটেম উদ্ধার করুন এবং পরিচালনা করুন

ইনডেক্সিং কিউতে থাকা আইটেমগুলি পরিচালনা করতে getDoc() ওভাররাইড করুন। আইটেমগুলি নতুন, পরিবর্তিত, অপরিবর্তিত বা মুছে ফেলা যেতে পারে।

  1. আইটেম আইডিটি রিপোজিটরিতে আছে কিনা তা পরীক্ষা করুন। যদি না থাকে, তাহলে এটি মুছে ফেলুন।
  2. স্থিতির জন্য সূচীটি পোল করুন। যদি অপরিবর্তিত থাকে ( ACCEPTED ), তবে কিছুই করবেন না।
  3. পরিবর্তিত বা নতুন আইটেমের সূচী: অনুমতি সেট করুন, মেটাডেটা সেট করুন, একটি RepositoryDoc এ একত্রিত করুন এবং এটি ফেরত দিন।
মুছে ফেলা আইটেমগুলি পরিচালনা করুন

এই স্নিপেটটি দেখায় কিভাবে কোন আইটেম বিদ্যমান কিনা তা নির্ধারণ করতে হয় এবং যদি না থাকে তবে তা মুছে ফেলতে হয়।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
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);
}
অপরিবর্তিত আইটেমগুলি পরিচালনা করুন

অপরিবর্তিত আইটেমগুলি পরিচালনা করার জন্য ইনডেক্সিং কিউ পোল করুন।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
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();
}

উদাহরণটিতে পরিবর্তনগুলি সনাক্ত করতে একটি হ্যাশ ব্যবহার করা হয়েছে।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
/**
 * 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 তৈরি করুন। জটিল ACL মডেলিং, যেমন ইনহিরেশন ব্যবহারকারীদের, যত্ন সহকারে পরিকল্পনা করা প্রয়োজন। আরও তথ্যের জন্য, ক্লাউড সার্চ ACL দেখুন।

অ্যাক্সেস সেট করতে Acl.Builder ক্লাস ব্যবহার করুন। সম্পূর্ণ ট্র্যাভার্সাল নমুনার এই স্নিপেটটি সমস্ত ডোমেন ব্যবহারকারীদের ( getCustomerPrincipal() ) সমস্ত আইটেম ( setReaders() ) পড়তে দেয়:

ফুলট্রাভার্সালস্যাম্পল.জাভা
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

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

একটি আইটেমের জন্য মেটাডেটা সেট করুন
তালিকা ট্র্যাভার্সাল নমুনা.জাভা
// 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();
একটি ইনডেক্সেবল আইটেম তৈরি করুন
তালিকা ট্র্যাভার্সাল নমুনা.জাভা
// 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 এ চলে।

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

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

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

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

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

সংযোগকারীর প্রবেশ বিন্দু বাস্তবায়ন করুন

একটি সংযোগকারীর প্রবেশ বিন্দু হল main() পদ্ধতি। এই পদ্ধতিটি Application ক্লাসের একটি উদাহরণ তৈরি করে এবং সংযোগকারীটি চালানোর জন্য এর start() পদ্ধতিটি কল করে।

application.start() কল করার আগে, ListingConnector টেমপ্লেটটি ইন্সট্যান্ট করার জন্য IndexingApplication.Builder ক্লাস ব্যবহার করুন। ListingConnector একটি Repository অবজেক্ট গ্রহণ করে যার পদ্ধতিগুলি আপনি প্রয়োগ করেন।

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

init() , getIds() , getDoc() , এবং ঐচ্ছিকভাবে getChanges() অথবা close() ওভাররাইড করুন।

গ্রাফের ট্রাভার্সাল সম্পাদন করুন

প্রাথমিক আইডি পুনরুদ্ধার করতে getIds() এবং আইটেমগুলি পরিচালনা করতে এবং চাইল্ড আইডিগুলিকে সারিতে পুশ করতে getDoc() ওভাররাইড করুন।

পুশ আইটেম আইডি এবং হ্যাশ মান
গ্রাফট্রাভার্সালস্যাম্পল.জাভা
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);
প্রতিটি আইটেম উদ্ধার করুন এবং পরিচালনা করুন
  1. রিপোজিটরিতে আইডিটি আছে কিনা তা পরীক্ষা করুন। যদি না থাকে, তাহলে আইটেমটি মুছে ফেলুন।
  2. বিদ্যমান আইটেমগুলির জন্য, অনুমতি এবং মেটাডেটা সেট করুন এবং সেগুলিকে একটি RepositoryDoc এ একত্রিত করুন।
  3. চাইল্ড আইডিগুলিকে ইনডেক্সিং সারিতে পুশ করুন।
  4. RepositoryDoc ফেরত দিন।
মুছে ফেলা আইটেমগুলি পরিচালনা করুন
গ্রাফট্রাভার্সালস্যাম্পল.জাভা
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);
মেটাডেটা সেট করুন এবং আইটেমটি তৈরি করুন
গ্রাফট্রাভার্সালস্যাম্পল.জাভা
// 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();
গ্রাফট্রাভার্সালস্যাম্পল.জাভা
// 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);
চাইল্ড আইডিগুলি ইনডেক্সিং সারিতে রাখুন
গ্রাফট্রাভার্সালস্যাম্পল.জাভা
// 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
  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 ব্যবহার করুন।

,

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

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

  1. কনফিগারেশন প্যারামিটারগুলি পড়ে এবং প্রক্রিয়া করে।
  2. তৃতীয় পক্ষের সংগ্রহস্থল থেকে " items " নামক সূচীযোগ্য ডেটার বিচ্ছিন্ন অংশ টেনে আনে।
  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

Google Cloud Search SDK-তে সমস্ত সংযোগকারীর জন্য Google-এর সরবরাহিত প্যারামিটার অন্তর্ভুক্ত থাকে। আপনার কনফিগারেশন ফাইলে আপনাকে নিম্নলিখিতগুলি ঘোষণা করতে হবে:

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

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

আপনি আপনার কনফিগারেশন ফাইলে রিপোজিটরি-নির্দিষ্ট পরামিতিগুলিও সংজ্ঞায়িত করতে পারেন।

কনফিগারেশন ফাইলটি সংযোগকারীতে পাস করুন।

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

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

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

আপনার ট্রাভার্সাল কৌশল নির্ধারণ করুন

একটি কন্টেন্ট সংযোগকারীর প্রাথমিক কাজ হল একটি সংগ্রহস্থল অতিক্রম করা এবং এর ডেটা সূচী করা। আপনার সংগ্রহস্থলের আকার এবং বিন্যাসের উপর ভিত্তি করে আপনাকে একটি কৌশল বাস্তবায়ন করতে হবে। আপনি নিজের ডিজাইন করতে পারেন অথবা SDK থেকে একটি কৌশল বেছে নিতে পারেন:

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

SDK এই কৌশলগুলি টেমপ্লেট সংযোগকারী ক্লাসগুলিতে প্রয়োগ করে। এই টেমপ্লেটগুলি আপনার বিকাশকে দ্রুততর করতে পারে। একটি টেমপ্লেট ব্যবহার করতে, সংশ্লিষ্ট বিভাগটি দেখুন:

একটি টেমপ্লেট ক্লাস ব্যবহার করে একটি সম্পূর্ণ ট্র্যাভার্সাল সংযোগকারী তৈরি করুন

এই বিভাগটি FullTraversalSample থেকে কোড উল্লেখ করে।

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

এন্ট্রি পয়েন্ট হল main() পদ্ধতি। এটি একটি Application ইনস্ট্যান্স তৈরি করে এবং সংযোগকারী চালানোর জন্য start() কল করে।

application.start() কল করার আগে, FullTraversalConnector টেমপ্লেটটি ইন্সট্যান্ট করার জন্য IndexingApplication.Builder ক্লাস ব্যবহার করুন। এই টেমপ্লেটটি একটি Repository অবজেক্ট গ্রহণ করে।

ফুলট্রাভার্সালস্যাম্পল.জাভা
/**
 * 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 এর এই স্নিপেটটি দেখায় কিভাবে একটি কাস্টম পূর্ণসংখ্যা মান পুনরুদ্ধার করতে হয়:

ফুলট্রাভার্সালস্যাম্পল.জাভা
@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) কল করুন।

একটি আইটেমের জন্য অনুমতি সেট করুন

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

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

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

অ্যাক্সেস সেট করতে Acl.Builder ক্লাস ব্যবহার করুন। সম্পূর্ণ ট্র্যাভার্সাল নমুনার এই স্নিপেটটি সমস্ত ডোমেন ব্যবহারকারীদের ( getCustomerPrincipal() ) সমস্ত আইটেম ( setReaders() ) পড়তে দেয়:

ফুলট্রাভার্সালস্যাম্পল.জাভা
// 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 সহায়ক ক্লাস ব্যবহার করুন।

ফুলট্রাভার্সালস্যাম্পল.জাভা
// 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 ক্লাস ব্যবহার করুন।

ফুলট্রাভার্সালস্যাম্পল.জাভা
// 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 ক্লাস ব্যবহার করুন।

ফুলট্রাভার্সালস্যাম্পল.জাভা
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(allDocs).build();

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

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

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

এই বিভাগটি ListTraversalSample কে নির্দেশ করে।

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

main() পদ্ধতিটি একটি Application ইনস্ট্যান্স তৈরি করে এবং start() কল করে। ListingConnector টেমপ্লেটটি ইন্সট্যান্ট করতে IndexingApplication.Builder ব্যবহার করুন।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
/**
 * 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 অনুরোধে এগুলি প্যাকেজ করুন।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
PushItems.Builder allIds = new PushItems.Builder();
for (Map.Entry<Integer, Long> entry : this.documents.entrySet()) {
  String documentId = Integer.toString(entry.getKey());
  String hash = this.calculateMetadataHash(entry.getKey());
  PushItem item = new PushItem().setMetadataHash(hash);
  log.info("Pushing " + documentId);
  allIds.addPushItem(documentId, item);
}

আইডি এবং হ্যাশ প্যাকেজ করতে PushItems.Builder ব্যবহার করুন।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();
return iterator;
প্রতিটি আইটেম উদ্ধার করুন এবং পরিচালনা করুন

ইনডেক্সিং কিউতে থাকা আইটেমগুলি পরিচালনা করতে getDoc() ওভাররাইড করুন। আইটেমগুলি নতুন, পরিবর্তিত, অপরিবর্তিত বা মুছে ফেলা যেতে পারে।

  1. আইটেম আইডিটি রিপোজিটরিতে আছে কিনা তা পরীক্ষা করুন। যদি না থাকে, তাহলে এটি মুছে ফেলুন।
  2. স্থিতির জন্য সূচীটি পোল করুন। যদি অপরিবর্তিত থাকে ( ACCEPTED ), তবে কিছুই করবেন না।
  3. পরিবর্তিত বা নতুন আইটেমের সূচী: অনুমতি সেট করুন, মেটাডেটা সেট করুন, একটি RepositoryDoc এ একত্রিত করুন এবং এটি ফেরত দিন।
মুছে ফেলা আইটেমগুলি পরিচালনা করুন

এই স্নিপেটটি দেখায় কিভাবে কোন আইটেম বিদ্যমান কিনা তা নির্ধারণ করতে হয় এবং যদি না থাকে তবে তা মুছে ফেলতে হয়।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
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);
}
অপরিবর্তিত আইটেমগুলি পরিচালনা করুন

অপরিবর্তিত আইটেমগুলি পরিচালনা করার জন্য ইনডেক্সিং কিউ পোল করুন।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
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();
}

উদাহরণটিতে পরিবর্তনগুলি সনাক্ত করতে একটি হ্যাশ ব্যবহার করা হয়েছে।

তালিকা ট্র্যাভার্সাল নমুনা.জাভা
/**
 * 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 তৈরি করুন। জটিল ACL মডেলিং, যেমন ইনহিরেশন ব্যবহারকারীদের, যত্ন সহকারে পরিকল্পনা করা প্রয়োজন। আরও তথ্যের জন্য, ক্লাউড সার্চ ACL দেখুন।

অ্যাক্সেস সেট করতে Acl.Builder ক্লাস ব্যবহার করুন। সম্পূর্ণ ট্র্যাভার্সাল নমুনার এই স্নিপেটটি সমস্ত ডোমেন ব্যবহারকারীদের ( getCustomerPrincipal() ) সমস্ত আইটেম ( setReaders() ) পড়তে দেয়:

ফুলট্রাভার্সালস্যাম্পল.জাভা
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

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

একটি আইটেমের জন্য মেটাডেটা সেট করুন
তালিকা ট্র্যাভার্সাল নমুনা.জাভা
// 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();
একটি ইনডেক্সেবল আইটেম তৈরি করুন
তালিকা ট্র্যাভার্সাল নমুনা.জাভা
// 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 এ চলে।

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

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

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

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

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

সংযোগকারীর প্রবেশ বিন্দু বাস্তবায়ন করুন

একটি সংযোগকারীর প্রবেশ বিন্দু হল main() পদ্ধতি। এই পদ্ধতিটি Application ক্লাসের একটি উদাহরণ তৈরি করে এবং সংযোগকারীটি চালানোর জন্য এর start() পদ্ধতিটি কল করে।

Before calling application.start() , use the IndexingApplication.Builder class to instantiate the ListingConnector template. The ListingConnector accepts a Repository object whose methods you implement.

Implement the Repository interface

Override init() , getIds() , getDoc() , and optionally getChanges() or close() .

Perform the graph traversal

Override getIds() to retrieve initial IDs and getDoc() to handle items and push child IDs to the queue.

Push item IDs and hash values
GraphTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);
Retrieve and handle each item
  1. Check if the ID exists in the repository. If not, delete the item.
  2. For existing items, set permissions and metadata, and combine them into a RepositoryDoc .
  3. Push child IDs to the Indexing Queue.
  4. Return the RepositoryDoc .
Handle deleted items
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);
Set metadata and create the item
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);
Place child IDs in the Indexing Queue
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();

Create a content connector using the REST API

The following sections explain how to create a content connector using the REST API.

Determine your traversal strategy

The strategies (Full, List, and Graph) are conceptually the same as for the SDK. Implement your chosen strategy using the REST API.

Implement your traversal strategy and index items

Register your schema, then populate the index using:

  1. (Optional) items.upload for files larger than 100 KiB.
  2. (Optional) media.upload for media files.
  3. items.index to index the item.

    Example indexing request:

    {
      "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. (Optional) Use items.get to verify indexing.

Handle repository changes

Periodically reindex the entire repository for full indexing. For list or graph traversal, use the Google Cloud Indexing Queue to track changes and only index what has changed. Use items.push to add items to the queue.