2012-11-15 9 views
7

मैं ल्यूसीन को "बहनहोफस्ट्र" शब्द खोजने के लिए एक दस्तावेज़ ढूंढना चाहता हूं, यदि मैं "बानहोफस्ट्रैस" की खोज करता हूं, यानी, मैं नहीं करता केवल उन दस्तावेजों को नहीं ढूंढना चाहते हैं जिनमें से मेरी खोज शब्द एक उपसर्ग है, लेकिन ऐसे दस्तावेज़ भी हैं जिनमें वे शब्द हैं जो स्वयं को मेरे खोज शब्द का उपसर्ग है ...इंडेक्स में शर्तों के लिए खोजें जो खोज शब्द का उपसर्ग हैं या इसके विपरीत (!)

मैं इसके बारे में कैसे जाऊं?

+0

संबंधित (लेकिन आप के लिए एक उचित जवाब के बिना, बस कहते हैं, "हाँ , आप कर सकते हैं "): http: // stackoverflow।कॉम/प्रश्न/10671755/ल्यूसीन-उपसर्ग-खोज-अनुक्रमित-डेटा-थ्रू-मानक-विश्लेषक – Thilo

+1

उप-विपरीत भाग नहीं देखा। तो आप भी "बी" हिट करना चाहते हैं? क्या न्यूनतम लंबाई है? – Thilo

+0

हां, ऐसे मामले हैं जहां मैं "बी" हिट करना चाहूंगा। केवल "सामग्री" सामग्री के साथ "first_name" फ़ील्ड की कल्पना करें ... –

उत्तर

0

मुझे लगता है कि एक अस्पष्ट क्वेरी आपके लिए सबसे उपयोगी हो सकती है। यह आपकी क्वेरी से लेवेनशेटिन दूरी के आधार पर शर्तों को स्कोर करेगा। निर्दिष्ट न्यूनतम समानता के बिना, यह प्रभावी रूप से उपलब्ध हर शब्द से मेल खाएगा। यह इसे कलाकार से कम कर सकता है, लेकिन जो भी आप खोज रहे हैं उसे पूरा करता है।

firstname:bahnhofstr~ 

या कम से कम समानता (कोई न्यूनतम के साथ loosest जा रहा है 0 और 1, 0 के बीच एक संख्या)

firstname:bahnhofstr~0.4 
साथ:

एक फजी क्वेरी जैसे कि, ~ चरित्र द्वारा संकेत है

या यदि आप अपने खुद के प्रश्नों का निर्माण कर रहे हैं, FuzzyQuery

का उपयोग यह काफी वास्तव में आप निर्दिष्ट नहीं है, लेकिन सबसे आसान तरीका है पास पाने के लिए है।

जहां तक ​​आप वास्तव में खोज रहे हैं, मुझे इसे पूरा करने के लिए एक साधारण लुसीन कॉल के बारे में पता नहीं है। मैं शायद सिर्फ termqueries की एक श्रृंखला में अवधि विभाजित होता है, कि आप की तरह एक क्वेरी स्ट्रिंग कुछ में प्रतिनिधित्व कर सकते हैं:

firstname:b 
firstname:ba 
firstname:bah 
firstname:bahn 
firstname:bahnh 
firstname:bahnho 
firstname:bahnhof 
firstname:bahnhofs 
firstname:bahnhofst 
firstname:bahnhofstr* 

मैं वास्तव में इसके लिए एक क्वेरी स्ट्रिंग उत्पन्न नहीं होगा अपने आप, वैसे। मैं सिर्फ TermQuery और PrefixQuery ऑब्जेक्ट्स स्वयं ही बनाऊंगा।

स्कोरिंग थोड़ा विचलित हो जाएगा, और शायद इससे बेहतर आदेश प्राप्त करने के लिए मैं लंबे समय तक अधिक प्रश्नों को बढ़ावा देता हूं, लेकिन यह वही तरीका है जो आप आसानी से पूरा करने के लिए ध्यान में रखते हैं। DisjunctionMaxQuery आपको इस तरह की कुछ अन्य शर्तों के साथ उपयोग करने और अधिक उचित स्कोरिंग प्राप्त करने में मदद करेगा।

उम्मीद है कि एक अस्पष्ट क्वेरी आपके लिए अच्छी तरह से काम करती है। एक बहुत अच्छा समाधान लगता है।

एक अन्य विकल्प है, अगर आप इस प्रकार की क्वेरी के लिए की जरूरत के एक बहुत कुछ है, हो सकता है, जब अनुक्रमण, एन-ग्राम (NGramTokenizer देखें) है, जो आप को प्रभावी ढंग से परिणाम प्राप्त करने के लिए एक NGramPhraseQuery का उपयोग करने की अनुमति होगी में tokenize क्षेत्रों तुम्हें चाहिए।

1

यदि मैं आपको सही ढंग से समझता हूं, और आपकी खोज स्ट्रिंग एक सटीक स्ट्रिंग है, तो आप ल्यूसीन में queryParser.setAllowLeadingWildcard(true); सेट कर सकते हैं ताकि अग्रणी वाइल्डकार्ड खोजों की अनुमति हो सके (जो धीमा हो या न हो - मैंने उन्हें उचित रूप से तेज़ देखा है लेकिन इन एक मामला जहां केवल 60,000+ ल्यूसीन दस्तावेज थे)।

आपका उदाहरण क्वेरी सिंटैक्स की तरह कुछ दे सकता है:

*bahnhofstr bahnhofstr* 

या संभवतः (यह परीक्षण नहीं किया है) बस:

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