4

我正在使用sunspot_railsSolr实例提交查询。一切正常,但我想使用以下标准对结果进行排序:我想首先获取匹配术语作为单词而不是单词的一部分出现的文档。

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

1) 使用 Solr 进行 Solr 搜索非常棒

2) Solr 很好的支持自由文本搜索

我正在寻找的术语是 : search,然后

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

我已经尝试过order_by :score, :desc,但它似乎不起作用。除非我找到一种方法来说明“分数”是如何计算的。

在此先感谢帕纳约蒂斯

4

2 回答 2

3

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

于 2012-12-15T11:10:25.813 回答
1

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

这是 Sunspot 的示例 schema.xml 摘录,来自我对较早问题的回答:如何在 solr 中提升更长的 ngram?

<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
于 2012-12-19T21:37:32.667 回答