Solr 中的前后 EdgeNGrams

Front and back EdgeNGrams in Solr

我想使用 EdgeNGramFilterFactory 从正面和背面生成边缘 NGram。前面我用的是

  <filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="4"/>

后面,我正在使用

  <filter class="solr.ReverseStringFilterFactory"/>
  <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15"/>
  <filter class="solr.ReverseStringFilterFactory"/>

但是当它们在单个分析器中一起使用时,第二组过滤器工厂作用于第一个 EdgeNGramFilterFactory 的输出。

是否可以在单个分析器中生成前后 EdgeNGrams?或者我是否必须创建单独的分析器并使用 copyField 创建一个包含前后 EdgeNGrams 的字段?


更新 以下评论中要求的示例模式

<fieldType name="text_suggest_edge" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
  </analyzer>
</fieldType>

<fieldType name="text_suggest_edge_end" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ReverseStringFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
    <filter class="solr.ReverseStringFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.ReverseStringFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="12"/>
    <filter class="solr.ReverseStringFilterFactory"/>
  </analyzer>
</fieldType>

<field name="item_name_edge" type="text_suggest_edge" indexed="true" stored="false" multiValued="true"/>
<field name="item_name_edge_end" type="text_suggest_edge_end" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_name" dest="item_name_edge"/>
<copyField source="item_name" dest="item_name_edge_end"/>

更新 2:包括示例输入和预期输出

输入字符串

Washington

所需的边 Ngram

WasWashWashi、……Washingtonashingtonshingtonhington。 .. gton, ton

如果您创建自定义版本的 EdgeNGramFilterFactory(在 java 中,然后将其插入您的 schema.xml),则可以在单个分析器链中完成此操作,从后面创建额外的 ngram .

否则,您将需要将 copyField 复制到具有单独链的附加字段中。

老实说,第一个选项太麻烦了,但肯定是有可能的。