如何在solr中提升更长的ngrams?

时间:2011-11-15 13:49:30

标签: search solr

我在schema.xml中使用以下过滤器:

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

如何提高更长的ngrams?例如,当我搜索“bookpage”时,包含“bookpage”的文档的评级应该比只有“book”的文档高很多。

1 个答案:

答案 0 :(得分:5)

我不知道基于术语长度动态提升的方法(即使用Function Query运算符)。我怀疑没有一个。

那就是说,我经常想要近似你正在寻找的逻辑:长期匹配需要更高的语义权重。

最常见的是,我会将文本值索引到两个不同的字段中。一个是没有ngrams的最小处理文本字段。另一个是类似的,但也用ngrams处理。

以下是我以这种方式使用的架构的一些示例摘录。对于针对此架构的搜索,我会在text上大量提升text_ngram字段。因此,针对text字段的任何匹配都会极大地影响相关性,而针对text_ngram的匹配仍然可以获得可能相关的结果。

<?xml version="1.0" encoding="UTF-8"?>
<schema name="Sunspot Customized NZ" version="1.0">
  <types>

    <!--
      A text type with minimal text processing, for the greatest semantic
      value in a term match. Boost this field heavily.
    -->
    <fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory" />
        <filter class="solr.StandardFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
      </analyzer>
    </fieldType>

    <!--
      Looser matches with NGram processing for substrings of terms and synonyms
    -->
    <fieldType name="text_ngram" class="solr.TextField" omitNorms="false">
      <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory" />
        <filter class="solr.StandardFilterFactory" />
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="6" side="front" />
      </analyzer>
    </fieldType>

    <!-- other stuff -->

  </types>
  <fields>

    <!-- id, other scalar values -->

    <!-- catch-all for the text and text_ngram types -->
    <field name="text"       stored="false" type="text"        multiValued="true"  indexed="true" />
    <field name="text_ngram" stored="false" type="text_ngram"  multiValued="true"  indexed="true" />

    <!-- various dynamicField definitions -->

    <!-- sample dynamicField definitions for text and text_ngram -->
    <dynamicField name="*_text"   type="text" indexed="true" stored="false" multiValued="false" />
    <dynamicField name="*_text_ngram"   type="text_ngram" indexed="true" stored="false" multiValued="false" />

  </fields>

  <!-- copy text fields into my text and text_ngram catch-all fields -->
  <copyField source="*_text"  dest="text" />
  <copyField source="*_text"  dest="text_ngram" />

</schema>

这不是您正在寻找的,但您可以使用类似的方法。

例如,创建一个中间NGram处理字段类型的小集合 - 比如长度为1-3,4-6,7-9 - 并相应地增加它们的增强。