【问题标题】:Sunspot Solr handling a boolean logicSunspot Solr 处理布尔逻辑
【发布时间】:2014-05-12 20:26:59
【问题描述】:

sunspot 可以处理具有 AND 和 OR 运算符的逻辑吗?

Sunspot 正在使用 dismax 请求处理程序,其中 minimum_match 字段用于实现 OR 查询/AND 查询

现在的问题是当我们需要将 AND 和 OR 运算符组合在一起时。如何实现相同。

text = "Hot Air Balloon"

search = Video.solr_search, :minimum_match => text.size do
  fulltext text do
    fields :title
  end
end

我需要热气球或气球之类的东西

【问题讨论】:

  • HOT AND AIR OR BALLOON 背后有什么逻辑吗?这是一个例子,你能说得更笼统吗?

标签: ruby-on-rails solr sunspot sunspot-rails sunspot-solr


【解决方案1】:

如果可能的文本组合数量有限,您可以使用 any_of 强制 OR:

text1=["hot","air"]
text2=["balloon"]

search = Video.search do
    any_of do
        fulltext text1, fields: :title
        fulltext text2, fields: :title
    end
end

【讨论】:

  • 试了一下,得到了这个未定义的方法fulltext' for #<Sunspot::DSL::Scope:0x0000000d0ba510> /usr/local/rvm/gems/ruby-1.9.3-p448/gems/sunspot-1.3.3/lib/sunspot/util.rb:241:in __proxy_method__' /usr/local/rvm/gems/ruby-1.9.3-p448/gems/sunspot-1.3.3/lib/sunspot/util .rb:236:in `method_missing'
  • 尝试字符串而不是数组,比如 text1="hot air", text2="balloon"
  • 还是不行。我猜它在 any_of 的范围内不起作用
  • 是的,一定是这样。否则语法没问题。如果适用于您,请查看此页面:github.com/sunspot/sunspot/wiki/…
【解决方案2】:

不幸的是,any_of 和 all_of 仅适用于标量字段(字符串、整数),不适用于全文搜索(请参阅文档,它在标量字段的上下文中说明了这两种方法)。如果你想在一个字段上达到这样的效果,你必须手动创建你的查询:

fulltext "Hot AND Air OR Balloon" do
    fields :title
end

它给你一个 Solr 的查询:

 q=Hot AND Air OR Balloon&qf=title&rows=1&start=0  

我没有测试它,但这应该也可以:

"+hot +air ballon"

'+' 符号表示该单词是强制性的。 'Balloon' 可以不带任何运算符,因为 dismax 的默认值为 'OR' 运算符(您可以在 schema.xml 中检查默认运算符的设置,solrQueryParser 节点)。

【讨论】:

    【解决方案3】:

    2.2.0 版本开始,sunspot_solr 默认为 edismax 解析器,它支持使用 AND、OR、NOT、- 和 + 进行查询。

    text = "HOT AND AIR OR BALLOON"
    
    search = Video.search do
      fulltext text
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-04
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多