कैसे खाली क्षेत्रों के लिए SOLR क्वेरी करें?


112

मेरे पास एक बड़ा सोलर इंडेक्स है, और मैंने देखा है कि कुछ फ़ील्ड सही से अपडेट नहीं हुए हैं (इंडेक्स डायनेमिक है)।

इसके परिणामस्वरूप कुछ क्षेत्रों में खाली "आईडी" फ़ील्ड है।

मैंने इन प्रश्नों की कोशिश की है, लेकिन उन्होंने काम नहीं किया:

 id:''
 id:NULL
 id:null
 id:""
 id:
 id:['' TO *]

क्या खाली खेतों को क्वेरी करने का कोई तरीका है?

धन्यवाद

जवाबों:


144

इसे इस्तेमाल करे:

?q=-id:["" TO *]

7
भले ही SolrQuerySyntax पेज कहता है -id: [* TO *], केवल -id: ["TO"] मेरे लिए solr 1.4 पर काम किया।
जोनाथन ट्रान

1
@ user2043553 नहीं, अगर आपको ?q=-id:*मिलता हैCannot parse '-q:*': '*' or '?' not allowed as first character in WildcardQuery
Yzmir Ramirez

1
@YzmirRamirez मैंने Solr 4.5.1 के उदाहरण के साथ कोशिश की है और ?q=-id:*उम्मीद के मुताबिक काम कर रहा है। हो सकता है कि पार्सिंग त्रुटि इस समस्या से संबंधित हो ।
user2043553

क्षमा करें, संस्करण भूल गया ... Lucene Specification Version: 3.2.0मैं उपयोग कर रहा था। खुशी है कि उन्होंने सोलर 4.5.1 में वाक्य रचना को जोड़ा।
यज़्मीर रामिरेज़ 19

खबरदार कि यह वाक्यविन्यास उन पंक्तियों को भी लौटाता है जिनका फ़ील्ड मान एक
व्हाट्सएप से

89

एक कैविएट! यदि आप इसे OR के माध्यम से रचना करना चाहते हैं या आप इसे इस रूप में उपयोग नहीं कर सकते हैं:

-myfield:*

लेकिन आप का उपयोग करना चाहिए

(*:* NOT myfield:*)

यह रूप पूरी तरह से रचना योग्य है। जाहिरा तौर पर एसओएलआर पहले फॉर्म को दूसरे में विस्तारित करेगा, लेकिन केवल तब जब यह एक शीर्ष नोड हो। आशा है कि यह आपको कुछ समय बचाता है!


2
यह उत्तर वास्तव में इससे अधिक अंकों का हकदार है। आपने हमें बहुत समय बचाया!
Zac

यहाँ भी +1। मैंने अन्य विकल्पों को लागू किया लेकिन मुझे इसे q = के बजाय एक fq = में शामिल करना था और यह भी जाँचने के लिए कि क्या क्षेत्र खाली था या एक विशिष्ट मूल्य था, को लागू करना था। यह एकमात्र विकल्प है जिसने उस उपयोग के मामले में काम किया है।
Pixelmixer

मैं मानता हूं कि इस प्रश्न पर स्वीकृत जवाब होना चाहिए
टिंकर

आपने मुझे इतना सिरदर्द दिया। मुझे यकीन नहीं है कि धन्यवाद पर्याप्त है।
कैम्बवे


11

यदि आपके पास एक बड़ा सूचकांक है, तो आपको एक डिफ़ॉल्ट मान का उपयोग करना चाहिए

   <field ... default="EMPTY" />

और फिर इस डिफ़ॉल्ट मान के लिए क्वेरी करें। यह q = -id की तुलना में बहुत अधिक कुशल है: ["टू"]


क्या यह केवल टाइप स्ट्रिंग के क्षेत्रों के लिए काम करेगा? आप इसे बूलियन के लिए कैसे करेंगे?
jared

मुझे लगता है, इसे उसी तरह से काम करना चाहिए। लेकिन मैंने कभी इसकी जाँच नहीं की।
मथायस एम

2

आप इसे इस तरह भी इस्तेमाल कर सकते हैं।

fq=!id:['' TO *]

1

यदि आप SolrSharp का उपयोग कर रहे हैं, तो यह नकारात्मक प्रश्नों का समर्थन नहीं करता है।

आपको QueryParameter.cs बदलने की आवश्यकता है (एक नया पैरामीटर बनाएं)

private bool _negativeQuery = false;

public QueryParameter(string field, string value, ParameterJoin parameterJoin = ParameterJoin.AND, bool negativeQuery = false)
{
    this._field = field;
    this._value = value.Trim();
    this._parameterJoin = parameterJoin;
    this._negativeQuery = negativeQuery;
}

public bool NegativeQuery
{
    get { return _negativeQuery; }
    set { _negativeQuery = value; }
}

और QueryParameterCollection.cs वर्ग में, ToString () ओवरराइड, लगता है कि नकारात्मक पैरामीटर सही है या नहीं

arQ[x] = (qp.NegativeQuery ? "-(" : "(") + qp.ToString() + ")" + (qp.Boost != 1 ? "^" + qp.Boost.ToString() : "");

जब आप पैरामीटर क्रिएटर को कॉल करते हैं, अगर यह एक नकारात्मक मूल्य है। सिंपलिटी को प्रॉपर तरीके से बदलें

List<QueryParameter> QueryParameters = new List<QueryParameter>();
QueryParameters.Add(new QueryParameter("PartnerList", "[* TO *]", ParameterJoin.AND, true));

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