2011-06-09 7 views
6

मैं यह है कि जब मैं अपने कस्टम विश्लेषक के साथ एक क्षेत्र का विश्लेषण किया यह termvector के लिए अमान्य ऑफसेट दे देंगे, लेकिन यह मानक विश्लेषक के साथ ठीक है Lucene termvector ऑफसेट के बारे में एक समस्या है, यहाँ मेरी विश्लेषक कोड हैजावा ल्यूसीन कस्टम विश्लेषक और टोकनेज़र टर्मवेक्टर ऑफसेट में समस्या पैदा कर रहे हैं?

public class AttachmentNameAnalyzer extends Analyzer { 
    private boolean stemmTokens; 
    private String name; 

    public AttachmentNameAnalyzer(boolean stemmTokens, String name) { 
     super(); 
     this.stemmTokens = stemmTokens; 
     this.name   = name; 
    } 

    @Override 
    public TokenStream tokenStream(String fieldName, Reader reader) { 
     TokenStream stream = new AttachmentNameTokenizer(reader); 
     if (stemmTokens) 
      stream = new SnowballFilter(stream, name); 
     return stream; 
    } 

    @Override 
    public TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException { 
     TokenStream stream = (TokenStream) getPreviousTokenStream(); 

     if (stream == null) { 
      stream = new AttachmentNameTokenizer(reader); 
      if (stemmTokens) 
       stream = new SnowballFilter(stream, name); 
      setPreviousTokenStream(stream); 
     } else if (stream instanceof Tokenizer) { 
      ((Tokenizer) stream).reset(reader); 
     } 

     return stream; 
    } 
} 

इस "सहायता आवश्यक" के साथ क्या गलत है

+0

चूंकि यह कोड टर्म ऑफसेट से संबंधित कुछ भी नहीं करता है, तो आपको ऐसा करना चाहिए जो आपको करता है। जैसे आपका अटैचमेंटनाम टॉकटाइज़र? – Earwin

+0

ठीक है टोकनज़र कोड यहां है – Badr

+0

अब तक पूरी तरह से निर्दोष दिखता है। अधिक कोड, इनपुट + आउटपुट (टूटा ऑफसेट्स के साथ) के सटीक उदाहरण आवश्यक हैं :) हालांकि, मैं इसके साथ ल्यूसीन उपयोगकर्ता मेलिंग सूची में जाऊंगा। – Earwin

उत्तर

0
विश्लेषक के साथ समस्या यह

तरह स्विच बयान पुनर्लेखन कर सकते हैं के रूप में मैं विश्लेषक पहले के लिए कोड पोस्ट किया, वास्तव में टोकन स्ट्रीम को टेक्स्ट की हर नई प्रविष्टि के लिए आराम करने की आवश्यकता होती है जिसे टोकननाइज़ किया जाना है।

public TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException { 
     TokenStream stream = (TokenStream) getPreviousTokenStream(); 

     if (stream == null) { 
      stream = new AttachmentNameTokenizer(reader); 
      if (stemmTokens) 
       stream = new SnowballFilter(stream, name); 
      setPreviousTokenStream(stream); // ---------------> problem was here 
     } else if (stream instanceof Tokenizer) { 
      ((Tokenizer) stream).reset(reader); 
     } 

     return stream; 
    } 

हर बार जब मैं सेट पिछले टोकन अगले आने वाले पाठ क्षेत्र अलग tokenized जा करने के लिए यह हमेशा पिछले टोकन धारा है कि अवधि वेक्टर यह अब यह नई धारा के लिए गलत ऑफसेट की भरपाई अंत के साथ शुरू होता है धारा ठीक है

ublic TokenStream reusableTokenStream(String fieldName, Reader reader) throws IOException { 
      TokenStream stream = (TokenStream) getPreviousTokenStream(); 

      if (stream == null) { 
       stream = new AttachmentNameTokenizer(reader); 
       if (stemmTokens) 
        stream = new SnowballFilter(stream, name); 
      } else if (stream instanceof Tokenizer) { 
       ((Tokenizer) stream).reset(reader); 
      } 

      return stream; 
     } 
0

लुसीन का कौन सा संस्करण आप उपयोग कर रहे हैं? मैं 3x शाखा के लिए super class code पर देख रहा हूं और प्रत्येक संस्करण के साथ व्यवहार में परिवर्तन करता हूं।

आप public final boolean incrementToken() के लिए कोड देखना चाहते हैं जहां offset की गणना की जाती है।

मैं भी इस देखें:

/** 
* <p> 
* As of Lucene 3.1 the char based API ({@link #isTokenChar(char)} and 
* {@link #normalize(char)}) has been depreciated in favor of a Unicode 4.0 
* compatible int based API to support codepoints instead of UTF-16 code 
* units. Subclasses of {@link CharTokenizer} must not override the char based 
* methods if a {@link Version} >= 3.1 is passed to the constructor. 
* <p> 
* <p> 
* NOTE: This method will be marked <i>abstract</i> in Lucene 4.0. 
* </p> 
*/ 

btw, तुम

@Override 
protected boolean isTokenChar(int c) { 
    switch(c) 
    { 
     case ',': case '.': 
     case '-': case '_': 
     case ' ': 
      return false; 
     default: 
      return true; 
    } 
} 
+0

मैं संस्करण 3.0 का उपयोग कर रहा हूं – Badr

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