Solr:结合EdgeNGramFilterFactory和NGramFilterFactory

neo*_*ser 6 java lucene solr

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

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

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

一些帮助将不胜感激

干杯

Nic*_*zny 7

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

在下面的:

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

如果您text以这种方式处理所有字段,那么您可以使用a 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>
Run Code Online (Sandbox Code Playgroud)

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