自定义ShingleFilter在solr中

时间:2016-12-01 13:18:34

标签: solr shingles

我的要求是有一个令牌过滤器,可以生成令牌,如下所示 -

文字 - “快速棕色狐狸跳”
令牌:
“快速”
“快速褐色”
“快棕狐”
“快速的棕色狐狸跳”

如果我使用SingleFilter,那么我会获得额外的令牌,例如 - "brown fox" "fox jump" 这是我不想要的。有没有现成的方法来实现它。任何帮助都将受到高度赞赏

1 个答案:

答案 0 :(得分:0)

基本上你想要一个前缀搜索, 试试EdgeNGramFilterFactor

这个FilterFactory在匹配前缀子串时非常有用。

<fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
   <analyzer type="index">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>
   </analyzer>
   <analyzer type="query">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
   </analyzer>
</fieldType>

注意:minGram和maxGram将决定令牌长度,因此如果最小令牌长度为2.并且最大令牌长度为15.任何长度小于2且大于15的令牌将被丢弃。

所以如果你有一个字符串说&#34; a&#34;它不会被标记化。因为令牌的长度将小于2.同样适用于maxlength。所以根据你的需要进行调整。

另请注意,使用EdgeNgram会增加索引大小(现在为同一个字符串生成更多令牌)。所以也考虑到这一点。