ক্যোয়ারী বনাম ফিল্টার


198

কখন আমার কোনও ক্যোয়ারী বা ফিল্টার বা দুটির কোনও সংমিশ্রণ ব্যবহার করা উচিত তার কোনও বিবরণ দেখতে পাচ্ছি না। তাদের মধ্যে পার্থক্য কী? কেউ দয়া করে ব্যাখ্যা করতে পারেন?


46
অফিসিয়াল ডকুমেন্টেশন বাস্তবে খুব স্পষ্ট নয়
গিকিজয়েড

2
দেখে মনে হচ্ছে আরও অগ্রণী ব্যাখ্যার সাথে একটি পৃষ্ঠা হাজির হয়েছে: elastic.co/guide/en/elasticsearch/guide/master/…
দিমিত্রি পোল্শকিন

6
যে মূল্য প্রশ্নের এবং ফিল্টার মার্জ করা হবে , ES 2.0 এর মধ্যে অত: পর কি হয়েছে অধিকাংশ বলেছেন প্রশ্নের জন্য লিখিত বনাম ফিল্টার আর প্রযোজ্য হবে না। এছাড়াও এই পরিবর্তনটি ঘোষণা করে অফিসিয়াল ব্লগ পোস্টটি দেখুন
Val,

উত্তর:


201

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


19
ঠিক তাই, যদি ব্যবহারকারী কোনও গুগল টাইপ অনুসন্ধান করে থাকে তবে আমি কি কোয়েরি ব্যবহার করব? যদি তারা একটি ড্রপ ডাউন থেকে সম্ভাব্য মানটি বেছে নিচ্ছে (যেমন, চালান গণনা> 50) তবে এটি কি ফিল্টার হবে?
জোনসি

4
হ্যাঁ, এটা ঠিক। যে কোনও সময় আপনাকে কোনও মেট্রিক দ্বারা পুরো দস্তাবেজগুলির সীমাবদ্ধ করতে হবে, এটি সাধারণত একটি ফিল্টার উপযুক্ত a সুতরাং সম্ভবত বয়স, দৈর্ঘ্য, আকার, ইত্যাদি দ্বারা
Zach

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

@ জ্যাচ একেবারে পরিষ্কার হয়ে উঠতে, কোনও ভাড়াটে -র মধ্যে ব্যবহারকারীদের জন্য একাধিক ভাড়াটে সিস্টেমে অনুমতি থাকলে, মনে হয় ভাড়াটে / প্রমাণীকরণের তথ্য প্রতিটি ক্যোয়ারিতে (যেমন একটি ফিল্টারড ক্যোয়ারী) যুক্ত ফিল্টার হবে। রাইট?
স্কট উইলেকে

4
অ্যাক্টিভস্কট ইয়েপ, আমি যা করতাম আপনি ফিল্টারযুক্ত উপকরণগুলিও সেট আপ করতে পারেন যাতে "ব্যবহারকারীর নাম" সর্বদা যথাযথ ফিল্টার প্রয়োগ করে। প্রশাসনকে সহজ করে তোলে এবং কোয়েরিগুলি আপডেট করতে আপনার কোডে অতিরিক্ত ক্রাফ্ট ইত্যাদির জন্য কোড পরিবর্তন করার প্রয়োজন নেই
Zach

99

অফিসিয়াল ডকুমেন্টেশন এটাই বলে:

একটি সাধারণ নিয়ম হিসাবে, ফিল্টারগুলি কোয়েরির পরিবর্তে ব্যবহার করা উচিত:

  • বাইনারি জন্য হ্যাঁ / কোন অনুসন্ধান
  • সঠিক মান সম্পর্কিত প্রশ্নের জন্য

একটি সাধারণ নিয়ম হিসাবে, ক্যালিয়ারগুলি ফিল্টারগুলির পরিবর্তে ব্যবহার করা উচিত:

  • সম্পূর্ণ পাঠ্য অনুসন্ধানের জন্য
  • যেখানে ফলাফল নির্ভরযোগ্যতার স্কোরের উপর নির্ভর করে

আমি যখন নথি মুছতে চাই, আমি কি সম্ভব হলে ফিল্টার ব্যবহার করব? আমি এটি ক্যাশে করা চাই না
রাইটেক

কোনও দস্তাবেজ মোছার সময়, আপনার কোনও স্কোরের প্রয়োজন হবে না বা আপনার একটি পূর্ণ পাঠ্য অনুসন্ধানও করতে হবে না। সুতরাং এটির তুলনায় এটি একটি ফিল্টার হতে পারে, যেমন আপনার কেবল মুছে ফেলা / মুছার সিদ্ধান্তটি নেওয়া দরকার। ফিল্টার-ক্যোয়ারী-প্রসঙ্গ
অ সাংখ্যিক ফ্লোট

13

একটি উদাহরণ (নিজে চেষ্টা করুন)

বলুন সূচীতে myindexতিনটি নথি রয়েছে:

curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world!" }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hello world! I am Sam." }'
curl -XPOST localhost:9200/myindex/mytype  -d '{ "msg": "Hi Stack Overflow!" }'

ক্যোয়ারী: একটি ডকুমেন্ট কোয়েরির সাথে কতটা ভাল মেলে

অনুসন্ধান hello sam(কীওয়ার্ড ব্যবহার করে must)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "must": { "match": { "msg": "hello sam" }}}}
}'

ডকুমেন্টের "Hello world! I am Sam."চেয়ে বেশি স্কোর বরাদ্দ করা হয়েছে "Hello world!", কারণ পূর্বের কোয়েরিতে দুটি শব্দই মিলে। দলিল স্কোর হয়।

"hits" : [
   ...
     "_score" : 0.74487394,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...
     "_score" : 0.22108285,
     "_source" : {
       "name" : "Hello world!"
     }
   ...

ফিল্টার: কোনও দস্তাবেজ কোয়েরির সাথে মেলে কিনা

ফিল্টার hello sam(কীওয়ার্ড ব্যবহার করে filter)

curl localhost:9200/myindex/_search?pretty  -d '
{
  "query": { "bool": { "filter": { "match": { "msg": "hello sam" }}}}
}'

যেগুলি নথিতে থাকে helloবা হয় samতা ফেরত দেওয়া হয়। নথি স্কোর হয় না

"hits" : [
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world!"
     }
   ...
     "_score" : 0.0,
     "_source" : {
       "name" : "Hello world! I am Sam."
     }
   ...

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


11

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

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

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


1
মজাদার! ফিল্টারগুলি ক্যোয়ারির আগে ঘটেছিল তা আমি বুঝতে পারি নি। ফিল্টারগুলির ক্যাচিং এখন আরও বোধগম্য।
কনস্ট্যান্ট মাইরিং

সবসময় না। ফিল্টার করা এবং ধ্রুবক স্কোর ক্যোয়ারির মধ্যে প্রাথমিক এবং প্রাথমিক পার্থক্য। ধ্রুব স্কোর সর্বদা প্রথমে ক্যোয়ারি চালায় এবং তারপরে এটি ফিল্টার প্রয়োগ করে। এমনকি ফিল্টার করা ক্যোয়ারীর এমন সেটিংস রয়েছে যার দ্বারা ক্যোয়ারি ফিল্টারগুলির আগে কার্যকর করতে পারে।
পিয়ুশগোয়াল

10

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

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

সুতরাং আপনি "পিজ্জা" সম্বলিত সমস্ত দস্তাবেজ অনুসন্ধান করতে কোয়েরি ব্যবহার করবেন এবং কিছু ফলাফল পাবেন।

এখনই আপনি রেস্তোঁরাগুলির তালিকা চান যা পিজ্জা পরিবেশন করে এবং ন্যূনতম 4.0 এর রেটিং রয়েছে has

সুতরাং আপনাকে যা করতে হবে তা হল আপনার ক্যোয়ারীতে "পিজ্জা" কীওয়ার্ডটি ব্যবহার করুন এবং ৪.০ হিসাবে রেটিংয়ের জন্য ফিল্টার প্রয়োগ করুন।

যা হয় তা হ'ল ফিল্টারগুলি সাধারণত আপনার সূচকে জিজ্ঞাসা করে প্রাপ্ত ফলাফলগুলিতে প্রয়োগ করা হয়।


আপনি একটি অনুরোধ বডি একটি উদাহরণ প্রদান করতে পারেন?
কুকুর

9

Filters-> এই নথিটি কি মিলছে? একটি বাইনারি হ্যাঁ বা কোন উত্তর

Queries-> এই নথিটি কি মিলছে? এটি কতটা ভাল মেলে? স্কোরিং ব্যবহার করে


0

ইলাস্টিকসার্কের সংস্করণ 2-এর পরে, ফিল্টার এবং কোয়েরিগুলি একত্রীকরণ করা হয়েছে এবং কোনও কোয়েরি ক্লজ ফিল্টার বা কোয়েরি (প্রসঙ্গে নির্ভর করে) হিসাবে ব্যবহার করা যেতে পারে। সংস্করণ 1 এর মতো, ফিল্টারগুলি ক্যাশে করা হয় এবং স্কোরিংয়ের কোনও বিষয় না থাকলে এটি ব্যবহার করা উচিত।

সূত্র: https://logz.io/blog/elasticsearch-queries/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.