【问题标题】:Searchkick Elastic Search where condition like behaviorSearchkick Elastic Search where 条件类似行为
【发布时间】:2016-02-05 19:05:16
【问题描述】:

使用带有 searchkick 和 elasticsearch 的 Rails 4.2,我们设置了一些 where 条件来查找用户:

where_data = {
  region: "North America"
}
results = Person.search( query, where: where_data )

这按预期工作,并在Person.region 是“北美”时找到一个人。

但在其他情况下,此人有多个地区,包括北美:“非洲;北美”。在这些情况下,找不到此人。

如何自定义 where 数据或调用,使其运行起来更像 sql 中的LIKE,并找到完整字符串的任何匹配实例?

【问题讨论】:

  • 你能粘贴你的索引数据吗?我认为您还需要为所有区域编制索引

标签: ruby-on-rails elasticsearch ruby-on-rails-4.2 searchkick


【解决方案1】:

您可以传递数组而不是散列。 所以你可以:

where_data = [
  "region LIKE North America"
]
results = Person.search( query, where: where_data )

这样,where 子句将使用 LIKE 来查找您的结果。

【讨论】:

    【解决方案2】:

    要搜索 region 包含“North America”的 Person,首先尝试:

    Person.search "North America", fields: [:region]
    

    如果这不起作用,请尝试将其添加到 Person 模型中:

    class Person < ActiveRecord::Base
      searchkick word_middle: [:region]
    

    然后(在你重新索引之后)

    Person.search "North America", fields: [:region], match: :word_middle
    

    如果这仍然不起作用,我建议在 ES 中将 :region 设为一个集合(如果您有兴趣,请告诉我,我在使用 searchkick 之前已经这样做了,但不记得确切的代码了。我可以把它拉起来,稍后再发给你)

    【讨论】:

    • 感谢 Jim,我尝试将 word_middle 添加到 searchkick,但没有成功。搜索文本query 已设置,现在尝试根据所选区域过滤结果。
    【解决方案3】:

    我不熟悉 Searchkik,但我是一个日常弹性用户。我认为,如果您提交以空格分隔的区域选项字符串,它将与它们全部匹配。

    option_string  = array_of_options.join(" ")
    

    将 JSON 语法与 elasticsearch-rails gem 结合使用,您应该能够实现这一点。

    where_data = {
      region: option_string
    }
    results = Person.search( query, where: where_data )
    

    【讨论】:

    • 您好,感谢您的信息。我只是想过滤一个字符串。该列中有一个或多个选项。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2020-08-21
    • 2022-11-30
    • 2021-12-09
    • 2018-11-27
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    相关资源
    最近更新 更多