结合嵌套、存在、不存在查询的 Elasticsearch curl 查询
Elasticsearch curl query combining nested, exists, not exists query
我无法弄清楚如何包装 "query" 语句以使我对复杂嵌套对象的查询能够正常工作。
我已将概念简化为以下 -
我有一个索引,其中包含
{
"_index": "my_index",
"_type": "my_type",
"_id": "5",
"_source": {
"group": "student",
"user": [
{
"first": "Hubert",
"last": "Rock",
"grade": "B",
"address": "12 Hunting St"
}
]
}
}
其中 'user' 是嵌套对象。现在我想进行搜索以识别名字为 'Hubert' 的条目,
但谁在 'grade' 和 'address' 字段中都没有条目。
我可以单独做 -
(获取所有 'Hubert's)
GET my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Hubert" }}
]
}
}
}
}
}
(获取所有没有 'grade' 和 'address' 值的条目)
GET my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must_not": [
{
"exists" : {
"field":"user.grade"
}
},
{
"exists" : {
"field":"user.address"
}
}
]
}
}
}
}
}
但是我真的不知道怎么把它们组合起来。有什么想法吗?
您只需将 must
和 must_not
子句组合在一个 bool 查询下,如下所示:
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{
"match": {
"user.first": "Hubert"
}
}
],
"must_not": [
{
"exists": {
"field": "user.grade"
}
},
{
"exists": {
"field": "user.address"
}
}
]
}
}
}
}
}
我无法弄清楚如何包装 "query" 语句以使我对复杂嵌套对象的查询能够正常工作。
我已将概念简化为以下 -
我有一个索引,其中包含
{
"_index": "my_index",
"_type": "my_type",
"_id": "5",
"_source": {
"group": "student",
"user": [
{
"first": "Hubert",
"last": "Rock",
"grade": "B",
"address": "12 Hunting St"
}
]
}
}
其中 'user' 是嵌套对象。现在我想进行搜索以识别名字为 'Hubert' 的条目, 但谁在 'grade' 和 'address' 字段中都没有条目。
我可以单独做 - (获取所有 'Hubert's)
GET my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{ "match": { "user.first": "Hubert" }}
]
}
}
}
}
}
(获取所有没有 'grade' 和 'address' 值的条目)
GET my_index/_search
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must_not": [
{
"exists" : {
"field":"user.grade"
}
},
{
"exists" : {
"field":"user.address"
}
}
]
}
}
}
}
}
但是我真的不知道怎么把它们组合起来。有什么想法吗?
您只需将 must
和 must_not
子句组合在一个 bool 查询下,如下所示:
{
"query": {
"nested": {
"path": "user",
"query": {
"bool": {
"must": [
{
"match": {
"user.first": "Hubert"
}
}
],
"must_not": [
{
"exists": {
"field": "user.grade"
}
},
{
"exists": {
"field": "user.address"
}
}
]
}
}
}
}
}