太阳黑子:如何对具有不同值的多个字段进行全文查询?

时间:2011-12-02 17:04:28

标签: ruby-on-rails ruby solr full-text-search sunspot

我想用sunspot重现以下原始solr查询

q=exact_term_text:foo OR term_textv:foo* OR alternate_text:bar*

但我无法通过标准的太阳黑子界面了解这是否可行以及如何实现这一点,因为它似乎:

  1. fulltext方法似乎不接受多个text / search_fields参数
  2. 我不知道作为第一个传递给fulltext的参数是什么,好像我通过"foo""bar"结果不匹配
  3. 如果我传递一个空参数,我会得到q=*:*
  4. 范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)用作过滤查询,因此不参与评分。
  5. 似乎可以手工组成字符串(或者可能使用adjust_solr_params),但这似乎是hackish。有更好的解决方案吗?

3 个答案:

答案 0 :(得分:8)

在Sunspot 2.0.0中,存在无证件且不受支持的行为。作者本人建议它不应该,并且在将来的版本中可能不会。

您可以将多个全文调用传递到搜索定义

Post.search do
    fulltext "foo", {:fields => :exact_term}
    fulltext "bar", {:fields => :alternate}
end

这导致(来自日志)

的solr查询
INFO: [] webapp=/solr path=/select 
params={fl=*+score&start=0&q=_query_:"{!dismax+qf%3D'exact_term'}foo"+_query_:"{!dismax+qf%3D'alternate'}bar"&wt=ruby&fq=type:Post&rows=30}
hits=1 status=0 QTime=7 

匹配的子字符串包括在内 https://github.com/sunspot/sunspot/wiki/Matching-substrings-in-fulltext-search

可以通过添加选项来更改默认运算符(AND / OR)     minimum_match 1 如http://blog.tonycode.com/archives/192

中所述

答案 1 :(得分:2)

如果documentation正确无误,则无法两次致电fulltext。所以我最终运行了两次搜索并计算了两次搜索的交集。

a = Post.search do
    fulltext "foo", {:fields => :exact_term}
end

b = Post.search do
    fulltext "bar", {:fields => : alternate}
end

result = a & b

如何计算交点将取决于您要完成的具体操作。上面的交叉点有点幼稚。例如,您可能希望将每个结果的得分与最大值进行标准化,并使用标准化得分的平均值进行排序。

答案 2 :(得分:1)

我还需要对具有不同值的不同字段进行多个全文搜索。此外,我需要满足所有条件。换句话说,我需要这两个' foo'和' bar'应该在Post中为exact_term和备用字段。

Post.search do
    fulltext "foo", {:fields => :exact_term}
    fulltext "bar", {:fields => :alternate}
end

问题是我无法更改schema.xml设置(defaultOperator)。它被设置为“或”。如果你有类似的问题,你可以解决它:

Post.search do
    adjust_solr_params do |params|
        params[:q] = params[:q].gsub(/\s_query/, " AND _query") if params[:q].present?
    end
end