我有一个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
,也会出现相同的行为。
1条答案
按热度按时间omtl5h9j1#
当最小匹配为2时,我得到了4个结果。我已经更改了查询,以分别匹配每个技能名称。