2010-06-23 11 views
6

मैं अपने खोज परिणामों को स्कोर द्वारा क्रमबद्ध करना चाहता हूं, जो वे कर रहे हैं, लेकिन स्कोर की गणना अनुचित रूप से की जा रही है। यह कहना है, अनुचित रूप से, लेकिन उम्मीद से अलग नहीं है और मुझे यकीन नहीं है कि क्यों। मेरा लक्ष्य स्कोर को बदल रहा है जो भी हटाना है।सोलर: फ़ील्ड नॉर्म अलग-अलग दस्तावेज़, बिना किसी दस्तावेज़ को

यदि मैं ऐसी खोज करता हूं जो दो ऑब्जेक्ट्स से मेल खाता है (जहां ऑब्जेक्टए ऑब्जेक्टबी से उच्च स्कोर होने की उम्मीद है), ऑब्जेक्टबी पहले वापस लौटाया जा रहा है।

मान लें कि, इस उदाहरण के लिए, मेरी क्वेरी एक शब्द है: "सेब"।

ObjectA के शीर्षक: "सेब सेब हैं" (2/3 शब्द)
ObjectA का वर्णन: "वहाँ सेब-सेब में सेब थे और अब सेब सभी सेब पर सभी सेब चला गया" (6/18 शब्द)
ऑब्जेक्टबी का शीर्षक: "सेब बहुत अच्छे हैं" (1/3 शब्द)
ऑब्जेक्टबी का वर्णन: "सेब के कमरे में सेब थे और अब सेब सभी सेब में खराब हो गए!" (4/18 शर्तें)

शीर्षक फ़ील्ड में कोई बढ़ावा नहीं है (या बल्कि, 1 का बढ़ावा) और विवरण फ़ील्ड में 0.8 का बढ़ावा है। मैंने solrconfig.xml या उस क्वेरी के माध्यम से एक दस्तावेज़ को बढ़ावा नहीं दिया है जिसे मैं गुजर रहा हूं। यदि दस्तावेज़ बूस्ट निर्दिष्ट करने का कोई और तरीका है, तो मुझे एक मौका है कि मुझे एक याद आ रही है।

explain प्रिंटआउट विश्लेषण करने के बाद, यह ObjectA तरह है लग रहा है ठीक से ObjectB तुलना में एक उच्च स्कोर की गणना है, जैसे मैं चाहता हूँ, के लिए एक अंतर को छोड़कर: ObjectB के शीर्षक fieldNorm हमेशा ObjectA की तुलना में अधिक है।


यहाँ explain प्रिंटआउट इस प्रकार है। जैसा कि आप जानते हैं: शीर्षक क्षेत्र mditem5_tns है और वर्णन क्षेत्र mditem7_tns है:

ObjectB: 
1.3327172 = (MATCH) sum of: 
    1.0352166 = (MATCH) max plus 0.1 times others of: 
    0.9766194 = (MATCH) weight(mditem5_tns:appl in 0), product of: 
     0.53929156 = queryWeight(mditem5_tns:appl), product of: 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.2977981 = queryNorm 
     1.8109303 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of: 
     1.0 = tf(termFreq(mditem5_tns:appl)=1) 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     1.0 = fieldNorm(field=mditem5_tns, doc=0) 
    0.58597165 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of: 
     0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of: 
     0.8 = boost 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.2977981 = queryNorm 
     1.3581977 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of: 
     2.0 = tf(termFreq(mditem7_tns:appl)=4) 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.375 = fieldNorm(field=mditem7_tns, doc=0) 
    0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of: 
    0.999001 = 1000.0/(1.0*float(1)+1000.0) 
    1.0 = boost 
    0.2977981 = queryNorm 

ObjectA: 
1.2324848 = (MATCH) sum of: 
    0.93498427 = (MATCH) max plus 0.1 times others of: 
    0.8632177 = (MATCH) weight(mditem5_tns:appl in 0), product of: 
     0.53929156 = queryWeight(mditem5_tns:appl), product of: 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.2977981 = queryNorm 
     1.6006513 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of: 
     1.4142135 = tf(termFreq(mditem5_tns:appl)=2) 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.625 = fieldNorm(field=mditem5_tns, doc=0) 
    0.7176658 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of: 
     0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of: 
     0.8 = boost 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.2977981 = queryNorm 
     1.6634457 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of: 
     2.4494898 = tf(termFreq(mditem7_tns:appl)=6) 
     1.8109303 = idf(docFreq=3, maxDocs=9) 
     0.375 = fieldNorm(field=mditem7_tns, doc=0) 
    0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of: 
    0.999001 = 1000.0/(1.0*float(1)+1000.0) 
    1.0 = boost 
    0.2977981 = queryNorm 

उत्तर

6

समस्या स्टेमर के कारण होता है। यह "सेब सेब हैं" को विस्तारित करता है "सेब सेब सेब सेब हैं" इस प्रकार क्षेत्र को लंबा बनाते हैं। चूंकि दस्तावेज़ बी में केवल 1 शब्द होता है जिसे स्टेमर द्वारा विस्तारित किया जा रहा है, तो क्षेत्र कम रहता है, फिर दस्तावेज़ ए

यह परिणाम विभिन्न फ़ील्ड नॉर्म्स में होता है।

+0

क्या आप विस्तारित कर सकते हैं, या संभवतः एक लिंक प्रदान कर सकते हैं? "स्टेमर" मेरे क्षेत्र को उस चीज़ पर क्यों बढ़ाएगा जो यह * नहीं है? ऐसा लगता है कि प्रतिद्वंद्वी लगता है! :) – JMTyler

+0

जब तक आपके द्वारा लिखा गया पहला "सेब" तब तक "सेब" नहीं माना जाता था? सिर्फ तंग दिखने के बाद, यह समझ में आएगा, अगर "सेब" को अपने मूल रूप में तोड़ दिया जा रहा है। तो - अगर मुझे यह अधिकार है तो मुझे बताएं - आप कह रहे हैं कि अगर मैं "सेब" के सभी संदर्भों को बदलता हूं और केवल "सेब" की खोज करता हूं, तो मुझे परिणाम क्रम में प्राप्त करना चाहिए? – JMTyler

+0

मैंने अपनी पोस्ट संपादित की, इसलिए अब यह स्पष्ट होना चाहिए। स्टेमर "सेब" और "सेब" के लिए रूट फॉर्म के रूप में "सेब" का उपयोग करता है। इसलिए यदि आप स्टेमिंग अक्षम करते हैं तो आपको परिणाम प्राप्त करना चाहिए। आप उन्हें protwords.txt में जोड़कर स्टेम किए गए शब्दों को भी बहिष्कृत कर सकते हैं और schema.xml <फ़िल्टर श्रेणी = "solr.EnglishPorterFilterFactory" संरक्षित = "protwords.txt" /> – Jem

2

FieldNOrm 3 घटकों के गणना की जाती है - क्षेत्र, सूचकांक-टाइम दस्तावेज़ और क्षेत्र लंबाई पर बढ़ावा पर सूचकांक समय को बढ़ावा देने। यह मानते हुए कि आप किसी भी इंडेक्स-टाइम बूस्ट की आपूर्ति नहीं कर रहे हैं, अंतर क्षेत्र की लंबाई होना चाहिए।

इस प्रकार, के बाद से lengthNorm कम क्षेत्र मूल्यों के लिए अधिक है, बी के लिए शीर्षक के लिए एक उच्च fieldNorm मूल्य के लिए, यह ए से शीर्षक में टोकन की छोटी संख्या होनी चाहिए

एक के लिए अगले पन्नों देखें Lucene स्कोरिंग की विस्तृत विवरण:

http://lucene.apache.org/java/2_4_0/scoring.html http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Similarity.html

+0

+1 अंतर्दृष्टि के लिए +1 - धन्यवाद! दुर्भाग्यवश, हालांकि, आप मेरी पोस्ट में नोटिस करेंगे कि मैंने कहा है कि फ़ील्ड (और उनकी लंबाई) क्या हैं। दोनों वस्तुओं में 3 टोकन और विवरण 18 टोकन के साथ शीर्षक हैं।ऑब्जेक्टए के शीर्षक में 2/3 टोकन मिलते हैं, ऑब्जेक्टबी में 1/3 मिलान होता है, और मिलान विवरण क्रमश: 6/18 और 4/18 होते हैं। इसलिए, अगर मैं समझता हूं कि आप क्या कह रहे हैं, तो लंबाई का कोई प्रभाव नहीं होना चाहिए। क्या मैं पूछ सकता हूं - मैं इंडेक्स-टाइम बूस्ट सेट करने के बारे में कैसे जाउंगा? – JMTyler

+0

क्षमा करें - मैंने सोचा था कि आपका उदाहरण बनाया गया था और वास्तविक मूल्य नहीं। उस स्थिति में आप उस क्षेत्र की लंबाई में सही हैं एक कारक नहीं होना चाहिए। आप विभिन्न तरीकों से सोलर में बूस्ट सेट कर सकते हैं - यदि आप सोलरजे का उपयोग कर रहे हैं, तो मेरा मानना ​​है कि SolrInputDocument पर "setBoost" विधि है। लेकिन यदि डॉक्टर बी को बढ़ावा मिलेगा तो फील्ड फ़ील्ड विवरण फ़ील्ड में भी अधिक होना चाहिए। आप ल्यूक को भी देखना चाहेंगे - यह आपको अपने अनुक्रमित फ़ील्ड डेटा का पुनर्निर्माण करने की अनुमति देता है ताकि आप देख सकें कि वास्तव में अनुक्रमित क्या होता है। – KenE

+0

नहीं, नहीं बनाया गया - बस डेटा का परीक्षण। :) मैं कोड पर एक नज़र डालूंगा और देख सकता हूं कि इंडेक्स-टाइम बूस्ट के साथ कुछ संदिग्ध हो रहा है या नहीं। मैं शायद ल्यूक की भी जांच करूंगा। सहायता के लिए धन्यवाद। – JMTyler

संबंधित मुद्दे