我是弹性搜索的新手,所以我正在努力寻找我们数据的最佳查询.
想象一下,我想要匹配下面的单词“Handelsstandens Boldklub”.
目前,我正在使用以下查询:
{
query: {
bool: {
should: [
{
match: {
name: {
query: query, slop: 5, type: "phrase_prefix"
}
}
},
{
match: {
name: {
query: query,
fuzziness: "AUTO",
operator: "and"
}
}
}
]
}
}
}
它目前列出了如果我正在搜索“手”的单词,但是如果我搜索“处理”这个单词将不再列出,因为我做了一个错字.然而,如果我用“Handlesstandens”到达最后,它将被再次列出,因为模糊性将捕获错字,但只有当我输入整个单词时.
在某种程度上可以同时做phrase_prefix和fuzziness吗?所以在上面的例子中,如果我在路上打错,它仍然会列出这个词?
所以在这种情况下,如果我搜索“Handle”,它仍然会匹配“Handelsstandens Boldklub”这个词.
或者有什么其他的解决方法可以实现上述经验?我喜欢phrase_prefix匹配,因为它也支持草率匹配(因此我可以搜索“Boldklub han”,它会列出结果)
或者可以通过使用完成建议器来实现上述目的?
最佳答案 好的,所以在进一步调查弹性搜索之后,我得出的结论是我应该使用ngrams.
这里有一个非常好的解释,它的作用和工作方式.
https://qbox.io/blog/an-introduction-to-ngrams-in-elasticsearch
这是我使用的设置和映射:(这是elasticsearch-rails语法)
settings analysis: {
filter: {
ngram_filter: {
type: "ngram",
min_gram: "2",
max_gram: "20"
}
},
analyzer: {
ngram_analyzer: {
type: "custom",
tokenizer: "standard",
filter: ["lowercase", "ngram_filter"]
}
}
} do
mappings do
indexes :name, type: "string", analyzer: "ngram_analyzer"
indexes :country_id, type: "integer"
end
end
和查询:(此查询实际上同时搜索两个不同的索引)
{
query: {
bool: {
should: [
{
bool: {
must: [
{ match: { "club.country_id": country.id } },
{ match: { name: query } }
]
}
},
{
bool: {
must: [
{ match: { country_id: country.id } },
{ match: { name: query } }
]
}
}
],
minimum_should_match: 1
}
}
}
但基本上你应该做一个匹配或多匹配查询,具体取决于你想要搜索的字段数.
我希望有人觉得它很有帮助,因为我个人在考虑模糊而不是ngrams(以前不知道).这导致我走错了方向.