Solr:结合EdgeNGramFilterFactory和NGramFilterFactory

我有一种情况需要使用EdgeNGramFilterFactory和NGramFilterFactory。

我正在使用NGramFilterFactory来执行“包含”样式搜索,最小字符数为2.我还想搜索第一个字母,例如带有前EdgeNGramFilterFactory的“startswith”。

我不想将NGramFilterFactory降低到最小字符1,因为我不想索引所有字符。

一些帮助将不胜感激

干杯

您不必在同一领域中完成所有这些操作。 我会为每个处理使用不同的自定义类型创建不同的字段,以便您可以单独应用逻辑。

在下面的:

  • text包含原始令牌,最低限度处理;
  • text_ngram使用NGramFilter作为两个字符最小的标记
  • text_first_letter使用EdgeNGram作为单字符的首字母标记

如果您以这种方式处理所有text字段,那么您可以使用copyField来填充字段。 否则,您可以指示Solr客户端为三个单独的字段类型发送相同的字段值。

搜索时,使用qf参数在搜索中包含所有这些内容。

                        

设置fielddynamicField定义由您决定。 或者,如果您有更多问题,请告诉我,我可以通过澄清进行编辑。

首先应用具有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”查询和多个字符“包含”查询。