该回答引用GPTᴼᴾᴱᴺᴬᴵ
根据您的需求,您可以考虑使用Elasticsearch中的nested数据类型来存储unitPriceStrategyList中的嵌套结构,以便查询时能够准确匹配。建议将unitPriceStrategyList中的数据展开,每一条数据表示一种商品价格策略,以方便查询。例如,将数据转换成以下格式:
"id":1,
"price":200,
"unitPriceStrategyList" : [
{
"id" : 27,
"memberId" : 157,
"memberRoleId" : 8,
"memberPrice" : 500.0,
"isEnable" : true
},
{
"id" : 27,
"memberId" : 300,
"memberRoleId" : 4,
"memberPrice" : 500.0,
"isEnable" : true
},
{
"id" : 28,
"memberId" : 152,
"memberRoleId" : 8,
"memberPrice" : 100.0,
"isEnable" : true
},
{
"id" : 28,
"memberId" : 298,
"memberRoleId" : 4,
"memberPrice" : 100.0,
"isEnable" : true
}
]
接下来,您可以使用nested数据类型来定义unitPriceStrategyList的mapping,如下所示:
PUT /my_index
{
"mappings": {
"properties": {
"id": {
"type": "integer"
},
"price": {
"type": "double"
},
"unitPriceStrategyList": {
"type": "nested",
"properties": {
"id": {
"type": "integer"
},
"memberId": {
"type": "integer"
},
"memberRoleId": {
"type": "integer"
},
"memberPrice": {
"type": "double"
},
"isEnable": {
"type": "boolean"
}
}
}
}
}
}
接下来,您可以使用nested查询来查询符合条件的数据,并使用nested_path参数来指定unitPriceStrategyList的路径。例如,查询memberId=157和memberRoleId=8的数据,可以使用以下查询:
GET /my_index/_search
{
"query": {
"nested": {
"path": "unitPriceStrategyList",
"query": {
"bool": {
"must": [
{
"term": {
"unitPriceStrategyList.memberId": 157
}
},
{
"term": {
"unitPriceStrategyList.memberRoleId": 8
}
}
]
}
}
}
}
}
接下来,您可以使用Elasticsearch的排序功能来对查询结果进行排序。例如,使用以下查询对数据按照memberPrice进行升序排序:
GET index_name/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"unitPriceStrategyList.commodityMemberList.memberId": {
"value": 157
}
}
},
{
"term": {
"unitPriceStrategyList.commodityMemberList.memberRoleId": {
"value": 8
}
}
}
]
}
},
"sort": [
{
"unitPriceStrategyList.memberPrice": {
"order": "asc"
}
}
]
}
这个查询使用bool查询来限制memberId和memberRoleId,然后使用sort来按照unitPriceStrategyList.memberPrice进行升序排序。如果需要降序排序,只需要将"order"的值从"asc"改为"desc"即可。