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