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

nde*_*dee 7 search solr

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

<filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front"/>
Run Code Online (Sandbox Code Playgroud)

如何提高更长的ngrams?例如,当我搜索"bookpage"时,包含"bookpage"的文档的评级应该比仅包含"book"的文档高很多.

Nic*_*zny 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>
Run Code Online (Sandbox Code Playgroud)

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

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