2012-04-07 96 views

回答

3

StandardAnalyzer有一個maxTokenLength屬性,你可以設置,我認爲它已經消除了數字開始的令牌。但是,如果您有更具體的需求,則需要製作自己的Analyzer,並可能需要TokenFilter。與Lucene的文檔相反,由於源於標記化過程的最高性能需求的不尋常的編碼模式,實現這些類並不是「直接的」。例如,沒有辦法通過擴展它來稍微修改StandardAnalyzer的行爲,您必須從其中一個基類開始。如果您擴展了StandardAnalyzer,相同的等級,您將創建一個可重複使用的分析儀,您必須格外小心以符合其合同。

因此,首先嚐試從現有過濾器中放置一個分析儀。例如,在Lucene核心中提供了LengthFilter。如果失敗,請實施您自己的過濾器並將其構建到分析儀中。

這可以幫助你在執行這兩個過濾器和分析器開始:

public class MyFilter extends FilteringTokenFilter 
{ 
    private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); 

    public MyFilter(TokenStream in) { super(false, in); } 

    protected boolean accept() { 
    final int len = termAtt.length(); 
    final int d = termAtt.charAt(0) - '0': 
    return len >= 3 && len <= 20 && (d < 0 || d > 9); 
    } 
} 

public final class MyAnalyzer extends ReusableAnalyzerBase 
{ 
    @Override protected TokenStreamComponents createComponents(
     String fieldName, Reader reader) 
    { 
    final Tokenizer source = new LowerCaseTokenizer(Version.LUCENE_35, reader); 
    return new TokenStreamComponents(source, new MyFilter(source)); 
    } 
}