同时使用 match_phrase_prefix 和模糊性的弹性搜索查询?
Elastic search query using match_phrase_prefix and fuzziness at the same time?
我是弹性搜索的新手,所以我在为我们的数据找到最佳查询时遇到了一些困难。
假设我要匹配下面的单词"Handelsstandens Boldklub"。
目前,我正在使用以下查询:
{
query: {
bool: {
should: [
{
match: {
name: {
query: query, slop: 5, type: "phrase_prefix"
}
}
},
{
match: {
name: {
query: query,
fuzziness: "AUTO",
operator: "and"
}
}
}
]
}
}
}
如果我正在搜索 "Hand",它目前会列出该词,但如果我搜索 "Handle",该词将不再列出,因为我打错了字。但是,如果我以 "Handlesstandens" 结束,它将再次列出,因为模糊会捕捉到拼写错误,但只有在我输入整个单词时才会出现。
是否可以同时进行 phrase_prefix 和模糊化?所以在上面的例子中,如果我在途中打错了,它仍然会列出这个词?
所以在这种情况下,如果我搜索 "Handle",它仍然会匹配单词 "Handelsstandens Boldklub"。
或者还有什么其他的变通方法可以达到上面的体验?我喜欢 phrase_prefix 匹配,因为它也支持草率匹配(因此我可以搜索 "Boldklub han",它会列出结果)
或者可以通过completion suggester来实现上面的内容吗?
好的,所以在进一步调查 elasticsearch 之后,我得出的结论是我应该使用 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
}
}
}
但基本上您应该只进行匹配或多重匹配查询,具体取决于您要搜索的字段数。
我希望有人发现它有帮助,因为我个人在模糊而不是 ngram 方面考虑了很多(以前不知道)。这使我走错了方向。
我是弹性搜索的新手,所以我在为我们的数据找到最佳查询时遇到了一些困难。
假设我要匹配下面的单词"Handelsstandens Boldklub"。
目前,我正在使用以下查询:
{
query: {
bool: {
should: [
{
match: {
name: {
query: query, slop: 5, type: "phrase_prefix"
}
}
},
{
match: {
name: {
query: query,
fuzziness: "AUTO",
operator: "and"
}
}
}
]
}
}
}
如果我正在搜索 "Hand",它目前会列出该词,但如果我搜索 "Handle",该词将不再列出,因为我打错了字。但是,如果我以 "Handlesstandens" 结束,它将再次列出,因为模糊会捕捉到拼写错误,但只有在我输入整个单词时才会出现。
是否可以同时进行 phrase_prefix 和模糊化?所以在上面的例子中,如果我在途中打错了,它仍然会列出这个词?
所以在这种情况下,如果我搜索 "Handle",它仍然会匹配单词 "Handelsstandens Boldklub"。
或者还有什么其他的变通方法可以达到上面的体验?我喜欢 phrase_prefix 匹配,因为它也支持草率匹配(因此我可以搜索 "Boldklub han",它会列出结果)
或者可以通过completion suggester来实现上面的内容吗?
好的,所以在进一步调查 elasticsearch 之后,我得出的结论是我应该使用 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
}
}
}
但基本上您应该只进行匹配或多重匹配查询,具体取决于您要搜索的字段数。
我希望有人发现它有帮助,因为我个人在模糊而不是 ngram 方面考虑了很多(以前不知道)。这使我走错了方向。