minimum_should_match与dis-max查询连接



我是弹性搜索领域的新手,因为我最近刚从Solr离职。我现在正试图将solrconfig中的edismax查询转换为使用弹性搜索。

基本上,我希望同时在两个字段中搜索术语,所以我最终得到了这个查询:

{
"query": {
"dis_max": {
"queries": [
{
"match": {
"field_1": {
"query": "term1"
}
}
},
{
"match": {
"field_2": {
"query": "term1"
}
}
}
]
}
}
}

这适用于单个术语。如果有多个术语,则不需要找到每个术语。但是,我找不到实现此功能的方法。这就是minimum_should_match参数的作用——它由bool查询提供。

假设我有三个术语,我希望至少找到其中的两个。通过试错,我检查了很多变体,包括这样的东西:

{
"query": {
"dis_max": {
"queries": [
{
"match": {
"field_1": {
"query": "term1 term2 nonexistingterm",
"operator": "and",
"minimum_should_match": 2
}
}
},
{
"match": {
"field_2": {
"query": "term1 term2 nonexistingterm",
"operator": "and",
"minimum_should_match": 2
}
}
}
]
}
}
}

但是minimum_should_match在这里不起作用,并且由于and运算符,没有找到结果。它不适用于or,因为只有一次命中就足以返回结果。

有人能帮我把dis_maxminimum should match结合起来吗?

我找不到任何关于这方面的文档,所以我可以在elasticsearch中找到这些信息的任何提示都非常感谢!

您使用的是operator: and,同时还提供了minimum_should_match,这并不完全有意义。有了operator: and,它产生了一个类似于的查询

field1:term1 AND field1:term2 AND field1:nonexistingterm

因此,无论minimum_should_match设置为什么,所有这些都是必需的。为了有效利用最小应匹配行为,您需要生成带有"或"运算符的应子句。这就像删除operator设置一样简单,因为"或"是默认值,您应该可以看到您要查找的行为。即:

{
"query": {
"dis_max": {
"queries": [
{
"match": {
"field_1": {
"query": "term1 term2 nonexistingterm",
"minimum_should_match": 2
}
}
},
{
"match": {
"field_2": {
"query": "term1 term2 nonexistingterm",
"minimum_should_match": 2
}
}
}
]
}
}
}

相关内容

  • 没有找到相关文章

最新更新