在 Elastic Search 中查询特定的列表索引
Querying Specific List Indexes In Elastic Search
所以我在 Elasticsearch 中有一个搜索查询,它查询一个名为 myList 的字段。该列表中包含元素。 elm1、elm2 和 elm3。我希望能够查询该列表,以便所有元素都必须匹配。例如:
myList: [{
elm1: "value1",
elm2: "value2",
elm3: "value4"
},
{
elm1: "value2"
elm2: "value3"
elm3: "value3"
},
{
elm1: "value3",
elm2: "value4",
elm3: "value5"
}]
如果我构建查询以搜索以下字段:elm1 = value1 and elm2 = value2 and elm3=value3,
"query": {
"bool": {
"must": [],
"filter": [
{
"bool": {
"filter": [
{
"bool": {
"should": [
{
"query_string": {
"fields": [
"myList.elm1.keyword"
],
"query": "value1"
}
}
],
"minimum_should_match": 1
}
},"bool": {
"filter": [
{
"bool": {
"should": [
{
"query_string": {
"fields": [
"myList.elm2.keyword"
],
"query": "value2"
}
}
],
"minimum_should_match": 1
}
},"bool": {
"filter": [
{
"bool": {
"should": [
{
"query_string": {
"fields": [
"myList.elm3.keyword"
],
"query": "value3"
}
}
],
"minimum_should_match": 1
}
}
}
]
}
}
它将 return 为真,因为
myList[0]['elm1']=value1
myList[0]['elm2']=value2
myList[1]['elm3']=value3
这不是我想要的。
我怎样才能得到它
myList[x]['elm1']=value1
myList[y]['elm2']=value2
myList[z]['elm3']=value3
其中 x=y=z
当您处理 arrays of objects 时,这些对象会变得扁平并且基本上失去彼此之间的联系。
您应该改用 nested
field type:
PUT elms_deep
{
"mappings": {
"properties": {
"myList": {
"type": "nested"
}
}
}
}
然后重新添加您的文件:
POST elms_deep/_doc
{
"myList": [
{
"elm1": "value1",
"elm2": "value2",
"elm3": "value4"
},
{
"elm1": "value2",
"elm2": "value3",
"elm3": "value3"
},
{
"elm1": "value3",
"elm2": "value4",
"elm3": "value5"
}
]
}
然后继续 3 个 nested
term
查询——当您定位 .keyword
字段时,不需要您原来的 query_string
查询:
POST elms_deep/_search
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "myList",
"query": {
"term": {
"myList.elm1.keyword": {
"value": "value1"
}
}
}
}
},
{
"nested": {
"path": "myList",
"query": {
"term": {
"myList.elm2.keyword": {
"value": "value2"
}
}
}
}
},
{
"nested": {
"path": "myList",
"query": {
"term": {
"myList.elm3.keyword": {
"value": "value3"
}
}
}
}
}
]
}
}
}
所以 answer is nearly there, he's right you need to use the nested field type。他的回答给出了
的可能性
myList[x]['elm1']=value1
myList[y]['elm2']=value2
myList[z]['elm3']=value3
其中x,y,z为独立元素。
如果你想要 x=y=z:
{
"query": {
"nested": {
"path": "myList",
"query": {
"bool": {
"filter": [
{
"term": {
"myList.elm1.keyword": {
"value": "value1"
}
}
},
{
"term": {
"myList.elm1.keyword": {
"value": "value1"
}
}
},
{
"term": {
"myList.elm1.keyword": {
"value": "value1"
}
}
}
]
}
}
}
}
}
所以我在 Elasticsearch 中有一个搜索查询,它查询一个名为 myList 的字段。该列表中包含元素。 elm1、elm2 和 elm3。我希望能够查询该列表,以便所有元素都必须匹配。例如:
myList: [{
elm1: "value1",
elm2: "value2",
elm3: "value4"
},
{
elm1: "value2"
elm2: "value3"
elm3: "value3"
},
{
elm1: "value3",
elm2: "value4",
elm3: "value5"
}]
如果我构建查询以搜索以下字段:elm1 = value1 and elm2 = value2 and elm3=value3,
"query": {
"bool": {
"must": [],
"filter": [
{
"bool": {
"filter": [
{
"bool": {
"should": [
{
"query_string": {
"fields": [
"myList.elm1.keyword"
],
"query": "value1"
}
}
],
"minimum_should_match": 1
}
},"bool": {
"filter": [
{
"bool": {
"should": [
{
"query_string": {
"fields": [
"myList.elm2.keyword"
],
"query": "value2"
}
}
],
"minimum_should_match": 1
}
},"bool": {
"filter": [
{
"bool": {
"should": [
{
"query_string": {
"fields": [
"myList.elm3.keyword"
],
"query": "value3"
}
}
],
"minimum_should_match": 1
}
}
}
]
}
}
它将 return 为真,因为
myList[0]['elm1']=value1
myList[0]['elm2']=value2
myList[1]['elm3']=value3
这不是我想要的。
我怎样才能得到它
myList[x]['elm1']=value1
myList[y]['elm2']=value2
myList[z]['elm3']=value3
其中 x=y=z
当您处理 arrays of objects 时,这些对象会变得扁平并且基本上失去彼此之间的联系。
您应该改用 nested
field type:
PUT elms_deep
{
"mappings": {
"properties": {
"myList": {
"type": "nested"
}
}
}
}
然后重新添加您的文件:
POST elms_deep/_doc
{
"myList": [
{
"elm1": "value1",
"elm2": "value2",
"elm3": "value4"
},
{
"elm1": "value2",
"elm2": "value3",
"elm3": "value3"
},
{
"elm1": "value3",
"elm2": "value4",
"elm3": "value5"
}
]
}
然后继续 3 个 nested
term
查询——当您定位 .keyword
字段时,不需要您原来的 query_string
查询:
POST elms_deep/_search
{
"query": {
"bool": {
"filter": [
{
"nested": {
"path": "myList",
"query": {
"term": {
"myList.elm1.keyword": {
"value": "value1"
}
}
}
}
},
{
"nested": {
"path": "myList",
"query": {
"term": {
"myList.elm2.keyword": {
"value": "value2"
}
}
}
}
},
{
"nested": {
"path": "myList",
"query": {
"term": {
"myList.elm3.keyword": {
"value": "value3"
}
}
}
}
}
]
}
}
}
所以
myList[x]['elm1']=value1
myList[y]['elm2']=value2
myList[z]['elm3']=value3
其中x,y,z为独立元素。
如果你想要 x=y=z:
{
"query": {
"nested": {
"path": "myList",
"query": {
"bool": {
"filter": [
{
"term": {
"myList.elm1.keyword": {
"value": "value1"
}
}
},
{
"term": {
"myList.elm1.keyword": {
"value": "value1"
}
}
},
{
"term": {
"myList.elm1.keyword": {
"value": "value1"
}
}
}
]
}
}
}
}
}