我正在努力完成归结为ElasticSearch中嵌套文档的布尔AND
。假设我有以下两个文件。
{
"id": 1,
"secondLevels": [
{
"thirdLevels": [
{
"isActive": true,
"user": "anotheruser@domain.com"
}
]
},
{
"thirdLevels": [
{
"isActive": false,
"user": "user@domain.com"
}
]
}
]
}
{
"id": 2,
"secondLevels": [
{
"thirdLevels": [
{
"isActive": true,
"user": "user@domain.com"
}
]
}
]
}
在这种情况下,我想只匹配具有isActive: true
和user: user@domain.com
的嵌套文档的文档(在本例中为ID:2)。
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "secondLevels.thirdLevels",
"query": {
"bool": {
"must": [
{
"term": {
"secondLevels.thirdLevels.isActive": true
}
},
{
"term": {
"secondLevels.thirdLevels.user": "user@domain.com"
}
}
]
}
}
}
}
]
}
}
}
然而,似乎正在发生的事情是我的查询出现了两个文档,因为第一个文档有一个thirdLevel
具有isActive: true
而另一个thirdLevel
具有相应的用户。< / p>
有没有办法在查询/过滤时严格执行此操作,还是必须在脚本中执行此操作?
答案 0 :(得分:2)
使用嵌套对象和嵌套查询,您已经完成了大部分工作。
您现在要做的就是添加inner hits标记,并使用source filtering将整个secondLevels
文档移开:
{
"query": {
"bool": {
"must": [
{
"nested": {
"path": "secondLevels.thirdLevels",
"query": {
"bool": {
"must": [
{
"term": {
"secondLevels.thirdLevels.isActive": true
}
},
{
"term": {
"secondLevels.thirdLevels.user": "user@domain.com"
}
}
]
}
},
"inner_hits": {
"size": 100
}
}
}
]
}
}
}