2010-02-12 12 views
6

मेरे पास एक ऐसा एप्लिकेशन है जहां उपयोगकर्ता कार पार्ट्स चुन सकते हैं। वे अपना वाहन उठाते हैं और फिर पहलू के रूप में वाहन विशेषताओं को चुनते हैं। अपने वाहन का चयन करने के बाद, वे इंजन आकार जैसे पहलुओं को चुन सकते हैं, उदाहरण के लिए, परिणामों की सूची को कम करने के लिए। समस्या यह थी कि सभी दस्तावेजों में इंजन का आकार नहीं है (यह सोलर में एक खाली मूल्य है), क्योंकि इससे सभी भागों के लिए कोई फर्क नहीं पड़ता। उदाहरण के लिए, एक इंजन का आकार शायद ही कभी एक एयर फ़िल्टर के लिए मायने रखता है। इसलिए यदि उपयोगकर्ता ने अपने इंजन आकार के लिए 3.5 एल उठाया है, तो भी मैं स्क्रीन पर एयर फ़िल्टर को एक संभावित भाग के रूप में दिखाना चाहता हूं, जिसे उपयोगकर्ता चुन सकता है। मैं कुछ खोज और निम्न पहलू क्वेरी काम करता था पूरी तरह से:मैं एक बहु मूल्यवान पहलू क्षेत्र में और साथ ही सोलर में रिक्त पहलुओं की खोज कैसे करूं?

enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 

इस क्वेरी से मेल खाते हैं या तो 3.5 या रिकॉर्ड जहां इंजन के आकार क्षेत्र के लिए कोई मूल्य नहीं था (कोई मूल्य का मतलब यह मामला नहीं था से मेल खाएंगे, और यह कार फिट बैठता है)। बिल्कुल सही ...

समस्या: मैंने हाल ही में वाहन विशेषता फ़ील्ड को बहुगुणित फ़ील्ड बनाये हैं, इसलिए मैं प्रत्येक भाग के लिए सूची के रूप में गुणों को स्टोर कर सकता हूं। इसके बाद मैंने इसे पहचाना, और यह ठीक काम किया। हालांकि, समस्या तब सामने आई जब मैंने ऊपर उल्लिखित प्रश्न लागू किया था। इंजनसाइज़ पहलू का चयन करते समय केवल उन दस्तावेजों को प्रदर्शित दस्तावेजों की संख्या को कम कर दिया गया जिनमें इंजन आकार, रिकॉर्ड (मैं शब्द का मतलब शब्द रिकॉर्ड का उपयोग भी करता हूं) जिनके पास इंजन के लिए रिक्त मूल्य (यानी "") दिखाई नहीं दे रहे थे। ऊपर दी गई वही क्वेरी बहुविकल्पीय पहलुओं के लिए काम नहीं करती है, वैसे ही जब इंजन एक एकल मूल्यवान क्षेत्र था।

उदाहरण:

<doc> 
    <str name="part">engine mount</str> 
    <arr name="enginesize"> 
    <str/> 
    <str/> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    <str>3.5</str> 
    </arr> 
<doc> 

<doc> 
    <str name="part">engine bolt</str> 
    <arr name="enginesize"> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    <str>6</str> 
    </arr> 
<doc> 

<doc> 
    <str name="part">air filter</str> 
    <arr name="enginesize"> 
    <str/> 
    <str/> 
    <str></str> 
    <str></str> 
    <str></str> 
    <str></str> 
    <str></str> 
    </arr> 
<doc> 

क्या मैं देख रहा हूँ एक प्रश्न है कि वापस दस्तावेजों 1 और 3 ऊपर जब मैं 3.5 के लिए इंजन के आकार के लिए एक पहलू खोज करते खींच जाएगा। पहला दस्तावेज़ (इंजन माउंट) मैचों में है, क्योंकि इसमें बहुविकल्पीय फ़ील्ड "इंजनइज़" में से एक मान है जिसमें मैं ढूंढ रहा हूं (फ़ील्ड में से एक में 3.5 है)। हालांकि, एयर फ़िल्टर के लिए तीसरा दस्तावेज़ खाली <str> मानों के कारण वापस नहीं किया जाता है। मैं दूसरे दस्तावेज़ को वापस नहीं लौटना चाहता क्योंकि यह पहलू मूल्य

मूल रूप से एक क्वेरी चाहता है जो किसी दिए गए पहलू के लिए खाली स्ट्रिंग मानों से मेल खाएगा और वास्तविक मान से मेल खाता है, इसलिए मुझे दोनों मिलते हैं दस्तावेज लौटे

क्या किसी के पास कोई प्रश्न है जो दस्तावेज़ 1 और दस्तावेज़ 3 (इंजन ब्रैकेट और वायु फ़िल्टर) वापस करेगा, लेकिन इंजन बोल्ट दस्तावेज़ नहीं?

मैं (इस सवाल के शीर्ष पर एक सहित) सफलता के बिना निम्नलिखित की कोशिश की:

// returns everything 
enginesize:"3.5" OR (enginesize:[* TO *]) 
// only returns document 1 
enginesize:"3.5" OR (enginesize:["" TO ""] AND -enginesize:"3.5") 
// only returns document 1 
enginesize:"3.5" OR (enginesize:"") 

मैं एक CSV फ़ाइल का उपयोग करके उपरोक्त डेटा आयात, मैं क्षेत्र keepEmpty=true निर्धारित किया है। मैंने कोशिश की बजाय मैन्युअल रूप से क्षेत्र में एक अंतरिक्ष डालने जब मैं CSV फ़ाइल (जो आप <str> </str> देना होगा उत्पन्न, पिछले करने के बजाय, और फिर पुन: प्रयास प्रश्नों करने से उस, मैं निम्नलिखित परिणाम मिल गया:।

// returns document 1 
enginesize:"3.5" OR enginesize:(*:* AND -enginesize:[* TO *]) 
// returns all documents 
enginesize:"3.5" OR (enginesize:["" TO ""] AND -enginesize:"3.5") 
// returns all documents 
enginesize:"3.5" OR (enginesize:"") 

किसी को भी, एक प्रश्न है कि या तो स्थिति के लिए काम करेगा है मैं खाली मान के रूप में अंतरिक्ष या बस कोई मूल्य नहीं बिल्कुल?

उत्तर

8

कैसे बदल रहा है आप कैसे सूचकांक आप कैसे क्वेरी के बजाय, के बारे में?

बजाय है या नहीं सूचकांक की कोशिश करने का प्रयास "इंजन आकार कोई फर्क नहीं पड़ता" एक खाली रिकॉर्ड के रूप में, इसे "किसी भी" के रूप में इंडेक्स करें।

तो आपकी क्वेरी बस enginesize हो जाता है: "3.5" या (enginesize: किसी भी)

+0

इसके लिए कोई ज़रूरत नहीं है, http://stackoverflow.com/a/35646250/13365 देखें – neu242

1

मैं सिर्फ इस के साथ खेल रहा था और एक hint कि मेरे लिए चाल कर रहा है मिल गया। आपकी क्वेरी के लिए अनुवाद यह होना चाहिए:

enginesize:"3.5" OR (-enginesize:["" TO *]) 

hth,

andi


अद्यतन: कुछ और परीक्षण के बाद मैं इस मज़बूती से काम करता है नहीं लगता है - कुछ अनुक्रमित यह करना पड़ा के लिए दूसरे तरीके से गोल करें और शून्य चिह्न के बिना, यानी enginesize:[* TO ""]। यह सूचकांक प्रकार पर निर्भर हो सकता है, यदि यह बहु-मूल्यवान या वास्तविक मूल्यों पर भी है।

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

0

मैं एक ही समस्या थी, लेकिन https://stackoverflow.com/a/35633038/13365 में इसे हल:

enginesize:"3.5" OR (*:* NOT enginesize:["" TO *]) 

-enginesize समाधान मेरे लिए काम नहीं किया।