java अपाचे ल्यूसीन: अनुक्रमणिका को तब मैन्युअल रूप से स्वीकार या अस्वीकार करने के लिए टोकन स्ट्रीम का उपयोग कैसे करें



python apache (1)

मैं अपाचे ल्यूसीन के साथ एक कस्टम इंडेक्स लिखने का एक तरीका तलाश रहा हूं (PyLucene सटीक होना चाहिए, लेकिन जावा का जवाब ठीक है)

मैं क्या करना चाहूंगा निम्नलिखित: जब सूचकांक में कोई दस्तावेज़ जोड़ते हैं, तो लुसेन इसे टोकन कर देगा, स्टॉप शब्दों को हटा देगा आदि। यह आमतौर पर Analyzer साथ किया जाता है अगर मैं गलत नहीं हूं।

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

मुझे कैसे आगे बढ़ना चाहिए ?

यहाँ (पायथन में) Analyzer मेरे कस्टम कार्यान्वयन है:

class CustomAnalyzer(PythonAnalyzer):

    def createComponents(self, fieldName, reader):

        source = StandardTokenizer(Version.LUCENE_4_10_1, reader)
        filter = StandardFilter(Version.LUCENE_4_10_1, source)
        filter = LowerCaseFilter(Version.LUCENE_4_10_1, filter)
        filter = StopFilter(Version.LUCENE_4_10_1, filter,
                            StopAnalyzer.ENGLISH_STOP_WORDS_SET)

        ts = tokenStream.getTokenStream()
        token = ts.addAttribute(CharTermAttribute.class_)
        offset = ts.addAttribute(OffsetAttribute.class_)

        ts.reset()

         while ts.incrementToken():
           startOffset = offset.startOffset()
           endOffset = offset.endOffset()
           term = token.toString()
           # accept or reject term 

         ts.end()
         ts.close()

           # How to store the terms in the index now ?

         return ????

अग्रिम में आपके मार्गदर्शन के लिए धन्यवाद!

1 संपादित करें : Lucene के प्रलेखन में खुदाई करने के बाद, मैंने सोचा था कि यह TokenStreamComponents साथ कुछ था। यह एक टोकनस्ट्रीम रिटर्न देता है जिसके साथ आप उस अनुक्रमणिका के टोकन सूची के माध्यम से दोहरा सकते हैं जो आप अनुक्रमणित कर रहे हैं।

अब ऐसी Attributes जो मुझे समझ में नहीं आ रही हैं। या अधिक सटीक, मैं टोकन पढ़ सकता हूं, लेकिन मुझे नहीं पता कि मैं इसके बाद कैसे आगे बढ़ना चाहिए।

2 संपादित करें : मुझे यह पोस्ट मिला जहां उन्होंने CharTermAttribute के उपयोग का उल्लेख किया। हालांकि (पायथन में हालांकि) मैं CharTermAttribute उपयोग या प्राप्त नहीं कर सकता। कोई विचार ?

EDIT3 : अब मैं प्रत्येक शब्द का उपयोग कर सकता हूं, अपडेट कोड स्निपेट देखें। अब क्या किया जाना बाकी है वास्तव में वांछित शर्तों को संचयित कर रहा है ...


जिस तरह से मैं इस समस्या को हल करने की कोशिश कर रहा था गलत था। इस पोस्ट और फेटवेआरगॉन का उत्तर समाधान थे।

PythonFilteringTokenFilter विस्तारित करने वाले फ़िल्टर को परिभाषित करके, मैं फ़ंक्शन को accept() कर सकता हूँ accept() (उदाहरण के लिए StopFilter में उपयोग के रूप में)

यहां संगत कोड स्निपेट है:

class MyFilter(PythonFilteringTokenFilter):

  def __init__(self, version, tokenStream):
    super(MyFilter, self).__init__(version, tokenStream)
    self.termAtt = self.addAttribute(CharTermAttribute.class_)


  def accept(self):
    term = self.termAtt.toString()
    accepted = False
    # Do whatever is needed with the term
    # accepted = ... (True/False)
    return accepted

फिर बस फिल्टर को दूसरे फिल्टर में संलग्न करें (जैसा कि प्रश्न के लिखित कोड में है):

filter = MyFilter(Version.LUCENE_4_10_1, filter)