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

rif*_*aff 5 ruby solr full-text-search ruby-on-rails sunspot

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

q=exact_term_text:foo OR term_textv:foo* OR alternate_text:bar*
Run Code Online (Sandbox Code Playgroud)

但我无法通过标准的太阳黑子界面了解这是否可行,因为它看起来像:

  1. fulltext方法似乎不接受多个text/search_fields参数
  2. 我不知道作为第一个传递的参数是什么fulltext,好像我传递了一个"foo"或者"bar"结果不匹配
  3. 如果我通过一个空的论点我得到一个 q=*:*
  4. 范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)应用为过滤查询,因此不参与评分.

似乎可以手工组成字符串(或可能使用adjust_solr_params),但这似乎是hackish.有更好的解决方案吗?

s01*_*ist 8

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

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

Post.search do
    fulltext "foo", {:fields => :exact_term}
    fulltext "bar", {:fields => :alternate}
end
Run Code Online (Sandbox Code Playgroud)

这导致(来自日志)的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 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在https://github.com/sunspot/sunspot/wiki/Fulltext-search的Sunspot文档中,它明确指出:"请注意,在一次搜索中不应多次调用`keywords`方法 - 连续调用将覆盖之前的指定的关键字."*(`keywords`别名为`fulltext`,它们是相同的方法.)*据作者说,你的解决方案不起作用......但它似乎完美无缺.嗯,有人撒谎. (3认同)