我想用sunspot重现以下原始solr查询
q=exact_term_text:foo OR term_textv:foo* OR alternate_text:bar*
但我无法通过标准的太阳黑子界面了解这是否可行以及如何实现这一点,因为它似乎:
fulltext
方法似乎不接受多个text / search_fields参数fulltext
的参数是什么,好像我通过"foo"
或"bar"
结果不匹配q=*:*
with(:term).starting_with('foo*')
(顾名思义)用作过滤查询,因此不参与评分。似乎可以手工组成字符串(或者可能使用adjust_solr_params
),但这似乎是hackish。有更好的解决方案吗?
答案 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