【问题标题】:Searchkick results are not relevantSearchkick 结果不相关
【发布时间】:2016-04-26 10:54:05
【问题描述】:

我对相关搜索有疑问。以下请求的结果很奇怪:

Candidate.search('martin', fields: [:first_name, :last_name], 
                           match: :word_start, misspellings: false).map(&:name)


["Kautzer Martina",
 "Funk Martin",
 "Jaskolski Martin",
 "Gutmann Martine",
 "Wiegand Martina",
 "Schueller Martin",
 "Dooley Martin",
 "Stiedemann Martine",
 "Bartell Martina",
 "Gerlach Martine",
 "Green Martina",
 "Lang Martine",
 "Legros Martine",
 "Ernser Martina",
 "Boehm Martina",
 "Green Martine",
 "Nolan Martin",
 "Schmidt Martin",
 "Hoppe Martin",
 "Macejkovic Martine",
 "Emard Martine"]

为什么 Martina 比 Martin 走得早?

Searckick 配置:

searchkick language: %w(German English), word_start: [:first_name, :last_name]

【问题讨论】:

  • 你有没有解决这个问题?我对 searchkick 有同样的问题

标签: ruby-on-rails ruby elasticsearch searchkick


【解决方案1】:

Searchkick 1.4 修复了这个问题。甚至还有一个test case 专门讨论这个问题:)

【讨论】:

    【解决方案2】:

    当使用word_start 时,searchkick 的实际作用是使用searchkick_word_start_index analyzer 标记所选字段(:first_name:last_name)。该分析器是使用以下 edgeNGram 令牌过滤器的自定义分析器:

              searchkick_edge_ngram: {
                type: "edgeNGram",
                min_gram: 1,
                max_gram: 50
              },
    

    因此,当Kautzer Martina 被索引时,实际上会生成并索引以下标记:

    • :first_name: m, ma, mar, mart, marti, martin, martina
    • :last_name: k, ka, kau, kaut, kautz, kautze, kautzer

    同样,对于Funk Martin

    • :first_name: m, ma, mar, mart, marti, martin
    • :last_name: f, fu, fun, funk

    如您所见,在搜索martin 时,两者都将匹配,因为两者都包含标记martin,并且它们将按分数降序排序(默认)。如果您想以不同的方式对结果进行排序,您可以使用排序并使用

    调用您的search
    order: [{last_name: :asc},{first_name: :asc}]
    

    【讨论】:

    • 好的,但是如果我想获得相关的结果应该使用什么?在这种情况下,我需要以 Martin first_name 开头的所有记录。如果我对其进行排序,我绝对会得到另一个结果: Candidate.search('martin', fields: [:first_name, :last_name], match: :word_start, mispellings: false, order: [{last_name: :asc},{first_name : :asc}]).map(&:name) [“Bartell Martina”、“Boehm Martina”、“Dooley Martin”、“Emard Martine”、“Ernser Martina”、“Funk Martin”、“Gerlach Martine”、“ Green Martina”、“Green Martine”、“Gutmann Martine”、“Hoppe Martin”、“Jaskolski Martin”、...]
    • 那你应该先按名字排序。试试看。
    • 您是否尝试将排序顺序更改为order: [{first_name: :asc},{last_name: :asc}]
    • 这种方式记录将首先按first_name排序,但不相关。因此,例如,如果我想通过 flast_name 查找它会导致同样的问题 :(
    【解决方案3】:

    试试这个 拼写错误:{edit_distance: 0}

    匹配的问题:您必须匹配确切的单词和大写字母。 我希望这行得通。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 2021-04-19
      • 2014-02-18
      • 2015-11-15
      相关资源
      最近更新 更多