用于连接令牌的Solr自定义过滤器

时间:2014-12-19 05:17:33

标签: solr lucene

我需要为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;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我编写了连接字过滤器并将补丁提交到solr社区。遇到相同问题的任何人都可以在此处找到它:ConcatenateWordsFilter