我遇到相关搜索问题。以下请求的结果非常奇怪:
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]
答案 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_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}]
答案 1 :(得分:1)
Searchkick 1.4修复了这个问题。甚至还有test case致力于这个问题:)
答案 2 :(得分:0)
试试这个 拼写错误:{edit_distance:0}
匹配问题:你必须匹配确切的单词和大写字母。 我希望这有效。