elasticsearch 值大于1的嵌套minimum_should_match查询未返回任何文档

56lgkhnf  于 2023-01-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(139)

我有一个ES索引,它的一个属性包含一个{"name": "string"}形状的嵌套对象列表。我需要查询至少有一定数量的对象与给定名称列表匹配的文档。但是将mimimum_should_match设置为大于1的值不会返回任何文档,这与预期相反。
复制:
1.创建test索引

PUT /test
{
    "mappings": {
        "properties": {
            "skills": {
                "properties": {
                    "name": {
                        "type": "keyword"
                    }
                },
                "type": "nested"
            }
        }
    }
}

1.添加几个文档

POST /test/_bulk
{ "index" : { "_index" : "test" } }
{ "skills" : [{"name": "python"}, {"name": "css"}, {"name": "java"}] }
{ "index" : { "_index" : "test" } }
{ "skills" : [{"name": "python"}] }
{ "index" : { "_index" : "test" } }
{ "skills" : [{"name": "python"}, {"name": "css"}, {"name": "html"}] }
{ "index" : { "_index" : "test" } }
{ "skills" : [{"name": "python"}, {"name": "css"}, {"name": "java"}, {"name": "photoshop"}, {"name": "js"}] }
{ "index" : { "_index" : "test" } }
{ "skills" : [{"name": "python"}, {"name": "git"}] }
{ "index" : { "_index" : "test" } }
{ "skills" : [{"name": "python"}, {"name": "css"}, {"name": "java"}, {"name": "react"}] }

我想返回至少有两个技能["python", "css", "java"]的文档。
以下查询未返回任何文档。

{
    "highlight": {
        "fields": {
            "*": {}
        }
    },
    "query": {
        "nested": {
            "path": "skills",
            "query": {
                "bool": {
                    "minimum_should_match": 2,
                    "should": [
                        {
                            "match": {
                                "skills.name": "python"
                            }
                        },
                        {
                            "match": {
                                "skills.name": "css"
                            }
                        },
                        {
                            "match": {
                                "skills.name": "java"
                            }
                        }
                    ]
                }
            }
        }
    }
}

使用"minimum_should_match":1的相同查询如预期返回了所有6个文档,正如您在突出显示部分中看到的那样,匹配了更多的单个技能。

POST /test/_search | jq ".hits.hits[].highlight"
{
  "skills.name": [               <=========== id of this document is aRN7uoUBoT40NEdPkl68
    "<em>python</em>",
    "<em>css</em>",
    "<em>java</em>"
  ]
}
{
  "skills.name": [
    "<em>python</em>",
    "<em>css</em>",
    "<em>java</em>"
  ]
}
{
  "skills.name": [
    "<em>python</em>",
    "<em>css</em>",
    "<em>java</em>"
  ]
}
{
  "skills.name": [
    "<em>python</em>",
    "<em>css</em>"
  ]
}
{
  "skills.name": [
    "<em>python</em>"
  ]
}
{
  "skills.name": [
    "<em>python</em>"
  ]
}

如果我试图解释为什么第一个文档与具有minimum_should_match=2的查询不匹配,则输出如下

{
    "_id": "aRN7uoUBoT40NEdPkl68",
    "_index": "test",
    "_type": "_doc",
    "explanation": {
        "description": "Not a match",
        "details": [],
        "value": 0.0
    },
    "matched": false
}

如果我将match切换到term,也会出现相同的行为。

omtl5h9j

omtl5h9j1#

当最小匹配为2时,我得到了4个结果。我已经更改了查询,以分别匹配每个技能名称。

{
  "highlight": {
    "fields": {
      "*": {}
    }
  },
  "query": {
    "bool": {
      "minimum_should_match": 2,
      "should": [
        {
          "nested": {
            "path": "skills",
            "query": {
              "match": {
                "skills.name": "python"
              }
            }
          }
        },
        {
          "nested": {
            "path": "skills",
            "query": {
              "match": {
                "skills.name": "css"
              }
            }
          }
        },
        {
          "nested": {
            "path": "skills",
            "query": {
              "match": {
                "skills.name": "java"
              }
            }
          }
        }
      ]
    }
  }
}

相关问题