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

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

  • বিষয়বস্তু সংযোগকারী SDK. আপনি যদি জাভাতে প্রোগ্রামিং করেন তবে এটি একটি ভাল বিকল্প। বিষয়বস্তু সংযোগকারী SDK হল REST API এর চারপাশে একটি মোড়ক যা আপনাকে দ্রুত সংযোগকারী তৈরি করতে দেয়৷ SDK ব্যবহার করে একটি বিষয়বস্তু সংযোগকারী তৈরি করতে, সামগ্রী সংযোগকারী SDK ব্যবহার করে একটি সামগ্রী সংযোগকারী তৈরি করুন দেখুন৷

  • একটি নিম্ন-স্তরের REST API বা API লাইব্রেরি। আপনি যদি জাভাতে প্রোগ্রামিং না করেন, অথবা যদি আপনার কোডবেস একটি REST API বা একটি লাইব্রেরি আরও ভালভাবে মিটমাট করে তাহলে এই বিকল্পগুলি ব্যবহার করুন৷ REST API ব্যবহার করে একটি সামগ্রী সংযোগকারী তৈরি করতে, REST API ব্যবহার করে একটি সামগ্রী সংযোগকারী তৈরি করুন দেখুন।

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

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

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

নিম্নলিখিত বিভাগগুলি ব্যাখ্যা করে কিভাবে সামগ্রী সংযোগকারী SDK ব্যবহার করে একটি বিষয়বস্তু সংযোগকারী তৈরি করতে হয়৷

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

SDK ব্যবহার করার জন্য আপনাকে অবশ্যই আপনার বিল্ড ফাইলে কিছু নির্ভরতা অন্তর্ভুক্ত করতে হবে। আপনার বিল্ড পরিবেশের জন্য নির্ভরতা দেখতে নীচের একটি ট্যাবে ক্লিক করুন:

মাভেন

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

গ্রেডল

compile group: 'com.google.enterprise.cloudsearch',
        name: 'google-cloudsearch-indexing-connector-sdk',
        version: 'v1-0.0.3'

আপনার সংযোগকারী কনফিগারেশন তৈরি করুন

প্রতিটি সংযোগকারীর একটি কনফিগারেশন ফাইল থাকে যাতে সংযোগকারীর দ্বারা ব্যবহৃত পরামিতি থাকে, যেমন আপনার সংগ্রহস্থলের জন্য আইডি। পরামিতিগুলিকে কী-মানের জোড়া হিসাবে সংজ্ঞায়িত করা হয়, যেমন api.sourceId= 1234567890abcdef

Google ক্লাউড অনুসন্ধান SDK-এ সমস্ত সংযোগকারীর দ্বারা ব্যবহৃত Google-এর সরবরাহকৃত কনফিগারেশন প্যারামিটার রয়েছে৷ আপনার কনফিগারেশন ফাইলে আপনাকে অবশ্যই নিম্নলিখিত Google দ্বারা সরবরাহ করা প্যারামিটারগুলি ঘোষণা করতে হবে:

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

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

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

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

আপনার সংযোগকারীতে কনফিগারেশন ফাইলটি পাস করতে সিস্টেম সম্পত্তি config সেট করুন। সংযোগকারী শুরু করার সময় আপনি -D আর্গুমেন্ট ব্যবহার করে সম্পত্তি সেট করতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ডটি MyConfig.properties কনফিগারেশন ফাইলের সাথে সংযোগকারীকে শুরু করে:

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

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

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

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

সম্পূর্ণ ট্রাভার্সাল কৌশল

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

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

ট্রাভার্সাল কৌশল তালিকা করুন

একটি তালিকা ট্রাভার্সাল কৌশল প্রতিটি আইটেমের স্থিতি নির্ধারণ করে সমস্ত চাইল্ড নোড সহ সমগ্র সংগ্রহস্থল স্ক্যান করে। তারপরে, সংযোগকারী একটি দ্বিতীয় পাস নেয় এবং শুধুমাত্র সেই আইটেমগুলিকে সূচী করে যা নতুন বা শেষ সূচীকরণের পর থেকে আপডেট করা হয়েছে। এই কৌশলটি সাধারণত একটি বিদ্যমান সূচকে ক্রমবর্ধমান আপডেটগুলি সম্পাদন করতে ব্যবহৃত হয় (প্রতিবার আপনি সূচক আপডেট করার সময় একটি সম্পূর্ণ ট্রাভার্সাল করার পরিবর্তে)।

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

গ্রাফ ট্রাভার্সাল

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

এই কৌশলটি উপযুক্ত যদি আপনার কাছে শ্রেণীবদ্ধ ডেটা থাকে যা ক্রল করা প্রয়োজন, যেমন সিরিজের ডিরেক্টরি বা ওয়েব পৃষ্ঠা।

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

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

ডক্সের এই বিভাগটি FullTraversalSample উদাহরণ থেকে কোড স্নিপেটগুলিকে বোঝায়।

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

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

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

FullTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a full
 * traversal connector.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new SampleRepository();
  IndexingConnector connector = new FullTraversalConnector(repository);
  IndexingApplication application = new IndexingApplication.Builder(connector, args).build();
  application.start();
}

পর্দার আড়ালে, SDK আপনার সংযোগকারীর main() পদ্ধতি Application.build কল করার পরে initConfig() পদ্ধতিতে কল করে। initConfig() পদ্ধতি নিম্নলিখিত কাজগুলি সম্পাদন করে:

  1. Configuration আরম্ভ করা হয়নি তা নিশ্চিত করতে Configuation.isInitialized() পদ্ধতিতে কল করে।
  2. Google-প্রদত্ত কী-মান জোড়া দিয়ে একটি Configuration অবজেক্ট শুরু করে। প্রতিটি কী-মান জোড়া Configuration অবজেক্টের মধ্যে একটি ConfigValue অবজেক্টে সংরক্ষণ করা হয়।

Repository ইন্টারফেস বাস্তবায়ন

Repository অবজেক্টের একমাত্র উদ্দেশ্য হল রিপোজিটরি আইটেমগুলির ট্রাভার্সাল এবং ইনডেক্সিং করা। একটি টেমপ্লেট ব্যবহার করার সময়, একটি বিষয়বস্তু সংযোগকারী তৈরি করতে আপনার শুধুমাত্র Repository ইন্টারফেসের মধ্যে নির্দিষ্ট কিছু পদ্ধতি ওভাররাইড করতে হবে। আপনি যে পদ্ধতিগুলিকে ওভাররাইড করেন তা নির্ভর করে আপনার ব্যবহার করা টেমপ্লেট এবং ট্রাভার্সাল কৌশলের উপর। FullTraversalConnector এর জন্য, নিম্নলিখিত পদ্ধতিগুলি ওভাররাইড করুন:

  • init() পদ্ধতি। যেকোনো ডেটা রিপোজিটরি সেট-আপ এবং ইনিশিয়ালাইজেশন করতে, init() মেথড ওভাররাইড করুন।

  • getAllDocs() পদ্ধতি। ডাটা রিপোজিটরির সমস্ত আইটেমকে অতিক্রম করতে এবং সূচী করতে, getAllDocs() পদ্ধতিটি ওভাররাইড করুন। এই পদ্ধতিটি প্রতিটি নির্ধারিত ট্রাভার্সালের জন্য একবার বলা হয় (আপনার কনফিগারেশন দ্বারা সংজ্ঞায়িত)।

  • (ঐচ্ছিক) getChanges() পদ্ধতি। যদি আপনার সংগ্রহস্থল পরিবর্তন সনাক্তকরণ সমর্থন করে, getChanges() পদ্ধতি ওভাররাইড করুন। পরিবর্তিত আইটেমগুলি পুনরুদ্ধার করতে এবং সেগুলিকে সূচী করার জন্য প্রতিটি নির্ধারিত ক্রমবর্ধমান ট্রাভার্সাল (আপনার কনফিগারেশন দ্বারা সংজ্ঞায়িত) এর জন্য এই পদ্ধতিটি একবার বলা হয়।

  • (ঐচ্ছিক) close() পদ্ধতি। আপনি যদি সংগ্রহস্থল পরিষ্কার করতে চান, close() পদ্ধতিটি ওভাররাইড করুন। সংযোগকারী বন্ধ করার সময় এই পদ্ধতিটি একবার বলা হয়।

Repository অবজেক্টের প্রতিটি পদ্ধতি কিছু ধরণের ApiOperation অবজেক্ট প্রদান করে। একটি ApiOperation অবজেক্ট আপনার সংগ্রহস্থলের প্রকৃত ইন্ডেক্সিং সঞ্চালনের জন্য একটি একক, বা সম্ভবত একাধিক, IndexingService.indexItem() কলের আকারে একটি ক্রিয়া সম্পাদন করে।

কাস্টম কনফিগারেশন পরামিতি পান

আপনার সংযোগকারীর কনফিগারেশন পরিচালনার অংশ হিসাবে, আপনাকে Configuration অবজেক্ট থেকে যেকোনো কাস্টম প্যারামিটার পেতে হবে। এই কাজটি সাধারণত Repository ক্লাসের init() পদ্ধতিতে করা হয়।

Configuration ক্লাসে একটি কনফিগারেশন থেকে বিভিন্ন ধরনের ডেটা পাওয়ার জন্য বিভিন্ন পদ্ধতি রয়েছে। প্রতিটি পদ্ধতি একটি ConfigValue অবজেক্ট প্রদান করে। তারপরে আপনি প্রকৃত মান পুনরুদ্ধার করতে ConfigValue অবজেক্টের get() পদ্ধতি ব্যবহার করবেন। FullTraversalSample থেকে নিম্নলিখিত স্নিপেটটি দেখায় কিভাবে একটি Configuration অবজেক্ট থেকে একটি একক কাস্টম পূর্ণসংখ্যা মান পুনরুদ্ধার করতে হয়:

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() ওভাররাইড করুন এবং আপনার সংগ্রহস্থল সূচী করুন। getAllDocs() পদ্ধতি একটি চেকপয়েন্ট গ্রহণ করে। প্রক্রিয়াটি বাধাগ্রস্ত হলে একটি নির্দিষ্ট আইটেমে সূচীকরণ পুনরায় শুরু করতে চেকপয়েন্ট ব্যবহার করা হয়। আপনার সংগ্রহস্থলের প্রতিটি আইটেমের জন্য, getAllDocs() পদ্ধতিতে এই পদক্ষেপগুলি সম্পাদন করুন:

  1. অনুমতি সেট করুন।
  2. আপনি যে আইটেমটি ইন্ডেক্স করছেন তার জন্য মেটাডেটা সেট করুন।
  3. মেটাডেটা এবং আইটেমকে একটি ইনডেক্সেবল RepositoryDoc এ একত্রিত করুন।
  4. getAllDocs() পদ্ধতি দ্বারা ফিরে আসা প্রতিটি সূচীযোগ্য আইটেমকে একটি পুনরাবৃত্তিকারীতে প্যাকেজ করুন। মনে রাখবেন getAllDocs() আসলে একটি CheckpointCloseableIterable প্রদান করে যা ApiOperation অবজেক্টের একটি পুনরাবৃত্তি, প্রতিটি বস্তু একটি RepositoryDoc এ সম্পাদিত API অনুরোধের প্রতিনিধিত্ব করে, যেমন এটিকে ইন্ডেক্স করা।

যদি আইটেমগুলির সেটটি একটি একক কলে প্রক্রিয়া করার জন্য খুব বড় হয়, তাহলে একটি চেকপয়েন্ট অন্তর্ভুক্ত করুন এবং আরও আইটেমগুলিকে নির্দেশ করার জন্য hasMore(true) সেট করুন।

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

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

আপনাকে অবশ্যই আপনার সংগ্রহস্থলের দ্বারা ব্যবহৃত ACL-এর নকল করতে হবে যাতে শুধুমাত্র সেই সমস্ত ব্যবহারকারীরা যাতে কোনো আইটেমে অ্যাক্সেস থাকে সেই আইটেমটিকে একটি অনুসন্ধান ফলাফলের মধ্যে দেখতে পান। একটি আইটেমকে ইন্ডেক্স করার সময় একটি আইটেমের ACL অবশ্যই অন্তর্ভুক্ত করতে হবে যাতে Google ক্লাউড অনুসন্ধানের কাছে আইটেমটিতে সঠিক স্তরের অ্যাক্সেস প্রদানের জন্য প্রয়োজনীয় তথ্য থাকে৷

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

দ্রষ্টব্য: ক্লাউড অনুসন্ধান ইন্ডেক্সিং API একক-ডোমেন ACL সমর্থন করে। এটি ক্রস-ডোমেন ACL সমর্থন করে না। একটি ACL ব্যবহার করে প্রতিটি আইটেমে অ্যাক্সেস সেট করতে 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();

সংগ্রহস্থলের জন্য ACLs সঠিকভাবে মডেল করার জন্য আপনাকে ACL বুঝতে হবে। উদাহরণস্বরূপ, আপনি একটি ফাইল সিস্টেমের মধ্যে ফাইলগুলিকে ইন্ডেক্সিং করতে পারেন যা কিছু ধরণের উত্তরাধিকার মডেল ব্যবহার করে যেখানে শিশু ফোল্ডারগুলি পিতামাতার ফোল্ডারগুলি থেকে অনুমতি পায়৷ মডেলিং ACL উত্তরাধিকারের জন্য Google ক্লাউড অনুসন্ধান ACL- তে কভার করা অতিরিক্ত তথ্যের প্রয়োজন

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

মেটাডেটা একটি Item অবজেক্টে সংরক্ষণ করা হয়। একটি Item তৈরি করতে, আপনার আইটেমের জন্য একটি অনন্য স্ট্রিং আইডি, আইটেমের প্রকার, ACL, URL এবং সংস্করণ প্রয়োজন৷ নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে IndexingItemBuilder সহায়ক ক্লাস ব্যবহার করে একটি Item তৈরি করতে হয়।

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() পদ্ধতি একটি Iterator প্রদান করে, বিশেষ করে একটি CheckpointCloseableIterable , RepositoryDoc অবজেক্টের। আপনি একটি পুনরাবৃত্তিকারী তৈরি করতে এবং ফেরত দিতে CheckpointClosableIterableImpl.Builder ক্লাস ব্যবহার করতে পারেন। নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে একটি পুনরাবৃত্ত তৈরি এবং ফেরত দিতে হয়।

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

SDK প্রতিটি ইন্ডেক্সিং কল ইটারেটরের মধ্যে আবদ্ধ করে।

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

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

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

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

ডক্সের এই বিভাগটি ListTraversalSample উদাহরণ থেকে কোড স্নিপেটগুলিকে বোঝায়।

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

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

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

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

পর্দার আড়ালে, SDK আপনার সংযোগকারীর main() পদ্ধতি Application.build কল করার পরে initConfig() পদ্ধতিতে কল করে। initConfig() পদ্ধতি:

  1. Configuration আরম্ভ করা হয়নি তা নিশ্চিত করতে Configuation.isInitialized() পদ্ধতিতে কল করে।
  2. Google-প্রদত্ত কী-মান জোড়া দিয়ে একটি Configuration অবজেক্ট শুরু করে। প্রতিটি কী-মান জোড়া Configuration অবজেক্টের মধ্যে একটি ConfigValue অবজেক্টে সংরক্ষণ করা হয়।

Repository ইন্টারফেস বাস্তবায়ন

Repository অবজেক্টের একমাত্র উদ্দেশ্য হল রিপোজিটরি আইটেমগুলির ট্রাভার্সাল এবং ইনডেক্সিং করা। একটি টেমপ্লেট ব্যবহার করার সময়, একটি বিষয়বস্তু সংযোগকারী তৈরি করতে আপনার শুধুমাত্র Repository ইন্টারফেসের মধ্যে নির্দিষ্ট কিছু পদ্ধতি ওভাররাইড করতে হবে। আপনি যে পদ্ধতিগুলিকে ওভাররাইড করেন তা নির্ভর করে আপনার ব্যবহার করা টেমপ্লেট এবং ট্রাভার্সাল কৌশলের উপর। ListingConnector জন্য, নিম্নলিখিত পদ্ধতিগুলি ওভাররাইড করুন:

  • init() পদ্ধতি। যেকোনো ডেটা রিপোজিটরি সেট-আপ এবং ইনিশিয়ালাইজেশন করতে, init() মেথড ওভাররাইড করুন।

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

  • getDoc() পদ্ধতি। ইনডেক্স থেকে আইটেমগুলি নতুন যোগ করতে, আপডেট করতে, পরিবর্তন করতে বা মুছতে, getDoc() পদ্ধতিটি ওভাররাইড করুন৷

  • (ঐচ্ছিক) getChanges() পদ্ধতি। যদি আপনার সংগ্রহস্থল পরিবর্তন সনাক্তকরণ সমর্থন করে, getChanges() পদ্ধতি ওভাররাইড করুন। পরিবর্তিত আইটেমগুলি পুনরুদ্ধার করতে এবং সেগুলিকে সূচী করার জন্য প্রতিটি নির্ধারিত ক্রমবর্ধমান ট্রাভার্সাল (আপনার কনফিগারেশন দ্বারা সংজ্ঞায়িত) এর জন্য এই পদ্ধতিটি একবার বলা হয়।

  • (ঐচ্ছিক) close() পদ্ধতি। আপনি যদি সংগ্রহস্থল পরিষ্কার করতে চান, close() পদ্ধতিটি ওভাররাইড করুন। সংযোগকারী বন্ধ করার সময় এই পদ্ধতিটি একবার বলা হয়।

Repository অবজেক্টের প্রতিটি পদ্ধতি কিছু ধরণের ApiOperation অবজেক্ট প্রদান করে। একটি ApiOperation অবজেক্ট আপনার সংগ্রহস্থলের প্রকৃত ইন্ডেক্সিং সঞ্চালনের জন্য একটি একক, বা সম্ভবত একাধিক, IndexingService.indexItem() কলের আকারে একটি ক্রিয়া সম্পাদন করে।

কাস্টম কনফিগারেশন পরামিতি পান

আপনার সংযোগকারীর কনফিগারেশন পরিচালনার অংশ হিসাবে, আপনাকে Configuration অবজেক্ট থেকে যেকোনো কাস্টম প্যারামিটার পেতে হবে। এই কাজটি সাধারণত Repository ক্লাসের init() পদ্ধতিতে করা হয়।

Configuration ক্লাসে একটি কনফিগারেশন থেকে বিভিন্ন ধরনের ডেটা পাওয়ার জন্য বিভিন্ন পদ্ধতি রয়েছে। প্রতিটি পদ্ধতি একটি ConfigValue অবজেক্ট প্রদান করে। তারপরে আপনি প্রকৃত মান পুনরুদ্ধার করতে ConfigValue অবজেক্টের get() পদ্ধতি ব্যবহার করবেন। FullTraversalSample থেকে নিম্নলিখিত স্নিপেটটি দেখায় কিভাবে একটি Configuration অবজেক্ট থেকে একটি একক কাস্টম পূর্ণসংখ্যা মান পুনরুদ্ধার করতে হয়:

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

তালিকা ট্রাভার্সাল সঞ্চালন

রিপোজিটরির সমস্ত রেকর্ডের জন্য আইডি এবং হ্যাশ মান পুনরুদ্ধার করতে getIds() পদ্ধতি ওভাররাইড করুন। getIds() পদ্ধতি একটি চেকপয়েন্ট গ্রহণ করে। প্রক্রিয়াটি বাধাগ্রস্ত হলে একটি নির্দিষ্ট আইটেমে সূচীকরণ পুনরায় শুরু করতে চেকপয়েন্ট ব্যবহার করা হয়।

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

পুশ আইটেম আইডি এবং হ্যাশ মান

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

getIds() পদ্ধতিটি একটি চেকপয়েন্ট গ্রহণ করে যা সূচীকৃত শেষ আইটেমটিকে উপস্থাপন করে। প্রক্রিয়াটি বাধাগ্রস্ত হলে একটি নির্দিষ্ট আইটেমে সূচীকরণ পুনরায় শুরু করতে চেকপয়েন্ট ব্যবহার করা যেতে পারে। আপনার সংগ্রহস্থলের প্রতিটি আইটেমের জন্য, getIds() পদ্ধতিতে এই পদক্ষেপগুলি সম্পাদন করুন:

  • সংগ্রহস্থল থেকে প্রতিটি আইটেম আইডি এবং সংশ্লিষ্ট হ্যাশ মান পান।
  • একটি PushItems মধ্যে প্রতিটি ID এবং হ্যাশ মান জোড়া প্যাকেজ.
  • getIds() পদ্ধতি দ্বারা প্রত্যাবর্তিত একটি পুনরাবৃত্তিকারীতে প্রতিটি PushItems একত্রিত করুন। লক্ষ্য করুন যে getIds() আসলে একটি CheckpointCloseableIterable ফেরত দেয় যা ApiOperation অবজেক্টের একটি পুনরাবৃত্তি, প্রতিটি বস্তু একটি RepositoryDoc এ সম্পাদিত একটি API অনুরোধের প্রতিনিধিত্ব করে, যেমন আইটেমগুলিকে সারিতে পুশ করা।

নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে প্রতিটি আইটেম আইডি এবং হ্যাশ মান পেতে হয় এবং একটি PushItems এ প্রবেশ করান। একটি PushItems হল একটি ApiOperation অনুরোধ যাতে একটি আইটেমকে ক্লাউড সার্চ ইনডেক্সিং সারিতে পুশ করা যায়।

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 ক্লাস ব্যবহার করে আইডি এবং হ্যাশ মানগুলিকে একটি একক পুশ ApiOperation এ প্যাকেজ করতে হয়।

ListTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();
return iterator;

আরও প্রক্রিয়াকরণের জন্য আইটেমগুলিকে ক্লাউড সার্চ ইনডেক্সিং সারিতে পুশ করা হয়।

প্রতিটি আইটেম পুনরুদ্ধার এবং পরিচালনা করুন

ক্লাউড সার্চ ইন্ডেক্সিং সারিতে প্রতিটি আইটেম পরিচালনা করতে getDoc() ওভাররাইড করুন। একটি আইটেম নতুন, পরিবর্তিত, অপরিবর্তিত হতে পারে বা উৎস সংগ্রহস্থলে আর থাকতে পারে না। নতুন বা পরিবর্তিত প্রতিটি আইটেম পুনরুদ্ধার এবং সূচী করুন। সূচী থেকে আইটেমগুলি সরান যা উৎস সংগ্রহস্থলে আর বিদ্যমান নেই।

getDoc() পদ্ধতি Google ক্লাউড সার্চ ইনডেক্সিং সারি থেকে একটি আইটেম গ্রহণ করে। সারিতে থাকা প্রতিটি আইটেমের জন্য, getDoc() পদ্ধতিতে এই পদক্ষেপগুলি সম্পাদন করুন:

  1. ক্লাউড সার্চ ইনডেক্সিং সারির মধ্যে আইটেমটির আইডি রিপোজিটরিতে আছে কিনা তা পরীক্ষা করুন। যদি না হয়, সূচক থেকে আইটেম মুছে ফেলুন.

  2. আইটেম স্থিতির জন্য সূচী পোল করুন এবং, যদি একটি আইটেম অপরিবর্তিত থাকে ( ACCEPTED ), কিছু করবেন না৷

  3. সূচক পরিবর্তিত বা নতুন আইটেম:

    1. অনুমতি সেট করুন।
    2. আপনি যে আইটেমটি ইন্ডেক্স করছেন তার জন্য মেটাডেটা সেট করুন।
    3. মেটাডেটা এবং আইটেমকে একটি ইনডেক্সেবল RepositoryDoc এ একত্রিত করুন।
    4. RepositoryDoc ফেরত দিন।

দ্রষ্টব্য: ListingConnector টেমপ্লেট getDoc() পদ্ধতিতে null রিটার্নিং সমর্থন করে না। null রিটার্ন করলে একটি NullPointerException.

মুছে ফেলা আইটেমগুলি পরিচালনা করুন

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

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

নোট করুন যে documents হল একটি ডেটা কাঠামো যা সংগ্রহস্থলের প্রতিনিধিত্ব করে। documents documentID না পাওয়া গেলে, সূচী থেকে আইটেমটি মুছে ফেলতে APIOperations.deleteItem(resourceName) ফেরত দিন।

অপরিবর্তিত আইটেমগুলি পরিচালনা করুন

নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে ক্লাউড সার্চ ইনডেক্সিং সারিতে পোল আইটেম স্ট্যাটাস এবং একটি অপরিবর্তিত আইটেম পরিচালনা করতে হয়।

ListTraversalSample.java
String currentHash = this.calculateMetadataHash(documentId);
if (this.canSkipIndexing(item, currentHash)) {
  // Document neither modified nor deleted, ack the push
  log.info(() -> String.format("Document %s not modified", item.getName()));
  PushItem pushItem = new PushItem().setType("NOT_MODIFIED");
  return new PushItems.Builder().addPushItem(resourceName, pushItem).build();
}

আইটেমটি অপরিবর্তিত কিনা তা নির্ধারণ করতে, আইটেমের স্থিতির পাশাপাশি অন্যান্য মেটাডেটাও পরীক্ষা করুন যা একটি পরিবর্তন নির্দেশ করতে পারে। উদাহরণে, আইটেমটি পরিবর্তন করা হয়েছে কিনা তা নির্ধারণ করতে মেটাডেটা হ্যাশ ব্যবহার করা হয়।

ListTraversalSample.java
/**
 * Checks to see if an item is already up to date
 *
 * @param previousItem Polled item
 * @param currentHash  Metadata hash of the current github object
 * @return PushItem operation
 */
private boolean canSkipIndexing(Item previousItem, String currentHash) {
  if (previousItem.getStatus() == null || previousItem.getMetadata() == null) {
    return false;
  }
  String status = previousItem.getStatus().getCode();
  String previousHash = previousItem.getMetadata().getHash();
  return "ACCEPTED".equals(status)
      && previousHash != null
      && previousHash.equals(currentHash);
}

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

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

আপনাকে অবশ্যই আপনার সংগ্রহস্থলের দ্বারা ব্যবহৃত ACL-এর নকল করতে হবে যাতে শুধুমাত্র সেই সমস্ত ব্যবহারকারীরা যাতে কোনো আইটেমে অ্যাক্সেস থাকে সেই আইটেমটিকে একটি অনুসন্ধান ফলাফলের মধ্যে দেখতে পান। একটি আইটেমকে ইন্ডেক্স করার সময় একটি আইটেমের ACL অবশ্যই অন্তর্ভুক্ত করতে হবে যাতে Google ক্লাউড অনুসন্ধানের কাছে আইটেমটিতে সঠিক স্তরের অ্যাক্সেস প্রদানের জন্য প্রয়োজনীয় তথ্য থাকে৷

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

দ্রষ্টব্য: ক্লাউড অনুসন্ধান ইন্ডেক্সিং API একক-ডোমেন ACL সমর্থন করে। এটি ক্রস-ডোমেন ACL সমর্থন করে না। একটি ACL ব্যবহার করে প্রতিটি আইটেমে অ্যাক্সেস সেট করতে 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();

সংগ্রহস্থলের জন্য ACLs সঠিকভাবে মডেল করার জন্য আপনাকে ACL বুঝতে হবে। উদাহরণস্বরূপ, আপনি একটি ফাইল সিস্টেমের মধ্যে ফাইলগুলিকে ইন্ডেক্সিং করতে পারেন যা কিছু ধরণের উত্তরাধিকার মডেল ব্যবহার করে যেখানে শিশু ফোল্ডারগুলি পিতামাতার ফোল্ডারগুলি থেকে অনুমতি পায়৷ মডেলিং ACL উত্তরাধিকারের জন্য Google ক্লাউড অনুসন্ধান ACL- তে কভার করা অতিরিক্ত তথ্যের প্রয়োজন

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

মেটাডেটা একটি Item অবজেক্টে সংরক্ষণ করা হয়। একটি Item তৈরি করতে, আপনার আইটেমের জন্য একটি অনন্য স্ট্রিং আইডি, আইটেমের ধরন, ACL, URL এবং সংস্করণ প্রয়োজন৷ নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে IndexingItemBuilder সহায়ক ক্লাস ব্যবহার করে একটি Item তৈরি করতে হয়।

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

একটি সূচীযোগ্য আইটেম তৈরি করুন

একবার আপনি আইটেমের জন্য মেটাডেটা সেট করলে, আপনি RepositoryDoc.Builder ব্যবহার করে প্রকৃত সূচীযোগ্য আইটেম তৈরি করতে পারেন। নিম্নলিখিত উদাহরণ দেখায় কিভাবে একটি একক সূচীযোগ্য আইটেম তৈরি করতে হয়।

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 হল এক ধরনের ApiOperation যা প্রকৃত IndexingService.indexItem() অনুরোধ সম্পাদন করে।

আপনি সূচীকরণের অনুরোধটিকে ASYNCHRONOUS বা SYNCHRONOUS হিসাবে চিহ্নিত করতে RepositoryDoc.Builder ক্লাসের setRequestMode() পদ্ধতিটিও ব্যবহার করতে পারেন:

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

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

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

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

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

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

ডক্সের এই বিভাগটি GraphTraversalSample উদাহরণ থেকে কোড স্নিপেটগুলিকে বোঝায়।

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

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

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

নিম্নলিখিত স্নিপেট দেখায় কিভাবে ListingConnector এবং এর সাথে সম্পর্কিত Repository ইনস্ট্যান্টিয়েট করতে হয়:

GraphTraversalSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a graph
 * 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();
}

পর্দার আড়ালে, SDK আপনার সংযোগকারীর main() পদ্ধতি Application.build কল করার পরে initConfig() পদ্ধতিতে কল করে। initConfig() পদ্ধতি:

  1. Configuration আরম্ভ করা হয়নি তা নিশ্চিত করতে Configuation.isInitialized() পদ্ধতিতে কল করে।
  2. Google-প্রদত্ত কী-মান জোড়া দিয়ে একটি Configuration অবজেক্ট শুরু করে। প্রতিটি কী-মান জোড়া Configuration অবজেক্টের মধ্যে একটি ConfigValue অবজেক্টে সংরক্ষণ করা হয়।

Repository ইন্টারফেস বাস্তবায়ন

Repository অবজেক্টের একমাত্র উদ্দেশ্য হল রিপোজিটরি আইটেমগুলির ট্রাভার্সাল এবং ইনডেক্সিং করা। একটি টেমপ্লেট ব্যবহার করার সময়, একটি বিষয়বস্তু সংযোগকারী তৈরি করতে আপনার শুধুমাত্র Repository ইন্টারফেসের মধ্যে নির্দিষ্ট কিছু পদ্ধতি ওভাররাইড করতে হবে। আপনি যে পদ্ধতিগুলিকে ওভাররাইড করেন তা নির্ভর করে আপনার ব্যবহার করা টেমপ্লেট এবং ট্রাভার্সাল কৌশলের উপর। ListingConnector জন্য, আপনি নিম্নলিখিত পদ্ধতিগুলিকে ওভাররাইড করবেন:

  • init() পদ্ধতি। যেকোনো ডেটা রিপোজিটরি সেট-আপ এবং ইনিশিয়ালাইজেশন করতে, init() মেথড ওভাররাইড করুন।

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

  • getDoc() পদ্ধতি। ইনডেক্স থেকে আইটেমগুলি নতুন যোগ করতে, আপডেট করতে, পরিবর্তন করতে বা মুছতে, getDoc() পদ্ধতিটি ওভাররাইড করুন৷

  • (ঐচ্ছিক) getChanges() পদ্ধতি। যদি আপনার সংগ্রহস্থল পরিবর্তন সনাক্তকরণ সমর্থন করে, getChanges() পদ্ধতি ওভাররাইড করুন। পরিবর্তিত আইটেমগুলি পুনরুদ্ধার করতে এবং সেগুলিকে সূচী করার জন্য প্রতিটি নির্ধারিত ক্রমবর্ধমান ট্রাভার্সাল (আপনার কনফিগারেশন দ্বারা সংজ্ঞায়িত) এর জন্য এই পদ্ধতিটি একবার বলা হয়।

  • (ঐচ্ছিক) close() পদ্ধতি। আপনি যদি সংগ্রহস্থল পরিষ্কার করতে চান, close() পদ্ধতিটি ওভাররাইড করুন। সংযোগকারী বন্ধ করার সময় এই পদ্ধতিটি একবার বলা হয়।

Repository অবজেক্টের প্রতিটি পদ্ধতি কিছু ধরণের ApiOperation অবজেক্ট প্রদান করে। একটি ApiOperation অবজেক্ট আপনার সংগ্রহস্থলের প্রকৃত ইন্ডেক্সিং সঞ্চালনের জন্য একটি একক, বা সম্ভবত একাধিক, IndexingService.indexItem() কলের আকারে একটি ক্রিয়া সম্পাদন করে।

কাস্টম কনফিগারেশন পরামিতি পান

আপনার সংযোগকারীর কনফিগারেশন পরিচালনার অংশ হিসাবে, আপনাকে Configuration অবজেক্ট থেকে যেকোনো কাস্টম প্যারামিটার পেতে হবে। এই কাজটি সাধারণত Repository ক্লাসের init() পদ্ধতিতে করা হয়।

Configuration ক্লাসে একটি কনফিগারেশন থেকে বিভিন্ন ধরনের ডেটা পাওয়ার জন্য বিভিন্ন পদ্ধতি রয়েছে। প্রতিটি পদ্ধতি একটি ConfigValue অবজেক্ট প্রদান করে। তারপরে আপনি প্রকৃত মান পুনরুদ্ধার করতে ConfigValue অবজেক্টের get() পদ্ধতি ব্যবহার করবেন। FullTraversalSample থেকে নিম্নলিখিত স্নিপেটটি দেখায় কিভাবে একটি Configuration অবজেক্ট থেকে একটি একক কাস্টম পূর্ণসংখ্যা মান পুনরুদ্ধার করতে হয়:

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

গ্রাফ ট্রাভার্সাল সঞ্চালন

রিপোজিটরির সমস্ত রেকর্ডের জন্য আইডি এবং হ্যাশ মান পুনরুদ্ধার করতে getIds() পদ্ধতি ওভাররাইড করুন। getIds() পদ্ধতি একটি চেকপয়েন্ট গ্রহণ করে। প্রক্রিয়াটি বাধাগ্রস্ত হলে একটি নির্দিষ্ট আইটেমে সূচীকরণ পুনরায় শুরু করতে চেকপয়েন্ট ব্যবহার করা হয়।

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

পুশ আইটেম আইডি এবং হ্যাশ মান

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

getIds() পদ্ধতিটি একটি চেকপয়েন্ট গ্রহণ করে যা সূচীকৃত শেষ আইটেমটিকে উপস্থাপন করে। প্রক্রিয়াটি বাধাগ্রস্ত হলে একটি নির্দিষ্ট আইটেমে সূচীকরণ পুনরায় শুরু করতে চেকপয়েন্ট ব্যবহার করা যেতে পারে। আপনার সংগ্রহস্থলের প্রতিটি আইটেমের জন্য, getIds() পদ্ধতিতে এই পদক্ষেপগুলি সম্পাদন করুন:

  • সংগ্রহস্থল থেকে প্রতিটি আইটেম আইডি এবং সংশ্লিষ্ট হ্যাশ মান পান।
  • একটি PushItems মধ্যে প্রতিটি ID এবং হ্যাশ মান জোড়া প্যাকেজ.
  • getIds() পদ্ধতি দ্বারা প্রত্যাবর্তিত একটি পুনরাবৃত্তিকারীতে প্রতিটি PushItems একত্রিত করুন। Note that getIds() actually returns a CheckpointCloseableIterable which is an iteration of ApiOperation objects, each object representing an API request performed on a RepositoryDoc , such as push the items to the queue.

The following code snippet shows how to get each item ID and hash value and insert them into a PushItems . A PushItems is an ApiOperation request to push an item to the Cloud Search Indexing Queue.

GraphTraversalSample.java
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);

The following code snippet shows how to use the PushItems.Builder class to package the IDs and hash values into a single push ApiOperation .

GraphTraversalSample.java
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();

Items are pushed to the Cloud Search Indexing Queue for further processing.

Retrieve and handle each item

Override getDoc() to handle each item in the Cloud Search Indexing Queue. An item can be new, modified, unchanged, or can no longer exist in the source repository. Retrieve and index each item that is new or modified. Remove items from the index that no longer exist in the source repository.

The getDoc() method accepts an Item from the Cloud Search Indexing Queue. For each item in the queue, perform these steps in the getDoc() method:

  1. Check if the item's ID, within the Cloud Search Indexing Queue, exists in the repository. If not, delete the item from the index. If the item does exist, continue with the next step.

  2. Index changed or new items:

    1. Set the permissions.
    2. Set the metadata for the item that you are indexing.
    3. Combine the metadata and item into one indexable RepositoryDoc .
    4. Place the child IDs in the Cloud Search Indexing Queue for further processing.
    5. Return the RepositoryDoc .

Handle deleted items

The following code snippet shows how to determine if an item exists in the index and, it not, delete it.

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 the permissions for an item

Your repository uses an Access Control List (ACL) to identify the users or groups that have access to an item. An ACL is a list of IDs for groups or users who can access the item.

You must duplicate the ACL used by your repository to ensure only those users with access to an item can see that item within a search result. The ACL for an item must be included when indexing an item so that Google Cloud Search has the information it needs to provide the correct level of access to the item.

The Content Connector SDK provides a rich set of ACL classes and methods to model the ACLs of most repositories. You must analyze the ACL for each item in your repository and create a corresponding ACL for Google Cloud Search when you index an item. If your repository's ACL employs concepts such as ACL inheritance, modeling that ACL can be tricky. For further information on Google Cloud Search ACLs, refer to Google Cloud Search ACLs .

Note: The Cloud Search Indexing API supports single-domain ACLs. It does not support cross-domain ACLs. Use the Acl.Builder class to set access to each item using an ACL. The following code snippet, taken from the full traversal sample, allows all users or “principals” ( getCustomerPrincipal() ) to be “readers” of all items ( .setReaders() ) when performing a search.

FullTraversalSample.java
// Make the document publicly readable within the domain
Acl acl = new Acl.Builder()
    .setReaders(Collections.singletonList(Acl.getCustomerPrincipal()))
    .build();

You need to understand ACLs to properly model ACLs for the repository. For example, you might be indexing files within a file system that uses some sort of inheritance model whereby child folders inherit permissions from parent folders. Modeling ACL inheritance requires additional information covered in Google Cloud Search ACLs

Set the metadata for an item

Metadata is stored in an Item object. To create an Item , you need a minimum of a unique string ID, item type, ACL, URL, and version for the item. The following code snippet shows how to build an Item using the IndexingItemBuilder helper class.

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

Create the indexable item

Once you have set the metadata for the item, you can create the actual indexable item using the RepositoryDoc.Builder . The following example shows how to create a single indexable item.

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

A RepositoryDoc is a type of ApiOperation that performs the actual IndexingService.indexItem() request.

You can also use the setRequestMode() method of the RepositoryDoc.Builder class to identify the indexing request as ASYNCHRONOUS or SYNCHRONOUS :

ASYNCHRONOUS
Asynchronous mode results in longer indexing-to-serving latency and accommodates large throughput quota for indexing requests. Asynchronous mode is recommended for initial indexing (backfill) of the entire repository.
SYNCHRONOUS
Synchronous mode results in shorter indexing-to-serving latency and accommodates limited throughput quota. Synchronous mode is recommended for indexing of updates and changes to the repository. If unspecified, the request mode defaults to SYNCHRONOUS .

Place the child IDs in the Cloud Search Indexing Queue

The following code snippet shows how to include the child IDs, for the currently processing parent item, into the queue for processing. These IDs are processed after the parent item is indexed.

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 primary function of a content connector is to traverse a repository and index its data. You must implement a traversal strategy based on the size and layout of data in your repository. Following are three common traversal strategies:

Full traversal strategy

A full traversal strategy scans the entire repository and blindly indexes every item. This strategy is commonly used when you have a small repository and can afford the overhead of doing a full traversal every time you index.

This traversal strategy is suitable for small repositories with mostly static, non-hierarchical, data. You might also use this traversal strategy when change detection is difficult or not supported by the repository.

List traversal strategy

A list traversal strategy scans the entire repository, including all child nodes, determining the status of each item. Then, the connector takes a second pass and only indexes items that are new or have been updated since the last indexing. This strategy is commonly used to perform incremental updates to an existing index (instead of having to do a full traversal every time you update the index).

This traversal strategy is suitable when change detection is difficult or not supported by the repository, you have non-hierarchical data, and you are working with very large data sets.

গ্রাফ ট্রাভার্সাল

A graph traversal strategy scans the entire parent node determining the status of each item. Then, the connector takes a second pass and only indexes items in the root node are new or have been updated since the last indexing. Finally, the connector passes any child IDs then indexes items in the child nodes that are new or have been updated. The connector continues recursively through all child nodes until all items have been addressed. Such traversal is typically used for hierarchical repositories where listing of all IDs isn't practical.

This strategy is suitable if you have hierarchical data that needs to be crawled, such as a series directories or web pages.

Implement your traversal strategy and index items

Every indexable element for Cloud Search is referred to as an item in the Cloud Search API. An item might be a file, folder, a line in a CSV file, or a database record.

Once your schema is registered, you can populate the index by:

  1. (optional) Using items.upload to upload files larger than 100KiB for indexing. For smaller files, embed the content as inlineContent using items.index .

  2. (optional) Using media.upload to upload media files for indexing.

  3. Using items.index to index the item. For example, if your schema uses the object definition in the movie schema , an indexing request for a single item would look like this:

    {
      "name": "datasource/<data_source_id>/items/titanic",
      "acl": {
        "readers": [
          {
            "gsuitePrincipal": {
              "gsuiteDomain": true
            }
          }
        ]
      },
      "metadata": {
        "title": "Titanic",
        "viewUrl": "http://www.imdb.com/title/tt2234155/?ref_=nv_sr_1",
        "objectType": "movie"
      },
      "structuredData": {
        "object": {
          "properties": [
            {
              "name": "movieTitle",
              "textValues": {
                "values": [
                  "Titanic"
                ]
              }
            },
            {
              "name": "releaseDate",
              "dateValues": {
                "values": [
                  {
                    "year": 1997,
                    "month": 12,
                    "day": 19
                  }
                ]
              }
            },
            {
              "name": "actorName",
              "textValues": {
                "values": [
                  "Leonardo DiCaprio",
                  "Kate Winslet",
                  "Billy Zane"
                ]
              }
            },
            {
              "name": "genre",
              "enumValues": {
                "values": [
                  "Drama",
                  "Action"
                ]
              }
            },
            {
              "name": "userRating",
              "integerValues": {
                "values": [
                  8
                ]
              }
            },
            {
              "name": "mpaaRating",
              "textValues": {
                "values": [
                  "PG-13"
                ]
              }
            },
            {
              "name": "duration",
              "textValues": {
                "values": [
                  "3 h 14 min"
                ]
              }
            }
          ]
        }
      },
      "content": {
        "inlineContent": "A seventeen-year-old aristocrat falls in love with a kind but poor artist aboard the luxurious, ill-fated R.M.S. Titanic.",
        "contentFormat": "TEXT"
      },
      "version": "01",
      "itemType": "CONTENT_ITEM"
    }
    
  4. (Optional) Using items.get calls to verify an item has been indexed.

To perform a full traversal, you would periodically reindex the entire repository. To perform a list or graph traversal, you need to implement code to handle repository changes .

Handle repository changes

You can periodically gather and index each item from a repository to perform a full indexing. While effective at ensuring your index is up-to-date, a full indexing can be costly when dealing with larger or hierarchical repositories.

Instead of using index calls to index an entire repository every so often, you can also use the Google Cloud Indexing Queue as a mechanism for tracking changes and only indexing those items that have changed. You can use the items.push requests to push items into the queue for later polling and updating. For more information on the Google Cloud Indexing Queue, refer to Google Cloud Indexing Queue .

For further information on the Google Cloud Search API, refer to Cloud Search API .