如何根据长度排除某些术语?例如,不要索引少于 3 个字母或多于 20 个字母的术语。还要排除以数字开头的单词。
谢谢,
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));
}
}
您可以编写一个自定义令牌过滤器来完成这一切。请参阅http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/all/org/apache/lucene/analysis/package-summary.html更多详细信息。