弹性搜索查询 - 在对象数组中
Elastic search Query - in array of objects
我创建了一个包含 100 多个文档的索引,这里是示例 2 个文档
文档 1:
"OfficeId": 1, "Officename": "Washers Ltd", "customers": [
{
"customerid":10,
"customername": Mike,
"customerphone": 1111111111
}
,
{
"customerid":20,
"customername": Angie,
"customerphone": 2222222222
} ]
文档 2:
"OfficeId": 2, "Officename": "Coldwell Ltd", "customers": [
{
"customerid":30,
"customername": Nathan,
"customerphone": 1111111111
} ]
在 UI 中,我们可以按客户名称或客户phone 进行搜索。当我按 phone 1111111111 搜索时,我应该得到 2 个文档(命中 0,命中 1)但在第一个 document/hit 0 中,我如何过滤只显示 1 个对象?
您需要使用nested query along with inner_hits
添加具有索引数据、映射、搜索查询和搜索结果的工作示例
索引映射:
{
"mappings": {
"properties": {
"customers": {
"type": "nested"
}
}
}
}
索引数据:
{
"OfficeId": 2,
"Officename": "Coldwell Ltd",
"customers": [
{
"customerid": 30,
"customername": "Nathan",
"customerphone": 1111111111
}
]
}
{
"OfficeId": 1,
"Officename": "Washers Ltd",
"customers": [
{
"customerid": 10,
"customername": "Mike",
"customerphone": 1111111111
},
{
"customerid": 20,
"customername": "Angie",
"customerphone": 2222222222
}
]
}
搜索查询:
{
"query": {
"nested": {
"path": "customers",
"query": {
"bool": {
"must": [
{
"match": {
"customers.customerphone": "1111111111"
}
}
]
}
},
"inner_hits": {}
}
}
}
搜索结果将是
"hits": [
{
"_index": "67228476",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"OfficeId": 1,
"Officename": "Washers Ltd",
"customers": [
{
"customerid": 10,
"customername": "Mike",
"customerphone": 1111111111
},
{
"customerid": 20,
"customername": "Angie",
"customerphone": 2222222222
}
]
},
"inner_hits": {
"customers": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "67228476",
"_type": "_doc",
"_id": "1",
"_nested": {
"field": "customers",
"offset": 0
},
"_score": 1.0,
"_source": {
"customerid": 10, // note this
"customername": "Mike",
"customerphone": 1111111111
}
}
]
}
}
}
},
{
"_index": "67228476",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"OfficeId": 2,
"Officename": "Coldwell Ltd",
"customers": [
{
"customerid": 30,
"customername": "Nathan",
"customerphone": 1111111111
}
]
},
"inner_hits": {
"customers": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "67228476",
"_type": "_doc",
"_id": "2",
"_nested": {
"field": "customers",
"offset": 0
},
"_score": 1.0,
"_source": {
"customerid": 30, // note this
"customername": "Nathan",
"customerphone": 1111111111
}
}
]
}
}
}
}
]
更新 1:
如果您想再包含一个 match
子句,请使用此查询
{
"query": {
"nested": {
"path": "customers",
"query": {
"bool": {
"must": [
{
"match": {
"customers.customerphone": "1111111111"
}
},
{
"match": {
"customers.customername": "Nathan"
}
}
]
}
},
"inner_hits": {}
}
}
}
我创建了一个包含 100 多个文档的索引,这里是示例 2 个文档
文档 1:
"OfficeId": 1, "Officename": "Washers Ltd", "customers": [
{ "customerid":10, "customername": Mike, "customerphone": 1111111111 } , { "customerid":20, "customername": Angie, "customerphone": 2222222222 } ]
文档 2:
"OfficeId": 2, "Officename": "Coldwell Ltd", "customers": [
{ "customerid":30, "customername": Nathan, "customerphone": 1111111111 } ]
在 UI 中,我们可以按客户名称或客户phone 进行搜索。当我按 phone 1111111111 搜索时,我应该得到 2 个文档(命中 0,命中 1)但在第一个 document/hit 0 中,我如何过滤只显示 1 个对象?
您需要使用nested query along with inner_hits
添加具有索引数据、映射、搜索查询和搜索结果的工作示例
索引映射:
{
"mappings": {
"properties": {
"customers": {
"type": "nested"
}
}
}
}
索引数据:
{
"OfficeId": 2,
"Officename": "Coldwell Ltd",
"customers": [
{
"customerid": 30,
"customername": "Nathan",
"customerphone": 1111111111
}
]
}
{
"OfficeId": 1,
"Officename": "Washers Ltd",
"customers": [
{
"customerid": 10,
"customername": "Mike",
"customerphone": 1111111111
},
{
"customerid": 20,
"customername": "Angie",
"customerphone": 2222222222
}
]
}
搜索查询:
{
"query": {
"nested": {
"path": "customers",
"query": {
"bool": {
"must": [
{
"match": {
"customers.customerphone": "1111111111"
}
}
]
}
},
"inner_hits": {}
}
}
}
搜索结果将是
"hits": [
{
"_index": "67228476",
"_type": "_doc",
"_id": "1",
"_score": 1.0,
"_source": {
"OfficeId": 1,
"Officename": "Washers Ltd",
"customers": [
{
"customerid": 10,
"customername": "Mike",
"customerphone": 1111111111
},
{
"customerid": 20,
"customername": "Angie",
"customerphone": 2222222222
}
]
},
"inner_hits": {
"customers": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "67228476",
"_type": "_doc",
"_id": "1",
"_nested": {
"field": "customers",
"offset": 0
},
"_score": 1.0,
"_source": {
"customerid": 10, // note this
"customername": "Mike",
"customerphone": 1111111111
}
}
]
}
}
}
},
{
"_index": "67228476",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_source": {
"OfficeId": 2,
"Officename": "Coldwell Ltd",
"customers": [
{
"customerid": 30,
"customername": "Nathan",
"customerphone": 1111111111
}
]
},
"inner_hits": {
"customers": {
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": "67228476",
"_type": "_doc",
"_id": "2",
"_nested": {
"field": "customers",
"offset": 0
},
"_score": 1.0,
"_source": {
"customerid": 30, // note this
"customername": "Nathan",
"customerphone": 1111111111
}
}
]
}
}
}
}
]
更新 1:
如果您想再包含一个 match
子句,请使用此查询
{
"query": {
"nested": {
"path": "customers",
"query": {
"bool": {
"must": [
{
"match": {
"customers.customerphone": "1111111111"
}
},
{
"match": {
"customers.customername": "Nathan"
}
}
]
}
},
"inner_hits": {}
}
}
}