Solr:结合EdgeNGramFilterFactory和NGramFilterFactory

时间:2011-08-30 05:42:35

标签: java lucene solr

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

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

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

非常感谢一些帮助

干杯

2 个答案:

答案 0 :(得分:7)

您不一定要在同一个字段中执行所有操作。我会为每个处理使用不同的自定义类型创建不同的字段,以便您可以单独应用逻辑。

以下内容:

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

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

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

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

<fieldType name="text_ngram" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
  </analyzer>
</fieldType>

<fieldType name="text_first_letter" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="1" side="front"/>
  </analyzer>
</fieldType>

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

答案 1 :(得分:3)

首先应用具有min = 1和max = 1000的EdgeNgramFilter(我们希望包含整个原始令牌)。例如:

hello =&gt; 'h','他','hel','hell','你好'

其次使用minram = 2的NGramFilter。(为简单起见,我将在示例中使用2作为最大值)

'h','他','hel','hell','hello'=&gt; 'h','他','他','el','他','el','l'','他','el','ll','lo'

现在你将有几个相同的标记,因为你已经从EdgeNGramFilter的所有“部分”标记上应用了NGramFilter,但只需应用RemoveDuplicatesTokensFilter来删除它们。

'h','他','他','el','他','el','l'','他','el','ll','lo'=&gt; 'h','他','el','ll','lo'

现在,您的字段将支持单个字符“startsWith”查询和多个字符“包含”查询。