Searchkick结果无关紧要

时间:2016-04-26 10:54:06

标签: ruby-on-rails ruby elasticsearch searchkick

我遇到相关搜索问题。以下请求的结果非常奇怪:

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]

3 个答案:

答案 0 :(得分:1)

使用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_namemmamarmartmartimartinmartina
  • :last_namekkakaukautkautzkautzekautzer

同样,Funk Martin

  • :first_namemmamarmartmartimartin
  • :last_nameffufunfunk

正如您所看到的,在搜索martin时,两者都会匹配,因为它们都包含令牌martin,并且它们将按降序排序(默认值)。如果您想以不同方式订购结果,可以使用排序并使用

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

答案 1 :(得分:1)

Searchkick 1.4修复了这个问题。甚至还有test case致力于这个问题:)

答案 2 :(得分:0)

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

匹配问题:你必须匹配确切的单词和大写字母。 我希望这有效。

相关问题