2011-03-30 13 views
9

का उपयोग करके 'शुरूआत' के बजाय 'शामिल' खोज कैसे करें, हम ग्राहकों की वेबसाइट पर पूर्ण टेक्स्ट खोज को लागू करने के लिए लुसेन.NET का उपयोग करते हैं। खोज स्वयं ही पहले से ही काम करती है लेकिन अब हम एक संशोधन लागू करना चाहते हैं।Lucene.Net

वर्तमान में सभी शर्तों को * संलग्न किया गया है जो ल्यूसीन को StartsWith खोज के रूप में वर्गीकृत करने के लिए प्रेरित करता है।

भविष्य में हम एक ऐसी खोज करना चाहेंगे जो StartsWith की बजाय Contains की तरह कुछ करे।

हम

  • Lucene.Net 2.9.2.2
  • StandardAnalyzer
  • डिफ़ॉल्ट QueryParser

नमूने का उपयोग करें:

(Title:Orch*) मैचों: Orchestra

लेकिन:

(Title:rch*) से मेल नहीं खाता: Orchestra

हम पहले और दूसरे दोनों मैच Orchestra करना चाहते हैं।

मूल रूप से मैं चाहता हूँ कि इस सवाल में पूछा गया था की ठीक विपरीत है, मैं क्यों इस व्यक्ति के लिए Lucene एक Contains प्रदर्शन किया और एक StartsWith डिफ़ॉल्ट रूप से बजाय यकीन नहीं है:
Why is this Lucene query a "contains" instead of a "startsWith"?

हम कैसे कर सकते हैं यह होता है?
मुझे लगता है कि विश्लेषक के साथ इसका कुछ संबंध है लेकिन मुझे यकीन नहीं है।

उत्तर

19

सबसे पहले, मुझे लगता है कि आप मानक विश्लेषक का उपयोग कर रहे हैं, या कुछ इसी तरह के हैं। आपका लिंक किया गया प्रश्न यह समझने में असफल रहा कि आप शर्तों की खोज करते हैं, और उसके मामले a* "बेड़े अफ्रीका" से मेल खाते हैं क्योंकि यह "बेड़े" और "अफ्रीका" में टोकनकृत है।

field:*value* जैसे प्रश्न लिखने में सक्षम होने के लिए आपको QueryParser.SetAllowLeadingWildcard(true) पर कॉल करने की आवश्यकता है। क्या आप वास्तव में स्ट्रिंग को बदल रहे हैं जो क्वेरीरीसर को पास कर दिया गया है?

आप सामान्य रूप से क्वेरी को पार्स कर सकते हैं, और उसके बाद QueryVisitor लागू करें जो सभी TermQuery को WildcardQuery में फिर से लिखता है। इस तरह आप अभी भी वाक्यांश खोजों का समर्थन करते हैं।

मुझे उपसर्ग- या वाइल्डकार्ड-क्वेरी में प्रश्नों को फिर से लिखने में कोई अच्छी चीजें नहीं दिखाई देती हैं। एक ओआरसी, या एक छाती, और एक ऑर्केस्ट्रा के बीच बहुत कम साझा किया जाता है, लेकिन दोनों शब्द मेल खाते हैं। इसके बजाए, अपने ग्राहक को ऐसे विश्लेषक के साथ हुक करें जो सरल खोज गलतियों को ठीक करने के लिए स्टेमिंग, समानार्थी, और एक वर्तनी सुधार सुविधा प्रदान करता है।

+2

खोज इंजन चश्मे अक्सर "Google की तरह करते हैं" के रूप में, आप कह सकते हैं कि Google इसे अनुमति नहीं देता है। "चेस्ट्रा" की खोज करने का प्रयास करें;) – mathieu

+0

थैक्स, जो कि मैं खुद ही कार्य के संबंध में खोज रहा था: वैसे ही, ग्राहक वास्तव में यह चाहता है और तर्क के खिलाफ प्रतिरोधी है;) इसके अलावा यह वास्तव में एक गैर प्राकृतिक खोज है बैंड नाम और घटना विवरण ताकि स्टेमिंग/समानार्थी इत्यादि जैसी चीजें इस मामले में आदर्श न हों। वैसे भी अब महान काम करता है thx! – ntziolis

+0

'SetAllowLeadingWildcard (true)' का उपयोग करने के गंभीर प्रदर्शन दंड की निगरानी - उपर्युक्त उत्तर में इसके बारे में केवल एक संकेत है। इसके अलावा, आपके इच्छित उपयोग के आधार पर, आप एन-ग्राम में देखना चाहेंगे - शिंगलफिल्टर जैसे कि एक्सडरैप ने दूसरे जवाब में सुझाव दिया था। – synhershko

2

@ सिमन स्वेन्सन ने शायद बेहतर उत्तर दिया (यानी आपको इसकी आवश्यकता नहीं है), लेकिन यदि आप करते हैं, तो आपको Shingle Filter का उपयोग करना चाहिए।

ध्यान दें कि यह आपकी अनुक्रमणिका को बड़े पैमाने पर बड़ा कर देगा, क्योंकि "ऑर्केस्ट्रा" को संग्रहीत करने के बजाय, आप "orc", "rch", "che", "hes" स्टोर करेंगे ... लेकिन केवल एक सादा शब्द अग्रणी वाइल्डकार्ड के साथ क्वेरी बड़े पैमाने पर धीमी हो जाएगी। यह अनिवार्य रूप से आपके कॉर्पस में प्रत्येक शब्द को देखना होगा।

+0

क्या आप इस मामले के लिए शिंगल फ़िल्टर को कॉन्फ़िगर/उपयोग करने के बारे में बता सकते हैं? – lujop

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