ElasticSearch 嵌套查询不按预期工作
ElasticSearch Nested Query Does not work as expected
我需要一个快速帮助,我需要仅当我的特定条件在同一个数组中得到满足时才需要获取整个文档。
例子
在一个数组块中这三个条件都满足的条件。即
- "profile.bud.buddies.code": "1"
- "profile.bud.buddies.moredata.key":"one"
- "profile.bud.buddies.moredata.val": "0"
不幸的是,现在它正在遍历整个文档并尝试匹配每个数组中的值,因此可能是这样 code=1 在一个数组中匹配,key=one 在其他数组中匹配,而 val =0 在第三个数组中。在这种情况下会发生什么 returns 整个文档,而实际上这并没有单独在一个数组中实现,所以不应该将文档返回给我。
我把moredata设为嵌套类型,但还是打不通。请帮忙。
查询我正在使用
</p>
<pre><code>"query": {
"bool": {
"should": [
{
"match": {
"profile.bud.buddies.code": "1"
}
}
]
},
"nested": {
"path": "profile.bud.buddies.moredata",
"query": {
"bool": {
"must": [
{
"match": {
"profile.bud.buddies.moredata.key": "one"
}
},
{
"match": {
"profile.bud.buddies.moredata.val": "0"
}
}
]
}
}
}
}
文档结构
</p>
<pre><code>"profile": {
"x":{},
"y":{},
"a":{},
"b":{},
"bud":{
"buddies": [
{
"code":"1",
"moredata": [
{
"key": "one",
"val": 0,
"setup": "2323",
"data": "myid"
},
{
"key": "two",
"val": 1,
"setup": "23",
"data": "id"
}]
},
{
"code":"2",
"moredata": [
{
"key": "two",
"val": 0,
"setup": "2323",
"data": "myid"
},
{
"key": "three",
"val": 1,
"setup": "23",
"data": "id"
}]
}]
}
这就是我标记映射的方式;
</p>
<pre><code>"profile": {
"bug": {
"properties": {
"buddies": {
"properties": {
"moredata": {
"type": "nested",
"properties": {
"key": {"type": "string"},
"val": {"type": "string"}
你的查询结构不正确,应该是这样的
"query": {
"bool": {
"must": [{
"match": {
"profile.bud.buddies.code": "1"
}
},
{
"nested": {
"path": "profile.bud.buddies.moredata",
"query": {
"bool": {
"must": [{
"match": {
"profile.bud.buddies.moredata.key": "one"
}
},
{
"match": {
"profile.bud.buddies.moredata.val": "0"
}
}
]
}
}
}
]
}
}
}
其中 nested
查询位于外部 bool
查询的 must
子句数组内部。请注意,profile.bud.buddies.moredata
必须映射为 nested
数据类型。
我需要一个快速帮助,我需要仅当我的特定条件在同一个数组中得到满足时才需要获取整个文档。
例子
在一个数组块中这三个条件都满足的条件。即
- "profile.bud.buddies.code": "1"
- "profile.bud.buddies.moredata.key":"one"
- "profile.bud.buddies.moredata.val": "0"
不幸的是,现在它正在遍历整个文档并尝试匹配每个数组中的值,因此可能是这样 code=1 在一个数组中匹配,key=one 在其他数组中匹配,而 val =0 在第三个数组中。在这种情况下会发生什么 returns 整个文档,而实际上这并没有单独在一个数组中实现,所以不应该将文档返回给我。
我把moredata设为嵌套类型,但还是打不通。请帮忙。
查询我正在使用
</p>
<pre><code>"query": {
"bool": {
"should": [
{
"match": {
"profile.bud.buddies.code": "1"
}
}
]
},
"nested": {
"path": "profile.bud.buddies.moredata",
"query": {
"bool": {
"must": [
{
"match": {
"profile.bud.buddies.moredata.key": "one"
}
},
{
"match": {
"profile.bud.buddies.moredata.val": "0"
}
}
]
}
}
}
}
文档结构
</p>
<pre><code>"profile": {
"x":{},
"y":{},
"a":{},
"b":{},
"bud":{
"buddies": [
{
"code":"1",
"moredata": [
{
"key": "one",
"val": 0,
"setup": "2323",
"data": "myid"
},
{
"key": "two",
"val": 1,
"setup": "23",
"data": "id"
}]
},
{
"code":"2",
"moredata": [
{
"key": "two",
"val": 0,
"setup": "2323",
"data": "myid"
},
{
"key": "three",
"val": 1,
"setup": "23",
"data": "id"
}]
}]
}
这就是我标记映射的方式;
</p>
<pre><code>"profile": {
"bug": {
"properties": {
"buddies": {
"properties": {
"moredata": {
"type": "nested",
"properties": {
"key": {"type": "string"},
"val": {"type": "string"}
你的查询结构不正确,应该是这样的
"query": {
"bool": {
"must": [{
"match": {
"profile.bud.buddies.code": "1"
}
},
{
"nested": {
"path": "profile.bud.buddies.moredata",
"query": {
"bool": {
"must": [{
"match": {
"profile.bud.buddies.moredata.key": "one"
}
},
{
"match": {
"profile.bud.buddies.moredata.val": "0"
}
}
]
}
}
}
]
}
}
}
其中 nested
查询位于外部 bool
查询的 must
子句数组内部。请注意,profile.bud.buddies.moredata
必须映射为 nested
数据类型。