Solr:结合EdgeNGramFilterFactory和NGramFilterFactory
我有一种情况需要使用EdgeNGramFilterFactory和NGramFilterFactory。
我正在使用NGramFilterFactory来执行“包含”样式搜索,最小字符数为2.我还想搜索第一个字母,例如带有前EdgeNGramFilterFactory的“startswith”。
我不想将NGramFilterFactory降低到最小字符1,因为我不想索引所有字符。
一些帮助将不胜感激
干杯
您不必在同一领域中完成所有这些操作。 我会为每个处理使用不同的自定义类型创建不同的字段,以便您可以单独应用逻辑。
在下面的:
-
text
包含原始令牌,最低限度处理; -
text_ngram
使用NGramFilter作为两个字符最小的标记 -
text_first_letter
使用EdgeNGram作为单字符的首字母标记
如果您以这种方式处理所有text
字段,那么您可以使用copyField
来填充字段。 否则,您可以指示Solr客户端为三个单独的字段类型发送相同的字段值。
搜索时,使用qf
参数在搜索中包含所有这些内容。
设置field
和dynamicField
定义由您决定。 或者,如果您有更多问题,请告诉我,我可以通过澄清进行编辑。
首先应用具有min = 1和max = 1000的EdgeNgramFilter(我们希望包含整个原始令牌)。 例:
你好=>’h’,’他’,’嗨’,’地狱’,’你好’
其次使用minram = 2的NGramFilter。(为简单起见,我将在示例中使用2作为最大值)
‘h’,’他’,’hel’,’hell’,’hello’=>’h’,’他’,’他’,’el’,’他’,’el’,’ll’,’他’,’el’,’ll’,’lo’
现在你将有几个相同的标记,因为你已经从EdgeNGramFilter的所有“部分”标记上应用了NGramFilter,但只需应用RemoveDuplicatesTokensFilter来删除它们。
‘h’,’他’,’他’,’el’,’他’,’el’,’l”,’他’,’el’,’l”,’lo’=>’h’,’他’,’el’,’ll’,’lo’
现在,您的字段将支持单个char“startsWith”查询和多个字符“包含”查询。