我试图在嵌套文档上使用must_not布尔查询,但我不断得到奇怪的结果。
以下是一个说明我的问题的例子。
curl -X DELETE "http://localhost:9200/must_again/"
curl -X POST "http://localhost:9200/must_again/" -d '{
"mappings": {
"class": {
"properties": {
"title": {
"type": "string"
},
"teachers": {
"type": "nested",
"properties": {
"name": {
"type": "string"
}
}
}
}
}
}
}'
curl -XPUT 'http://localhost:9200/must_again/class/1' -d '{
"title": "class1",
"teachers": [
{
"name": "alex"
},
{
"name": "steve"
}
]
}'
curl -XPUT 'http://localhost:9200/must_again/class/2' -d '{
"title": "class2",
"teachers": [
{
"name": "alex"
}
]
}'
curl -XPUT 'http://localhost:9200/must_again/class/3' -d '{
"title": "class3",
"teachers": []
}'
此时,我有3个班级,只有史蒂夫教学的地方,还有没有教师的地方。
我的目标是获得史蒂夫没有教授的最后两个课程。
我正在使用的查询是
curl -XGET 'http://localhost:9200/must_again/class/_search' -d '{
"query": {
"nested": {
"path": "teachers",
"query": {
"bool": {
"must_not": [
{
"match": {
"teachers.name": "steve"
}
}
]
}
}
}
}
}'
返回
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 1.0,
"hits": [
{
"_index": "must_again",
"_type": "class",
"_id": "2",
"_score": 1.0,
"_source": {
"title": "class2",
"teachers": [
{
"name": "alex"
}
]
}
},
{
"_index": "must_again",
"_type": "class",
"_id": "1",
"_score": 1.0,
"_source": {
"title": "class1",
"teachers": [
{
"name": "alex"
},
{
"name": "steve"
}
]
}
}
]
}
}
预计会class2
,但不会class1
而class3
丢失。
如果我使用must
执行相同的查询,我会得到正确的结果(只有class1)。
不确定我做错了什么?
答案 0 :(得分:3)
一种解决方法。
curl -XPOST "http://localhost:9200/must_again/class/_search" -d'
{
"query": {
"bool": {
"must_not": [
{
"nested": {
"path": "teachers",
"query": {
"bool": {
"must": [
{
"match": {
"teachers.name": "steve"
}
}
]
}
}
}
}
]
}
}
}'
希望这会有所帮助!!