2012-05-15 16 views
6

के साथ वाक्य जागरूक खोज क्या सभी घटनाओं को खोजने के लिए लुसीन स्पैनक्वियर का उपयोग करना संभव है जहां "लाल" "हरा" और "नीला" शब्द एक ही वाक्य में दिखाई देते हैं?ल्यूसीन स्पैनक्विरीज़

मेरा पहला (अधूरा/गलत) दृष्टिकोण एक विश्लेषक लिखना है जो एक विशेष वाक्य मार्कर टोकन रखता है और वाक्य के पहले शब्द के समान स्थिति में वाक्य की शुरुआत करता है और उसके बाद कुछ के लिए पूछताछ करता है निम्नलिखित:

SpanQuery termsInSentence = new SpanNearQuery(
    SpanQuery[] { 
    new SpanTermQuery(new Term (MY_SPECIAL_SENTENCE_TOKEN)), 
    new SpanTermQuery(new Term ("red")), 
    new SpanTermQuery(new Term ("green")), 
    new SpanTermQuery(new Term ("blue")), 
    }, 
    999999999999, 
    false 
); 

SpanQuery nextSentence = new SpanTermQuery(new Term (MY_SPECIAL_SENTENCE_TOKEN)); 

SpanNotQuery notInNextSentence = new SpanNotQuery(termsInSentence,nextSentence); 

समस्या, ज़ाहिर है, कि nextSentence वास्तव में अगले वाक्य नहीं है, यह किसी भी वाक्य मार्कर है, वाक्य कि termsInSentence मैचों में भी शामिल है। इसलिए यह काम नहीं करेगा।

मेरा अगला दृष्टिकोण विश्लेषक बनाने के लिए है जो वाक्य से पहले टोकन रखता है ( पहले शब्द के समान स्थिति के बजाय पहला शब्द)। इसके साथ समस्या यह है कि मुझे MY_SPECIAL_SENTENCE_TOKEN के कारण अतिरिक्त ऑफसेट के लिए खाते हैं। और भी, यह विशेष रूप से खराब होगा जब मैं वाक्यों को विभाजित करने के लिए एक बेवकूफ पैटर्न का उपयोग कर रहा हूं (उदाहरण के लिए /\.\s+[A-Z0-9]/ पर विभाजित) क्योंकि जब मैं यूएसएस एंटरप्राइज़ की खोज करता हूं तो मुझे सभी (झूठी) वाक्य मार्करों के लिए खाता लेना होगा

तो ... मुझे यह कैसे संपर्क करना चाहिए?

उत्तर

1

मैं प्रत्येक वाक्य को ल्यूसीन दस्तावेज़ के रूप में अनुक्रमित करता हूं, जिसमें एक फ़ील्ड भी शामिल है जो वाक्य का स्रोत दस्तावेज बताता है। आपकी स्रोत सामग्री के आधार पर, वाक्य/ल्यूसीनडोक का ओवरहेड स्वीकार्य हो सकता है।

0

वास्तव में, ऐसा लगता है कि आप समाधान के काफी करीब हैं। मुझे लगता है कि एक अंतराल के झंडे को अनुक्रमणित करना एक अच्छा दृष्टिकोण है। समस्या यह है कि आपका अंतिम वाक्य का ध्वज आपके SpanNearQuery में है, जो आपको फेंक रहा है। आप इसे एक अवधि खोजने के लिए कह रहे हैं जिसमें दोनों शामिल हैं और MY_SPECIAL_SENTENCE_TOKEN नहीं है। क्वेरी खुद से विरोधाभासी है, इसलिए, निश्चित रूप से, यह कोई भी मैच नहीं मिलेगा। आपको वास्तव में क्या जानने की ज़रूरत है, यह है कि तीन शब्द ("लाल", "हरा", और "नीला") एक अवधि में होते हैं जो MY_SPECIAL_SENTENCE_TOKEN के साथ ओवरलैप नहीं होता है (यानी, वाक्य टोकन उन लोगों के बीच प्रकट नहीं होता है शब्द)।

इसके अलावा, Term ctors में फ़ील्ड नाम की कमी समस्या होगी, लेकिन Lucene एक अपवाद है कि के बारे में शिकायत फेंक चाहिए, ताकि अनुमान लगा कि वास्तविक समस्या यहाँ नहीं है। हो सकता है कि उस समय ल्यूसीन संस्करण लिखा गया था, जो स्पैननियर में बेमेल फ़ील्ड के बारे में शिकायत नहीं करता था, इसलिए शायद उल्लेखनीय है।

यह मेरे लिए काम करने के लिए प्रकट होता है:

SpanQuery termsInSentence = new SpanNearQuery(
    new SpanQuery[] { 
     new SpanTermQuery(new Term ("text", "red")), 
     new SpanTermQuery(new Term ("text", "green")), 
     new SpanTermQuery(new Term ("text", "blue")), 
    }, 
    9999, 
    false 
); 

SpanQuery nextSentence = new SpanTermQuery(new Term ("text", MY_SPECIAL_SENTENCE_TOKEN)); 

SpanQuery notInNextSentence = new SpanNotQuery(termsInSentence,nextSentence); 

जहाँ तक जहां बजाय अनुभवहीन regex दृष्टिकोण का उपयोग कर के वाक्य विभाजित करने के लिए, के रूप में, मैं java.text.Breakiterator का उपयोग कर की कोशिश करेंगे। यह सही नहीं है, लेकिन यह एक बहुत अच्छा काम करता है।

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