在Solr上使用sunspot_rails进行搜索时,如何通过部分字匹配来提升全字匹配?

时间:2012-12-14 09:42:51

标签: ruby-on-rails solr sunspot-rails sunspot-solr

我正在使用sunspot_railsSolr实例提交查询。一切正常,但我想按照以下标准订购我的结果:我想首先获取匹配术语显示为单词而不是单词的一部分的文档。

因此,如果我有两份文件:

1)使用Solr搜索Solr非常棒

2)Solr非常适合支持使用自由文本进行搜索

我要找的是:search,然后是

我想在结果中包含两个文档,但我希望文档(2)首先出现。

我尝试了order_by :score, :desc,但似乎没有用。除非我找到一种方法来说明如何计算“得分”。

提前致谢 Panayotis

2 个答案:

答案 0 :(得分:3)

您需要使用Solr维护两个字段 一个具有原始值,另一个具有分析值。 text_org and text (which is analyzed)
然后,您可以相应地调整增强,将原始字段值提升到分析的一个,例如, text_org^2 text^1
请记住,如果它与原始文本匹配,它也会匹配分析的文本,或者对于完全单词匹配的效果大于正常匹配。

答案 1 :(得分:1)

稍微扩展Jayendra的答案,你应该索引到两个单独的字段。

以下是我对Sunspot的一个示例schema.xml摘录,来自我对之前问题的回答:How to boost longer ngrams in solr?

<schema>
  <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>

    <!-- other fields; refer to *_text -->

    <dynamicField name="*_ngram" type="text_ngram" ... />

  </fields>
</schema>

searchable区块中,您可以使用:as选项指定字段名称:

searchable do 

  text :title
  text :title, :as => :title_ngram

  # ...

end