如何对来自不同层次结构的嵌套字段进行必须筛选的查询
How to make a query with a must filter on nested fields from different hierarchies
我的索引中有以下对象:
{
"user" : {
"info" : {
"fname" : "John",
"lname" : "Stark"
},
"settings" : {
"hide_menu" : true,
"time_offset" : 3
}
},
"views" : [
]
}
这是映射:
{
"dynamic" : "false",
"properties" : {
"user" : {
"type" : "nested",
"dynamic" : "false",
"properties" : {
"info" : {
"type" : "nested",
"dynamic" : "false",
"properties" : {
"fname" : {
"type" : "string",
"index" : "not_analyzed"
},
"lname" : {
"type" : "string",
"index" : "not_analyzed"
}
}
},
"settings" : {
"type" : "nested",
"dynamic" : "false",
"properties" : {
"hide_menu" : {
"type" : "boolean"
},
"time_offset" : {
"type" : "long"
}
}
}
}
}
}
}
我想创建一个过滤器来查找所有名字为 John 且 time_offset=3 的用户
所以我需要构建一个 must 过滤器,但问题是这两个字段嵌套在不同的层次结构中:user.info 和 user.settings
我怎样才能对它们进行 must 筛选 (AND)?
您可以简单地用点符号引用字段。
"filter":{
"bool": {
"must": [
{
"terms": {
"user.info.fname": [
"John"
]
}
},
{
"terms": {
"user.settings.time_offset": [
3
]
}
}
]
}
}
}
编辑:根据提供的映射更新查询
{
"filter": {
"nested": {
"path": "user",
"filter": {
"bool": {
"must": [
{
"nested": {
"path": "user.info",
"filter": {
"terms": {
"user.info.fname": [
"John"
]
}
}
}
},
{
"nested": {
"path": "user.settings",
"filter": {
"terms": {
"user.settings.time_offset": [
3
]
}
}
}
}
]
}
}
}
}
}
我的索引中有以下对象:
{
"user" : {
"info" : {
"fname" : "John",
"lname" : "Stark"
},
"settings" : {
"hide_menu" : true,
"time_offset" : 3
}
},
"views" : [
]
}
这是映射:
{
"dynamic" : "false",
"properties" : {
"user" : {
"type" : "nested",
"dynamic" : "false",
"properties" : {
"info" : {
"type" : "nested",
"dynamic" : "false",
"properties" : {
"fname" : {
"type" : "string",
"index" : "not_analyzed"
},
"lname" : {
"type" : "string",
"index" : "not_analyzed"
}
}
},
"settings" : {
"type" : "nested",
"dynamic" : "false",
"properties" : {
"hide_menu" : {
"type" : "boolean"
},
"time_offset" : {
"type" : "long"
}
}
}
}
}
}
}
我想创建一个过滤器来查找所有名字为 John 且 time_offset=3 的用户 所以我需要构建一个 must 过滤器,但问题是这两个字段嵌套在不同的层次结构中:user.info 和 user.settings
我怎样才能对它们进行 must 筛选 (AND)?
您可以简单地用点符号引用字段。
"filter":{
"bool": {
"must": [
{
"terms": {
"user.info.fname": [
"John"
]
}
},
{
"terms": {
"user.settings.time_offset": [
3
]
}
}
]
}
}
}
编辑:根据提供的映射更新查询
{
"filter": {
"nested": {
"path": "user",
"filter": {
"bool": {
"must": [
{
"nested": {
"path": "user.info",
"filter": {
"terms": {
"user.info.fname": [
"John"
]
}
}
}
},
{
"nested": {
"path": "user.settings",
"filter": {
"terms": {
"user.settings.time_offset": [
3
]
}
}
}
}
]
}
}
}
}
}