2012-11-15 132 views
1

我正在使用Solr来索引文档,现在我需要搜索这些文档中的确切短语并按照该短语出现在文档上的次数对结果进行排序。我还必须提供短语匹配回用户的次数。搜索和匹配Solr的短语

我用下面的查询(这里我用这个词SAP搜索):

{ 
    :params => { 
      :wt => "json", 
     :indent => "on", 
      :rows => 100, 
     :start => 0, 
      :q => "((content:SAP) AND (doc_type:ClientContact) AND (environment:production))", 
      :sort => "termfreq(content,SAP) desc", 
      :fl => "id,termfreq(content,SAP)" 
    } 
} 

当然,这是对实际查询的表示,即通过将这个散列成一个查询字符串进行在运行时。

我设法通过使用content:"the query here"而不是content:the query here来实现搜索工作,但难度最大的部分是由termfreq返回并排序。

关于如何使这项工作的任何想法?

Obs:我正在使用Ruby,但这是一个遗留应用程序,我不能使用任何RubyGems,我在这里使用Solr的HTTP接口。

+1

只是你应该考虑使用fq参数来处理非文本搜索字段(如doc_type和environment)。 fq参数不用于搜索的评分。 –

+0

谢谢@dwhelan,我当然会。 – kolrie

+0

您是否找到解决方案? – tasmaniski

回答

1

我能使其工作增加了ShingleFilterschema.xml

在我的情况,我开始使用黑点,所以我不得不做如下改变:

<!-- *** This fieldType is used by Sunspot! *** --> 
<fieldType name="text" class="solr.TextField" omitNorms="false"> 
    <analyzer> 
    <tokenizer class="solr.StandardTokenizerFactory"/> 
    <filter class="solr.StandardFilterFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <!-- This is the line I added --> 
    <filter class="solr.ShingleFilterFactory" maxShingleSize="4" outputUnigrams="true"/> 
    </analyzer> 
</fieldType> 

后做这个改变,重新启动Solr并重新索引,我可以在我的查询(q=),返回字段(fl=),甚至在排序(sort=)上都使用termfreq(content, "the query here")

0

debug=results放在solr url的末尾 它会给你freq一句。