对于嵌套对象,我具有以下索引架构:
"workExperiences": {
"type": "nested",
"properties": {
"isCurrentWorkplace": {
"type": "boolean"
},
"title": {
"properties": {
"id": {
"type": "text"
},
"name": {
"type": "text"
}
}
}
}
}
此数据如下:
{
"hits": [{
"_source": {
"workExperiences": [{
"isCurrentWorkPlace": true,
"title": {
"name": "Some name",
"id": 259
}
},
{
"isCurrentWorkPlace": false,
"title": {
"name": "Some other name",
"id": 256
}
},
{
"isCurrentWorkPlace": false,
"title": {
"name": "another name",
"id": 257
}
}
]
}
},
{
"_source": {
"workExperiences": [{
"isCurrentWorkPlace": true,
"title": {
"name": "another workplace",
"id": 260
}
},
{
"isCurrentWorkPlace": false,
"title": {
"name": "Some other name",
"id": 256
}
},
{
"isCurrentWorkPlace": false,
"title": {
"name": "another name",
"id": 257
}
}
]
}
}
]
}
现在,如果我做一些简单的查询,例如查找“ isCurrentWorkplace”为true且title.id为259的工作场所,则它可以正常工作:
{
"from": 0,
"size": 30,
"_source": [
"workExperiences.*"
],
"query": {
"bool": {
"filter": {
"bool": {
"must": [{
"nested": {
"path": "workExperiences",
"query": {
"bool": {
"must": [{
"term": {
"workExperiences.title.id": 259
}
},
{
"term": {
"workExperiences.isCurrentWorkPlace": true
}
}
]
}
}
}
}]
}
}
}
}
}
现在的问题是,我需要组合这些must子句。对于 例如,我需要找到一条“ isCurrentWorkplace”为true的记录 并且“ title.id”为259 AND ,其“ isCurrentWorkplace”为false, “ title.id”是256。
为此,我创建了以下查询:
{
"from": 0,
"size": 30,
"_source": [
"workExperiences.*"
],
"query": {
"bool": {
"filter": {
"bool": {
"must": [{
"nested": {
"path": "workExperiences",
"query": {
"bool": {
"must": [{
"bool": {
"must": [{
"terms": {
"workExperiences.title.id": [259]
}
},
{
"term": {
"workExperiences.isCurrentWorkPlace": true
}
}
]
}
},
{
"bool": {
"must": [{
"term": {
"workExperiences.title.id": 256
}
},
{
"term": {
"workExperiences.isCurrentWorkPlace": false
}
}
]
}
}
]
}
}
}
}]
}
}
}
}
}
但是,这不起作用。有人可以帮我弄清楚我在做什么错吗?
谢谢!
答案 0 :(得分:2)
基于您要实现的目标:记录("workExperiences.isCurrentWorkplace": true
和"workExperiences.title.id": 259
) OR ("workExperiences.isCurrentWorkplace": false
和"workExperiences.title.id": 256
)的位置。因此,您需要should
子句而不是must
子句:
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "workExperiences",
"query": {
"bool": {
"should": [
{
"bool": {
"must": [
{
"term": {
"workExperiences.isCurrentWorkplace": true
}
},
{
"term": {
"workExperiences.title.id": 259
}
}
]
}
},
{
"bool": {
"must": [
{
"term": {
"workExperiences.isCurrentWorkplace": false
}
},
{
"term": {
"workExperiences.title.id": 256
}
}
]
}
}
]
}
}
}
}
]
}
}
}
如果您的意思是如果同一文档包含两个以上的对象,则该文档应出现,其中workExperiences
下的一个对象具有("workExperiences.isCurrentWorkplace": true and "workExperiences.title.id": 259
) AND 而一个对象具有({ {1}}),则查询将为:
"workExperiences.isCurrentWorkplace": false and "workExperiences.title.id": 256