का उपयोग कर या नहीं solr क्वेरी में


83

मैं निम्नलिखित के समान एक ठोस क्वेरी पर काम कर रहा हूं:

((myField:superneat AND myOtherField:somethingElse) OR NOT myField:superneat)

इसे चलाते समय, कोई परिणाम नहीं मिले। OR NOT NOT परिणाम के दोनों ओर मानदंड का उपयोग करना, जिसकी मुझे उम्मीद है - वे सिर्फ एक साथ अच्छा काम नहीं कर रहे हैं इस मामले में कि myField सुपरनैच्योर से मेल खाता है , मैं यह भी सुनिश्चित करना चाहता हूं कि myOtherField कुछ के लिए सेट है , लेकिन यदि myField सुपरनोट नहीं है , तो इसे परिणामों में शामिल करें।

क्या कोई समझा सकता है कि इस तरह के प्रश्न के लिए सोलर परिणाम क्यों नहीं लौटा रहा है? क्या क्वेरी को किसी तरह पुनर्गठित किया जाना चाहिए - या क्या एक अलग तरीका है जिसमें वांछित परिणाम प्राप्त करने के लिए सोल का उपयोग किया जा सकता है?

जवाबों:


82

मुझे नहीं पता कि यह क्यों काम नहीं करता है, लेकिन यह एक तार्किक रूप से समतुल्य है और यह काम करता है :

-(myField:superneat AND -myOtherField:somethingElse)

शायद यह क्वेरी में एक ही क्षेत्र को दो बार परिभाषित करने के साथ कुछ करना है ...

सोलर-उपयोगकर्ता समूह में पूछने का प्रयास करें , फिर अंतिम उत्तर यहां पोस्ट करें!


आपके सहयोग के लिए धन्यवाद! यह वास्तव में काम करता है - और मैंने इसे सोलर-उपयोगकर्ता समूह को सौंप दिया है। मैं यहाँ से उनके द्वारा सुनी गई कोई भी उपयोगी चीज़ पोस्ट करूँगा।
चोरी

8
ध्यान दें कि -myField:superneat OR myOtherField:somethingElseयह भी समान होगा और थोड़ा सरल है।
योरिक सिज़लिंग

3
@YorickSijsling बिंदु यह है कि तार्किक रूप से समतुल्य होने के बावजूद, सोल कभी-कभी आपके द्वारा पोस्ट किए गए ओपी या आपके द्वारा पोस्ट किए गए जैसे विशुद्ध रूप से नकारात्मक प्रश्नों का सामना नहीं करता है।
मौरिसियो शेफ़र

@ मौरिसियो शेफ़र - मैं पूरी तरह से सवाल करूंगा। क्या आप इस बारे में अधिक बता सकते हैं कि यह बहुत अच्छी तरह से कैसे सामना नहीं करता है? हम यहां जटिल परिस्थितियों को चलाते हैं और यह पाया है कि यह अरबों दस्तावेजों के साथ बहुत अच्छी तरह से मुकाबला करता है।
टेरेंस.आ.सनीडर

@ terrance.a.snyder "जटिल सशर्त"! = "विशुद्ध रूप से नकारात्मक प्रश्न"। इसके अलावा, सोल के हाल के संस्करणों में चीजें बेहतर हो सकती हैं, मैंने जांच नहीं की है।
मौरिसियो शेफ़र

42
Instead of "NOT [condition]" use "(*:* NOT [condition])"

1
बहुत बहुत धन्यवाद! इसने मेरे लिए जटिल प्रश्नों के लिए भी काम किया था - (myField: superneat AND -myOtherField: somethingElse) दृष्टिकोण - नहीं!
डपरुहा

33

सोलर वर्तमान में "शुद्ध नकारात्मक" क्वेरी और आवेषण *:*(जो सभी दस्तावेजों से मेल खाता है) की जांच करता है ताकि यह सही ढंग से काम करे।

-foo में तब्दील हो जाता है (*:* -foo)

बड़ी चेतावनी यह है कि सोलर केवल यह देखने के लिए जाँच करता है कि क्या शीर्ष स्तर की क्वेरी एक शुद्ध नकारात्मक क्वेरी है! तो इसका मतलब है कि bar OR (-foo)शुद्ध नकारात्मक क्वेरी शीर्ष स्तर के क्वेरी के उप-खंड में होने के बाद से क्वेरी की तरह परिवर्तन नहीं किया गया है। आपको इस क्वेरी को स्वयं में बदलना होगाbar OR (*:* -foo)

आप क्वेरी परिवर्तन को सत्यापित करने के लिए सोल क्वेरी विवरण की जांच कर सकते हैं:

?q=-title:foo&debug=query

में तब्दील हो गया है

(+(-title:foo +MatchAllDocsQuery(*:*))

1
edismax नेस्टेड नेगेटिव शुद्ध प्रश्नों को सही तरीके से हैंडल करता है, है ना? क्या इस तरह से इनका समर्थन करने के लिए ल्यूसीन क्वेरी पार्सर को पैच करने के बारे में कोई चर्चा हुई है?
पीटर डिक्सन-मूसा 14

24

सोलर डॉक्स और अन्य एसओ प्रश्न पर, एक जोड़े के अलग-अलग जवाबों पर एक साथ टिप्पणियों को डालते हुए, मैंने पाया कि निम्नलिखित सिंटैक्स मेरे उपयोग के मामले के लिए सही परिणाम तैयार करता है

(my_field = my_value या my_field शून्य है):

(my_field:"my_value" OR (*:* NOT my_field:*))

यह सॉलर 4.1.0 के लिए काम करता है। यह ओपी में उपयोग के मामले से थोड़ा अलग है; लेकिन, मुझे लगा कि दूसरों को यह उपयोगी लगेगा।


1
सॉल 5 में आज इस परिदृश्य में भाग गया, और यह सुझाव काम करता है।
रयान शेली

9

आप सॉल-उपयोगकर्ता समूह का अनुसरण कर सकते हैं: सॉलर उपयोगकर्ता मैलिंग सूची

प्रचलित विचार यह है कि न केवल ऑपरेटर का उपयोग केवल क्वेरी से परिणाम निकालने के लिए किया जा सकता है - न केवल संपूर्ण डेटासेट से बाहर की चीजों को बाहर करने के लिए। मुझे लगता है कि आपने जो सुझाव दिया है, उस वाक्य रचना को पसंद करने के लिए धन्यवाद!


3

बस एक और अप्रत्याशित मामला जोड़ने के लिए, यहाँ क्वेरी है जो अपेक्षित परिणाम नहीं दे रही थी:

*:* AND ( ( field_a:foo AND field_b:bar ) OR !field_b:bar )

field_bमेरे मामले में कुछ ऐसा है जिस पर मैं कार्य कर रहा हूं, और केवल उस प्रकार (बार) पर क्वेरी शब्द "फू" को लक्षित करने की आवश्यकता है

मुझे इसे काम करने के लिए दूसरी *:* शर्त के बाद सम्मिलित करना था , जैसे:

*:* AND ( ( field_a:foo AND field_b:bar ) OR ( *:* AND !field_b:bar ) )

संपादित करें: यह सोल्र 6.6.3 में है


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