2010-07-22 10 views
14

वाइल्डकार्ड * केवल user* जैसे शब्द के अंत में उपयोग किया जा सकता है।"जैसे" ऑपरेटर के साथ ल्यूसीन से कैसे पूछें?

मैं %user% से पूछताछ करना चाहता हूं, यह कैसे करें?

+0

कुछ हद तक समान मुद्दा है: [http://stackoverflow.com/questions/468279/lucene-net-leading-wildcard-character-throws-an-error](http:// stackoverflow.com/questions/468279/lucene-net-leading-wildcard-character-throws-an-error) – devson

उत्तर

9

लुसेन ReverseStringFilter प्रदान करता है जो * उपयोगकर्ता की तरह अग्रणी वाइल्डकार्ड खोज करने की अनुमति देता है। यह रिवर्स ऑर्डर में सभी शर्तों को अनुक्रमणित करके काम करता है।

लेकिन मुझे लगता है कि 'LIKE% उपयोगकर्ता%' जैसा कुछ करने का कोई तरीका नहीं है।

+2

दिलचस्प। इसका मतलब यह है कि अग्रणी वाइल्डकार्ड की अनुमति देने के लिए आपको पहले से ही अपनी अनुक्रमणिका सेट अप करने की आवश्यकता है। और बग को देखने से (https://issues.apache.org/jira/browse/LUCENE-1398), ऐसा लगता है कि आप केवल एक अग्रणी वाइल्डकार्ड निर्दिष्ट कर सकते हैं, लेकिन एक ही शब्द में पिछला नहीं है (क्योंकि तब आप 'एक ही समस्या पर वापस आ जाओ)। – Jon

6

Lucene 2.1 जब से तुम

QueryParser.setAllowLeadingWildcard(true); 

उपयोग कर सकते हैं, लेकिन इस प्रदर्शन को मार सकता है। LuceneFAQ इसके लिए कुछ और जानकारी है।

3

जब आप इसके बारे में सोचते हैं, तो यह पूरी तरह से असंतोषजनक नहीं है कि वाइल्डकार्डिंग के लिए ल्यूसीन का समर्थन एक शब्द पैटर्न के अंत में वाइल्डकार्ड तक सीमित है (आमतौर पर)।

कीवर्ड खोज इंजन कॉर्पस में सभी शब्दों का एक रिवर्स इंडेक्स बनाकर काम करता है, जो शब्द क्रम में क्रमबद्ध होता है। जब आप एक सामान्य गैर-वाइल्डकार्ड खोज करते हैं, तो इंजन इस तथ्य का उपयोग करता है कि O(logN) चरणों में आपके शब्द के लिए प्रविष्टि या प्रविष्टियों का पता लगाने के लिए इंडेक्स प्रविष्टियों को क्रमबद्ध किया गया है, जहां N शब्दों या प्रविष्टियों की संख्या है। प्रत्यय वाइल्डकार्ड के साथ एक शब्द पैटर्न के लिए, पहले मिलान करने वाले शब्द को खोजने के लिए एक ही चीज होती है, और अन्य मैचों को प्रविष्टियों को स्कैन करके तब तक पाया जाता है जब तक कि पैटर्न के निश्चित भाग से मेल नहीं खाया जाता है।

हालांकि, एक वाइल्डकार्ड उपसर्ग और एक वाइल्डकार्ड प्रत्यय के साथ एक शब्द पैटर्न के लिए, इंजन सूची में सभी प्रविष्टियों को देखने के लिए होगा। यह O(N) होगा ... जब तक इंजन ने शब्दों के शाब्दिक सबस्ट्रिंग से मेल खाने के लिए द्वितीयक अनुक्रमणिका का पूरा ढेर बनाया। (और यह एक बहुत अधिक महंगा सूचकांक बना देगा)। और अधिक जटिल पैटर्न (उदा। Regexes) के लिए समस्या खोज इंजन के लिए भी बदतर होगा।

14

LIKE प्रश्नों के साथ समस्या यह है कि वे निष्पादित करने के लिए समय के अनुसार expensive हैं। आप निम्न के साथ अग्रणी वाइल्डकार्ड अनुमति देने के लिए QueryParser सेट कर सकते हैं:

QueryParser.setAllowLeadingWildcard(true)

और यह आप की तरह खोज करने के लिए अनुमति देगा:

*user*

लेकिन इस पर अमल करने के लिए एक लंबा समय लगेगा । कभी-कभी जब लोग कहते हैं कि वे एक LIKE क्वेरी चाहते हैं, तो वे वास्तव में क्या चाहते हैं fuzzyquery। यह आप निम्नलिखित खोज करने के लिए अनुमति होगी:

user~

कौन सा शर्तों users और fuser से मेल खाएगा। आप अपनी क्वेरी में शब्द और 0 और 1 के बीच फ्लोट मान का उपयोग करके मिलान की जाने वाली शर्तों के बीच एक संपादन दूरी निर्दिष्ट कर सकते हैं। उदाहरण के लिए user~0.8user~0.5 से अधिक शर्तों से मेल खाता है।

मेरा सुझाव है कि आप regex query पर भी नज़र डालें, जो ल्यूसीन खोजों के लिए नियमित अभिव्यक्ति वाक्यविन्यास का समर्थन करता है। यह वास्तव में आपके लिए आवश्यक चीज़ों के करीब हो सकता है।शायद कुछ की तरह:

.*user.*

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