我想用 sunspot 重现以下原始 solr 查询
q=exact_term_text:foo OR term_textv:foo* OR alternate_text:bar*
但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:
fulltext
方法似乎不接受多个文本/搜索字段参数- 我不知道将什么参数作为第一个参数传递给
fulltext
,就好像我通过了"foo"
或"bar"
结果不匹配 - 如果我传递一个空参数,我得到一个
q=*:*
- 范围过滤器(例如
with(:term).starting_with('foo*')
(顾名思义)作为过滤器查询应用,因此不参与评分。
似乎可以手动编写字符串(或者可能使用 adjust_solr_params
),但这看起来很老套。有更好的解决方案吗?
最佳答案
在 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) 最小匹配 1 如 http://blog.tonycode.com/archives/192 中所述
关于ruby-on-rails - Sunspot:如何对具有不同值的多个字段进行全文查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8359900/