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

একটি বিষয়বস্তু সংযোগকারী একটি সফ্টওয়্যার প্রোগ্রাম যা একটি এন্টারপ্রাইজের সংগ্রহস্থলে ডেটা ট্র্যাভার্স করতে এবং একটি ডেটা উত্স তৈরি করতে ব্যবহৃত হয়। 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 একত্রিত করুন। নোট করুন যে getIds() প্রকৃতপক্ষে একটি CheckpointCloseableIterable ফেরত দেয় যা ApiOperation অবজেক্টগুলির একটি পুনরাবৃত্তি, প্রতিটি অবজেক্ট একটি এপিআই অনুরোধের প্রতিনিধিত্ব করে একটি RepositoryDoc -এ সঞ্চালিত হয়, যেমন আইটেমগুলিকে কাতারে ঠেলে দেয়।

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

গ্রাফট্রেভারসালামাল.জাভা
PushItems.Builder allIds = new PushItems.Builder();
PushItem item = new PushItem();
allIds.addPushItem("root", item);

নিম্নলিখিত কোড স্নিপেটটি দেখায় যে কীভাবে PushItems.Builder ক্লাসটি আইডিএস এবং হ্যাশ মানগুলিকে একক পুশ ApiOperation প্যাকেজ করতে ব্যবহার করতে হয়।

গ্রাফট্রেভারসালামাল.জাভা
ApiOperation pushOperation = allIds.build();
CheckpointCloseableIterable<ApiOperation> iterator =
  new CheckpointCloseableIterableImpl.Builder<>(
      Collections.singletonList(pushOperation))
  .build();

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

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

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

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

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

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

    1. অনুমতি সেট করুন।
    2. আপনি যে আইটেমটি সূচক করছেন তার জন্য মেটাডেটা সেট করুন।
    3. মেটাডেটা এবং আইটেমটিকে একটি সূচকযোগ্য RepositoryDoc একত্রিত করুন।
    4. আরও প্রক্রিয়াজাতকরণের জন্য ক্লাউড অনুসন্ধান ইনডেক্সিং কাতারে শিশু আইডি রাখুন।
    5. 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);

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

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

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

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

দ্রষ্টব্য: ক্লাউড অনুসন্ধান ইনডেক্সিং এপিআই একক-ডোমেন এসিএল সমর্থন করে। এটি ক্রস-ডোমেন এসিএলগুলিকে সমর্থন করে না। এসিএল ব্যবহার করে প্রতিটি আইটেম অ্যাক্সেস সেট করতে Acl.Builder ক্লাসটি ব্যবহার করুন। সম্পূর্ণ ট্র্যাভারসাল নমুনা থেকে নেওয়া নিম্নলিখিত কোড স্নিপেটটি সমস্ত ব্যবহারকারী বা "প্রিন্সিপাল" ( getCustomerPrincipal() ) অনুসন্ধান করার সময় সমস্ত আইটেমের "পাঠক" হতে দেয় ( .setReaders() )।

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

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

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

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

গ্রাফট্রেভারসালামাল.জাভা
// 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();

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

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

গ্রাফট্রেভারসালামাল.জাভা
// 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);

একটি RepositoryDoc হ'ল এক ধরণের ApiOperation যা প্রকৃত সূচকগুলি সম্পাদন করে IndexingService.indexItem() অনুরোধ।

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

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

ক্লাউড অনুসন্ধান ইনডেক্সিং সারিতে শিশু আইডি রাখুন

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

গ্রাফট্রেভারসালামাল.জাভা
// 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 এপিআই ব্যবহার করে কীভাবে একটি সামগ্রী সংযোগকারী তৈরি করবেন তা ব্যাখ্যা করে।

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

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

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

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

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

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

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

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

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

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

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

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

ক্লাউড অনুসন্ধানের জন্য প্রতিটি সূচকযোগ্য উপাদানকে ক্লাউড অনুসন্ধান এপিআইয়ের একটি আইটেম হিসাবে উল্লেখ করা হয়। কোনও আইটেম কোনও ফাইল, ফোল্ডার, সিএসভি ফাইলের একটি লাইন বা একটি ডাটাবেস রেকর্ড হতে পারে।

আপনার স্কিমা নিবন্ধিত হয়ে গেলে, আপনি সূচকটি দ্বারা তৈরি করতে পারেন:

  1. (al চ্ছিক) items.upload ব্যবহার করে। ইনডেক্সিংয়ের জন্য 100 কেআইবি এর চেয়ে বড় ফাইলগুলি আপলোড করতে আপলোড। ছোট ফাইলগুলির জন্য, items.index ব্যবহার করে ইনলাইন কনটেন্ট হিসাবে সামগ্রীটি এম্বেড করুন।

  2. (al চ্ছিক) সূচকগুলির জন্য মিডিয়া ফাইলগুলি আপলোড করতে 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/?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. (Al চ্ছিক) আইটেমগুলি ব্যবহার করে কোনও আইটেম যাচাই করার জন্য কল কলগুলি সূচকযুক্ত করা হয়েছে।

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

সংগ্রহস্থল পরিবর্তনগুলি পরিচালনা করুন

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

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

গুগল ক্লাউড অনুসন্ধান এপিআই সম্পর্কিত আরও তথ্যের জন্য, ক্লাউড অনুসন্ধান এপিআই দেখুন।