我需要为solr analyzer阶段编写一个自定义过滤器。我们的想法是首先通过空格对输入的业务名称进行标记,然后对小写,模式替换和删除停用词应用一组过滤器。在这些过滤器之后,我想将所有令牌合并(连接)到一个令牌中,然后应用NGramFilterFactory从令牌生成N-Grams。
我想要组合所有令牌(最初从商业名称生成)的原因是我不会错过在solr中索引的令牌(其长度小于N,在NGramFilter中),用户可能不会插入输入商家名称时适当的空格。请让我知道更多说明。
我尝试为同一个编写一个自定义过滤器,但这不能正常工作,我能够理解它的行为。
当我查询名称" apple"然后它返回n1个结果。
当我查询名称"计算机"然后它返回n2个结果。
当我查询名称"苹果电脑"然后它返回n3结果。
当我查询名称"计算机apple"然后它返回n4结果。
这里n3< (n1,n2)和n3!= n4
以下是代码:我使用solr 4.10.2版本并包含相同的solr-core jar。
public class ConcatFilter extends TokenFilter {
private CharTermAttribute charTermAtt;
private StringBuilder builder = new StringBuilder();
public ConcatFilter(TokenStream input)
{
super(input);
charTermAtt = addAttribute(CharTermAttribute.class);
}
@Override
public boolean incrementToken() throws IOException {
if(input.incrementToken()) {
int len = charTermAtt.length();
char buffer[] = charTermAtt.buffer();
builder.append(buffer, 0, len);
char[] newBuffer = builder.toString().toCharArray();
int newLength = builder.length();
charTermAtt.setEmpty();
charTermAtt.copyBuffer(newBuffer, 0, newLength);
charTermAtt.setLength(newLength);
return true;
} else {
builder.delete(0, builder.length());
return false;
}
}
}