我正在尝试对嵌套对象应用多个过滤器,并且我只想返回在单个对象中具有所有匹配项的文档,而不是从多个对象中返回。
弹性搜索中的数据
D1 document
"fields":[
{
"field_name": "test",
"field_value": "test",
"field_id": "123"
},
{
"field_name": "test1",
"field_value": "test1",
"field_id": "1231"
},
{
"field_name": "test2",
"field_value": "test2",
"field_id": "1232"
}]
D2 document
"fields":[
{
"field_name": "test1",
"field_value": "testda",
"field_id": "123a"
},
{
"field_name": "test1ad",
"field_value": "test1",
"field_id": "1231"
},
{
"field_name": "test2a",
"field_value": "test2a",
"field_id": "1231"
}]
字段是具有文本和关键字映射的嵌套对象
"fields": {
"type": "nested",
"properties": {
"field_id": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"field_name": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"field_value": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
这是我的弹性搜索查询
GET myindex/_search
{
"query": {
"bool": {
"filter": {
"nested":{
"path":"fields",
"query":{
"bool":{
"must":{
"bool":{
"must":[{
"match":{
"field_id.raw": "1231"
}
},
{
"match":{
"field_value.raw": "test1"
}
},
{
"match":{
"field_name.raw": "test1"
}
}]
}
}
}
}
}
}
}
}
}
我没有得到任何回应。 而且我只希望返回第一个文档,因为它在同一对象中具有匹配项,而不是在此处和那里也具有匹配项的文档2中。 预先感谢...
答案 0 :(得分:0)
对于嵌套字段,必须使用完全限定的名称。因此,它应该是field_id.raw
而不是fields.field_id.raw
。其他字段也是如此。
所以您的查询应该是:
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "fields",
"query": {
"bool": {
"must": [
{
"match": {
"fields.field_id.raw": "1231"
}
},
{
"match": {
"fields.field_value.raw": "test1"
}
},
{
"match": {
"fields.field_name.raw": "test1"
}
}
]
}
}
}
}
]
}
}
}