使用Solr搜索和匹配短语的计数

3
我正在使用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:“此处查询”而不是content:此处查询来使搜索工作正常,但难点是按termfreq返回和排序。
你们有什么想法可以让这个工作起来吗?
提示:我正在使用Ruby,但这是一个旧应用程序,我不能使用任何RubyGems,我在这里使用Solr的HTTP接口。

1
只是一条评论,建议您考虑对非文本搜索字段(如doc_type和environment)使用fq参数。 fq参数不用于搜索的评分。 - d whelan
谢谢@dwhelan,我一定会的。 - kolrie
嘿@tasmaniski,我刚刚做了更多的研究,发现了ShingleFilter。它像下面展示的那样完美地工作了。 - kolrie
2个回答

2
我能够通过在schema.xml中添加一个ShingleFilter使其工作:

在我的情况下,我开始使用SunSpot,所以我只需要进行以下更改:

<!-- *** 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网址的末尾,它会给你短语频率。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接