क्वेरी बनाम फिल्टर


198

जब मैं किसी प्रश्न या फ़िल्टर या दो के कुछ संयोजन का उपयोग करना चाहिए, तो मुझे कोई विवरण नहीं दिखाई दे सकता है। उनके बीच क्या अंतर है? क्या कोई समझा सकता है?


46
आधिकारिक दस्तावेज वास्तव में बहुत स्पष्ट नहीं है
geekazoid

2
ऐसा लगता है कि अधिक उन्नत स्पष्टीकरण के साथ एक पृष्ठ दिखाई दे रहा है: flex.co/guide/en/elasticsearch/guide/master/…
दिमित्री पोलुस्किन

6
वर्थ नोटिंग ईएस 2.0 में प्रश्नों और फिल्टरों को मिला दिया जाएगा , इसलिए जो कुछ भी कहा गया है, उसके अधिकांश प्रश्नों और फ़िल्टर को अब लागू नहीं किया जाएगा। इस परिवर्तन की घोषणा करने वाले आधिकारिक ब्लॉग पोस्ट को भी देखें ।
वैल

जवाबों:


201

अंतर सरल है: फ़िल्टर कैश्ड हैं और स्कोर को प्रभावित नहीं करते हैं, इसलिए प्रश्नों से अधिक तेज़ है। यहाँ भी एक नज़र है। मान लें कि एक क्वेरी आमतौर पर कुछ ऐसी होती है जो उपयोगकर्ता टाइप करते हैं और बहुत अप्रत्याशित होते हैं, जबकि फ़िल्टर उपयोगकर्ताओं को खोज परिणामों को कम करने में मदद करते हैं, उदाहरण के लिए पहलुओं का उपयोग करना।


19
ठीक है, अगर उपयोगकर्ता एक Google प्रकार खोज कर रहा है तो मैं एक क्वेरी का उपयोग करूंगा? यदि वे ड्रॉप डाउन से संभावित मान का चयन कर रहे हैं (जैसे, इनवॉइस काउंट> 50) तो यह एक फिल्टर होगा?
जोंसी

4
हां, यह बिल्कुल सही है। किसी भी समय आपको कुछ मीट्रिक द्वारा दस्तावेजों के पूरे सेट को प्रतिबंधित करने की आवश्यकता होती है, यह आमतौर पर एक मामला है कि एक फिल्टर उपयुक्त है। तो शायद उम्र, लंबाई, आकार, आदि के आधार पर
Zach

मेरा समाधान एक ही अनुरोध में फिल्टर और प्रश्नों का उपयोग करता है और यह परीक्षण डेटाबेस पर सुपर फास्ट है। हम जल्द ही लाइव डेटा प्राप्त करेंगे, यह देखने के लिए कि यह वास्तव में कितना तेज़ है।
जोंसी

@Zach बिल्कुल स्पष्ट होने के लिए, एक किरायेदार के भीतर उपयोगकर्ताओं के लिए एक बहु-किरायेदार प्रणाली-अनुमतियों में, ऐसा लगता है कि किरायेदार / प्रमाणीकरण जानकारी प्रत्येक क्वेरी (यानी फ़िल्टर की गई क्वेरी) में जोड़ा गया फ़िल्टर होगा। सही?
स्कॉट विलेके

4
@activescott हाँ, यही मैं करूँगा। आप फ़िल्टर किए गए उपनाम भी सेट कर सकते हैं ताकि "उपयोगकर्ता उपनाम" हमेशा उपयुक्त फ़िल्टर लागू करें। प्रशासन को आसान बनाता है और प्रश्नों को अपडेट करने के लिए कोड में बदलाव की आवश्यकता नहीं होती है, आपकी क्वेरी में अतिरिक्त क्रॉफ्ट आदि
Zach

99

यह आधिकारिक दस्तावेज क्या कहता है:

सामान्य नियम के रूप में, फ़िल्टर का उपयोग प्रश्नों के बजाय किया जाना चाहिए:

  • बाइनरी हाँ / नहीं खोजों के लिए
  • सटीक मूल्यों पर प्रश्नों के लिए

एक सामान्य नियम के रूप में, फ़िल्टर के बजाय प्रश्नों का उपयोग किया जाना चाहिए:

  • पूर्ण पाठ खोज के लिए
  • जहां परिणाम एक प्रासंगिक स्कोर पर निर्भर करता है

जब मैं दस्तावेज़ को हटाना चाहता हूं, तो क्या मुझे संभव हो तो एक फिल्टर का उपयोग करना चाहिए? मैं यह नहीं चाहता कि इसे कैश किया जाए
Rytek

डॉक्टर को हटाते समय, आपको किसी भी स्कोर की आवश्यकता नहीं होती है, और न ही आपको पूर्ण पाठ खोज करने की आवश्यकता होती है। तो यह एक फिल्टर की तुलना में होगा, जैसा कि आपको सिर्फ एक डिलीट / डिलीट डिसीजन लेने की जरूरत है। फ़िल्टर-क्वेरी-संदर्भ
गैर

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

इसके अलावा कुछ और। पहले एक फ़िल्टर लागू किया जाता है और फिर उसके परिणामों पर क्वेरी संसाधित की जाती है। प्रति दस्तावेज बाइनरी सच / गलत मैच को स्टोर करने के लिए, बिटसेट एरे नामक चीज का उपयोग किया जाता है। यह बिटसेट एरे मेमोरी में होता है और इसका उपयोग दूसरी बार फिल्टर को क्वेर करने में किया जाता है। इस तरह, बिटसेट सरणी डेटा-संरचना का उपयोग करके, हम कैश्ड परिणाम का उपयोग करने में सक्षम हैं।

यहां ध्यान देने वाली एक और बात, फ़िल्टर कैश तभी बनाया जाता है जब अनुरोध निष्पादित किया जाता है इसलिए केवल दूसरी हिट से, हमें वास्तव में कैशिंग का लाभ मिलता है।

लेकिन फिर आप इसे बढ़ाने के लिए गर्म एपीआई का उपयोग कर सकते हैं । जब आप एक वार्मर एपीआई के खिलाफ फ़िल्टर के साथ एक क्वेरी रजिस्टर करते हैं, तो यह सुनिश्चित करेगा कि जब भी यह लाइव आता है एक नए सेगमेंट के खिलाफ इसे निष्पादित किया जाता है। इसलिए हम पहले निष्पादन से ही लगातार गति प्राप्त करेंगे।


1
दिलचस्प! मुझे लगता है कि फिल्टर प्रश्नों से पहले नहीं हुआ था। फ़िल्टरों की कैशिंग अब अधिक मायने रखती है।
लगातार मेहरबानी

हर बार नहीं। फ़िल्टर्ड और निरंतर स्कोर क्वेरी के बीच बुनियादी और प्राथमिक अंतर। लगातार स्कोर हमेशा क्वेरी को निष्पादित करता है और फिर उस पर फ़िल्टर लागू करता है। फ़िल्टर किए गए क्वेरी में भी सेटिंग होती है, जिसके द्वारा फ़िल्टर से पहले क्वेरी निष्पादित की जा सकती है।
पीयूषगोपाल

10

मूल रूप से, एक क्वेरी का उपयोग तब किया जाता है जब आप स्कोरिंग के साथ अपने दस्तावेजों पर खोज करना चाहते हैं। और क्वेरी का उपयोग करके प्राप्त परिणामों के सेट को कम करने के लिए फ़िल्टर का उपयोग किया जाता है। फिल्टर बूलियन हैं।

उदाहरण के लिए, आपके पास ज़ोमैटो जैसे रेस्तरां का एक सूचकांक है। अब आप 'पिज्जा' परोसने वाले रेस्तरां को खोजना चाहते हैं , जो मूल रूप से आपका खोज कीवर्ड है।

तो आप "पिज्जा" वाले सभी दस्तावेजों को खोजने के लिए क्वेरी का उपयोग करेंगे और कुछ परिणाम प्राप्त करेंगे।

अब कहें कि आप ऐसे रेस्तरां की सूची चाहते हैं जो पिज्जा परोसता है और जिसकी रेटिंग कम से कम 4.0 है।

तो आपको क्या करना है अपनी क्वेरी में "पिज्जा" कीवर्ड का उपयोग करें और 4.0 के रूप में रेटिंग के लिए फ़िल्टर लागू करें।

क्या होता है कि फ़िल्टर आमतौर पर आपके सूचकांक को क्वेरी करके प्राप्त परिणामों पर लागू होते हैं।


कठबोली आप अनुरोध शरीर का एक उदाहरण प्रदान करते हैं?
डॉग

9

Filters-> क्या यह दस्तावेज़ मेल खाता है? एक बाइनरी हाँ या कोई जवाब नहीं

Queries-> क्या यह दस्तावेज़ मेल खाता है? यह कितनी अच्छी तरह से मेल खाता है? स्कोरिंग का उपयोग करता है


0

चूंकि एलिस्टिक्स खोज के संस्करण 2 में, फिल्टर और क्वेरीज को मर्ज किया गया है और किसी भी क्वेरी क्लॉज को फिल्टर या क्वेरी (संदर्भ के आधार पर) के रूप में उपयोग किया जा सकता है। संस्करण 1 के साथ, फ़िल्टर कैश किए गए हैं और अगर स्कोरिंग कोई फर्क नहीं पड़ता है तो इसका उपयोग किया जाना चाहिए।

स्रोत: https://logz.io/blog/elasticsearch-queries/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.