2012-02-13 10 views
16

यदि मेरे पास सोलर में एक बहुविकल्पीय क्षेत्र वाला दस्तावेज़ है तो क्या एकाधिक मान स्वतंत्र रूप से बनाए गए हैं या बस एक बड़े क्षेत्र के रूप में बनाए गए हैं? मुझे उम्मीद है कि उन्हें स्वतंत्र रूप से स्कोर किया जाएगा। मेरा मतलब यह है कि मेरा क्या मतलब है:सोलर बहुविकल्पीय क्षेत्र का स्कोरिंग

मेरे पास एक व्यक्ति के नाम के लिए एक फ़ील्ड वाला दस्तावेज़ है, जहां एक ही व्यक्ति के लिए कई नाम हो सकते हैं। नाम सभी अलग हैं (कुछ मामलों में बहुत अलग हैं) लेकिन वे सभी एक ही व्यक्ति/दस्तावेज हैं।

व्यक्ति 1: डेविड बॉवी, डेविड रॉबर्ट जोन्स, ज़िगी स्टारडस्ट, पतला व्हाइट ड्यूक

व्यक्ति 2: डेविड लेटरमैन

व्यक्ति 3: डेविड हैसलहॉफ़, डेविड माइकल Hasselhoff

हैं मैं "डेविड" की तलाश कर रहा था, मैं इन सभी के लिए एक मैच के समान अवसर के बारे में सोचना चाहता हूं। यदि प्रत्येक नाम स्वतंत्र रूप से स्कोर किया जाता है तो यह मामला प्रतीत होता है। अगर वे सिर्फ एक ही क्षेत्र के रूप में संग्रहीत और खोजे जाते हैं, तो डेविड बॉवी को दूसरों की तुलना में कई टोकन रखने के लिए दंडित किया जाएगा। सौर इस परिदृश्य को कैसे संभालता है?

उत्तर

18

आप q=field_name:David पर अपनी क्वेरी debugQuery=on चला सकते हैं और देखें कि क्या होता है।

<doc> 
    <float name="score">0.4451987</float> 
    <str name="id">2</str> 
    <arr name="text_ws"> 
     <str>David Letterman</str> 
    </arr> 
</doc> 
<doc> 
    <float name="score">0.44072422</float> 
    <str name="id">3</str> 
    <arr name="text_ws"> 
     <str>David Hasselhoff</str> 
     <str>David Michael Hasselhoff</str> 
    </arr> 
</doc> 
<doc> 
    <float name="score">0.314803</float> 
    <str name="id">1</str> 
    <arr name="text_ws"> 
     <str>David Bowie</str> 
     <str>David Robert Jones</str> 
     <str>Ziggy Stardust</str> 
     <str>Thin White Duke</str> 
    </arr> 
</doc> 

और यह विवरण है:

<lst name="explain"> 
    <str name="2"> 
     0.4451987 = (MATCH) fieldWeight(text_ws:David in 1), product of: 1.0 = tf(termFreq(text_ws:David)=1) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.625 = fieldNorm(field=text_ws, doc=1) 
    </str> 
    <str name="3"> 
     0.44072422 = (MATCH) fieldWeight(text_ws:David in 2), product of: 1.4142135 = tf(termFreq(text_ws:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.4375 = fieldNorm(field=text_ws, doc=2) 
    </str> 
    <str name="1"> 
     0.314803 = (MATCH) fieldWeight(text_ws:David in 0), product of: 1.4142135 = tf(termFreq(text_ws:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.3125 = fieldNorm(field=text_ws, doc=0) 
    </str> 
</lst> 

स्कोरिंग यहाँ कारक हैं:

    इन परिणामों (fl=*,score के माध्यम से स्कोर शामिल है) score desc के अनुसार क्रमबद्ध हैं

  • टर्मफ्रैक: कैसे एन एक शब्द दस्तावेज़ में प्रकट होता है
  • आईडीएफ: कितनी बार अवधि सूचकांक पर प्रदर्शित होती
  • fieldNorm: अवधि के महत्व, बढ़ाने और क्षेत्र लंबाई

में सूचकांक-समय पर निर्भर करता आपका उदाहरण fieldNorm अंतर बनाता है। आपके पास एक दस्तावेज़ है जो कम termFreq (1.4142135 के बजाय 1) है क्योंकि यह शब्द केवल एक बार दिखाई देता है, लेकिन यह फ़ील्ड फ़ील्ड की लंबाई के कारण अधिक महत्वपूर्ण है।

तथ्य यह है कि आपका क्षेत्र बहुवृत्त है स्कोरिंग को नहीं बदलता है। मुझे लगता है कि यह एक ही सामग्री के साथ एक ही मूल्य क्षेत्र के साथ समान होगा। सौर लंबाई क्षेत्र और शर्तों के संदर्भ में काम करता है, इसलिए, हां, डेविड बॉवी को दूसरों की तुलना में कई टोकन रखने के लिए दंडित किया जाता है। :)

अद्यतन
मैं वास्तव में लगता है कि डेविड बॉवी उसकी अवसर के योग्य है। ऊपर वर्णित की तरह, fieldNorm अंतर बनाता है। schema.xml और रीइन्डेक्स में text_ws फ़ील्ड में विशेषता omitNorms=true जोड़ें।

<doc> 
    <float name="score">1.0073696</float> 
    <str name="id">1</str> 
    <arr name="text"> 
     <str>David Bowie</str> 
     <str>David Robert Jones</str> 
     <str>Ziggy Stardust</str> 
     <str>Thin White Duke</str> 
    </arr> 
</doc> 
<doc> 
    <float name="score">1.0073696</float> 
    <str name="id">3</str> 
    <arr name="text"> 
     <str>David Hasselhoff</str> 
     <str>David Michael Hasselhoff</str> 
    </arr> 
</doc> 
<doc> 
    <float name="score">0.71231794</float> 
    <str name="id">2</str> 
    <arr name="text"> 
     <str>David Letterman</str> 
    </arr> 
</doc> 

आप अब termFreq जीत देख सकते हैं और fieldNorm पर सभी को ध्यान में नहीं लिया जाता है के रूप में: एक ही क्वेरी आप निम्नलिखित परिणाम दे देंगे। यही कारण है कि दो डेविड अवसरों के साथ दो दस्तावेज शीर्ष पर हैं और एक ही स्कोर के साथ, उनकी अलग-अलग लंबाई के बावजूद, और केवल एक मैच वाला छोटा दस्तावेज़ सबसे कम स्कोर वाला अंतिम व्यक्ति है।

<lst name="explain"> 
    <str name="1"> 
     1.0073696 = (MATCH) fieldWeight(text:David in 0), product of: 1.4142135 = tf(termFreq(text:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=0) 
    </str> 
    <str name="3"> 
     1.0073696 = (MATCH) fieldWeight(text:David in 2), product of: 1.4142135 = tf(termFreq(text:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=2) 
    </str> 
    <str name="2"> 
     0.71231794 = (MATCH) fieldWeight(text:David in 1), product of: 1.0 = tf(termFreq(text:David)=1) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=1) 
    </str> 
</lst> 
+0

विस्तृत टूटने के लिए धन्यवाद, यही वही है जो मुझे जानने की जरूरत है। क्या कोई वैकल्पिक तरीका है कि मैं इस डेटा को इंडेक्स कर सकता हूं ताकि उन नामों को और अधिक "काफी" बनाया जा सके? – user605331

+1

@ user605331 मेरे अपडेट किए गए उत्तर पर एक नज़र डालें, मैंने डेविड बॉवी को भी एक अवसर दिया! – javanna

+1

ओमेटिंग मानदंड मदद करता है, लेकिन यह एक अच्छा समाधान नहीं है। कोई फ़ील्ड नॉर्म को ध्यान में रखना चाहता है, लेकिन अभी भी बहुगुणित फ़ील्ड का उपयोग करना है। तो हमें इन दोनों के बीच फैसला करना होगा :( –

3

आप Lucenes SweetSpotSimilarity इस्तेमाल कर सकते हैं लंबाई है कि सभी 1.0 का एक आदर्श होना चाहिए की पठार परिभाषित करने के लिए: यहाँ debugQuery=on साथ व्याख्या दी गई है। यह आपकी स्थिति के साथ आपकी मदद कर सकता है जब तक आप नाम आदि जैसी चीजों की खोज कर रहे हों। लंबाई कोई अच्छा नहीं करता है।

+0

यह आशाजनक लग रहा है। यह इंडेक्सवाइटर स्तर पर सेट है, हालांकि एक विशिष्ट फ़ील्ड के लिए नहीं, इसलिए यदि मेरे पास अन्य टेक्स्ट का बड़ा क्षेत्र है (शायद यहां एक जीवनी या उदाहरण के लिए कुछ उपयुक्त है) तो मुझे इसके लिए SweetSpotSimilarity का भी उपयोग करना होगा, है ना? – user605331