2

如何根据长度排除某些术语?例如,不要索引少于 3 个字母或多于 20 个字母的术语。还要排除以数字开头的单词。

谢谢,

4

2 回答 2

4

StandardAnalyzer有一个maxTokenLength可以设置的属性,我认为它已经消除了以数字开头的标记。但是,如果您有更具体的需求,您将需要自己制作Analyzer并且可能TokenFilter. 与 Lucene 的文档相反,由于对标记化过程的最高性能要求产生了不寻常的编码模式,因此实现这些类并不是“直截了当”的。例如,没有办法StandardAnalyzer通过扩展它来稍微修改它的行为,您必须从基类之一开始。StandardAnalyzer,如果您在创建可重用分析器时扩展同一个类,则必须格外小心以满足其合同。

因此,首先尝试将现有过滤器中的分析器组合在一起。例如,LengthFilter在核心 Lucene 中提供了一个。如果失败,请实现您自己的过滤器并将其构建到您的分析器中。

这可能会帮助您开始实施过滤器和分析器:

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));
  }
}
于 2012-04-08T08:18:30.137 回答
3

您可以编写一个自定义令牌过滤器来完成这一切。请参阅http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/all/org/apache/lucene/analysis/package-summary.html更多详细信息。

于 2012-04-08T07:24:49.543 回答