Lucene指数:排除某些条款

时间:2012-04-07 23:36:15

标签: lucene

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

谢谢,

2 个答案:

答案 0 :(得分:4)

StandardAnalyzer有一个maxTokenLength属性,您可以设置它,我认为它已经消除了以数字开头的令牌。但是,如果您有更多具体需求,则需要制作自己的AnalyzerTokenFilter。与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));
  }
}

答案 1 :(得分:3)

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