我有这样的索引定义:
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
},
},
"mappings": {
"properties": {
"parameters_for_filter": {
"type": "nested",
"properties": {
"parameters": {
"type": "nested",
"properties": {
"parameter_id": {
"type": "integer"
},
"parameter_value_id": {
"type": "integer"
}
}
}
}
}
}
}
}
这是一个产品的导出结果:
{
"_index": "product_1_9107bbdeb03269e1142d9822e585008c",
"_type": "_doc",
"_id": "69",
"_version": 1,
"_score": 0,
"_source": {
"id": 69,
"parameters_for_filter": {
"parameters": [
[
{
"parameter_id": 5,
"parameter_value_id": 10
},
{
"parameter_id": 3,
"parameter_value_id": 251
},
{
"parameter_id": 1,
"parameter_value_id": 248
}
],
[
{
"parameter_id": 5,
"parameter_value_id": 16
},
{
"parameter_id": 3,
"parameter_value_id": 251
},
{
"parameter_id": 1,
"parameter_value_id": 254
}
]
]
}
}
}
另一种产品:
{
"_index": "product_1_9107bbdeb03269e1142d9822e585008c",
"_type": "_doc",
"_id": "83",
"_version": 5,
"_score": 0,
"_source": {
"id": 83,
"parameters_for_filter": {
"parameters": [
[
{
"parameter_value_id": 10,
"parameter_id": 5
},
{
"parameter_value_id": 251,
"parameter_id": 3
},
{
"parameter_value_id": 254,
"parameter_id": 1
}
],
[
{
"parameter_value_id": 16,
"parameter_id": 5
},
{
"parameter_value_id": 121,
"parameter_id": 2
},
{
"parameter_value_id": 254,
"parameter_id": 1
}
]
]
}
}
}
内部的每个子阵列 parameters_for_filter.parameters
表示产品的各个变体的参数。
我需要做的是获得id为69的产品,用于组合过滤器: {{parameter_id: 5, parameter_value_id: 10}, {parameter_id: 1, parameter_value_id: 248}}
.
获取id为83的产品,用于组合过滤器: {{parameter_id: 5, parameter_value_id: 10}, {parameter_id: 1, parameter_value_id: 254}}
.
为过滤器组合获得两种产品: {{parameter_id: 5, parameter_value_id: 16}, {parameter_id: 1, parameter_value_id: 254}}
.
不获取过滤器组合的产品: {{parameter_id: 5, parameter_value_id: 16}, {parameter_id: 1, parameter_value_id: 248}}
.
通过当前查询,我得到了具有上述3种组合的产品:
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": [
{
"nested": {
"path": "parameters_for_filter.parameters",
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": [
{
"term": {
"parameters_for_filter.parameters.parameter_id": 5
}
},
{
"terms": {
"parameters_for_filter.parameters.parameter_value_id": [
10
]
}
}
]
}
}
}
},
{
"nested": {
"path": "parameters_for_filter.parameters",
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": [
{
"term": {
"parameters_for_filter.parameters.parameter_id": 1
}
},
{
"terms": {
"parameters_for_filter.parameters.parameter_value_id": [
248
]
}
}
]
}
}
}
}
]
}
}
}
实现我所需的过滤器是什么样子的,或者是否有更好的结构可以用于eshop中产品变量的参数(不将变量作为单独的对象导出)?
2条答案
按热度按时间i2loujxw1#
我们得让他知道
parameters
确实是不同的属性组,仔细观察,似乎有一个额外的括号[ ]
包含基本上使嵌套性为空的参数的对b/c所有内容都是一个大数组。我的建议如下:因为
parameters_for_filter
是一个正好由一个子对象组成的对象,我们将其默认为一个简单的object
我们将再添加一个嵌套级别来隔离我所称的parameter_groups
. 因此Map将如下所示:之后,让我们同步这两个文档。注意param组在逻辑上是如何分开的:
还有
id:83
```POST eshop/_doc
{
"id": 83,
"parameters_for_filter": {
"parameters": [
{
"parameter_groups": [
{
"parameter_value_id": 10,
"parameter_id": 5
},
{
"parameter_value_id": 251,
"parameter_id": 3
},
{
"parameter_value_id": 254,
"parameter_id": 1
}
]
},
{
"parameter_groups": [
{
"parameter_value_id": 16,
"parameter_id": 5
},
{
"parameter_value_id": 121,
"parameter_id": 2
},
{
"parameter_value_id": 254,
"parameter_id": 1
}
]
}
]
}
}
GET eshop/_search
{
"query": {
"nested": {
"path": "parameters_for_filter.parameters",
"query": {
"bool": {
"must": [
{
"nested": {
"path": "parameters_for_filter.parameters.parameter_groups",
"query": {
"bool": {
"must": [
{
"term": {
"parameters_for_filter.parameters.parameter_groups.parameter_id": 5
}
},
{
"terms": {
"parameters_for_filter.parameters.parameter_groups.parameter_value_id": [
16
]
}
}
]
}
}
}
},
{
"nested": {
"path": "parameters_for_filter.parameters.parameter_groups",
"query": {
"bool": {
"must": [
{
"term": {
"parameters_for_filter.parameters.parameter_groups.parameter_id": 1
}
},
{
"terms": {
"parameters_for_filter.parameters.parameter_groups.parameter_value_id": [
248
]
}
}
]
}
}
}
}
]
}
}
}
}
}
4urapxun2#
添加一个包含索引数据、搜索查询和搜索结果的工作示例(使用与前面给出的Map相同的Map)
你可以用
filter
条款,代替must
子句,如果你想忽略评分索引数据:
搜索查询:
搜索结果: