我是一个ElasticNoob,但我一直在玩一些简单的短语匹配,如下所示:
query: {
match_phrase: {
my_field: {
query: "silly dogs playing about",
slop: 100
}
}
}
但是这只匹配所有 4个条款的条目(愚蠢,狗,玩,约)。理想情况下它仍然匹配像“正在玩的傻狗”之类的东西,它没有“约”关键字(因此会得到较低的分数)。
这似乎是文本搜索引擎的一个非常常见的用例,所以我认为我的Google-fu必须很弱,因为我在弹性搜索中找不到关于部分词组匹配的任何内容。
有人能指出我在正确的方向吗?只是要明确:
match_phrase
和slop
允许我们这样做)match_phrase
只是在任何关键字丢失的情况下排除项目 - 这对我的情况并不理想)谢谢!
答案 0 :(得分:5)
推荐的解决方案是:
我们可以,而不是将邻近匹配作为绝对要求 将它用作信号 - 作为潜在的许多查询之一,每个查询都是如此 有助于每个文档的总分(参见大多数字段)。
这里有一篇描述它的文章:https://www.elastic.co/guide/en/elasticsearch/guide/current/proximity-relevance.html
所以你的查询看起来像是:
query: {
bool: {
must: {
match: {
my_field: {
query: "silly dogs playing about",
minimum_should_match: "30%"
}
}
},
should: {
match_phrase: {
my_field: {
query: "silly dogs playing about",
slop: 50
}
}
}
}
}
答案 1 :(得分:-1)
您可以使用变量调用minimum_should_match指定需要匹配的单词的百分比,或指定应匹配的单词数。
query: {
match_phrase: {
my_field: {
query: "silly dogs playing about",
slop: 100,
minimum_should_match: "75%"
}
}
}
这意味着4个单词中至少有3个需要匹配才能成为热门。