我正在使用sunspot_rails
向Solr
实例提交查询。一切正常,但我想按照以下标准订购我的结果:我想首先获取匹配术语显示为单词而不是单词的一部分的文档。
因此,如果我有两份文件:
1)使用Solr搜索Solr非常棒
和
2)Solr非常适合支持使用自由文本进行搜索
我要找的是:search
,然后是
我想在结果中包含两个文档,但我希望文档(2)首先出现。
我尝试了order_by :score, :desc
,但似乎没有用。除非我找到一种方法来说明如何计算“得分”。
提前致谢 Panayotis
答案 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