gpt4 book ai didi

elasticsearch - 按多个嵌套属性过滤

转载 作者:行者123 更新时间:2023-12-02 22:53:00 26 4
gpt4 key购买 nike

我有这样的索引定义:

    {
"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中使用更好的结构作为产品变型的参数(而不将变体作为单独的对象导出)?

最佳答案

我们必须以某种方式让ES知道parameters确实是不同的属性组,并且仔细检查似乎会发现,有一对额外的括号[ ]对封闭了参数,这实际上使嵌套b / c无效,所有东西都是一个大数组。
我的建议如下:由于parameters_for_filter是一个恰好由1个 child 组成的对象,因此我们将其默认设置为简单的object,并且将添加更多级别的嵌套来隔离我称之为parameter_groups的内容。
因此,映射将如下所示:

PUT eshop
{
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 0
}
},
"mappings": {
"properties": {
"parameters_for_filter": {
"type": "object", <--
"properties": {
"parameters": {
"type": "nested",
"properties": {
"parameter_groups": { <---
"type": "nested",
"properties": {
"parameter_id": {
"type": "integer"
},
"parameter_value_id": {
"type": "integer"
}
}
}
}
}
}
}
}
}
}
之后,让我们同步2个文档。请注意,参数组在逻辑上是如何分离的:
POST eshop/_doc
{
"id": 69,
"parameters_for_filter": {
"parameters": [
{
"parameter_groups": [
{
"parameter_id": 5,
"parameter_value_id": 10
},
{
"parameter_id": 3,
"parameter_value_id": 251
},
{
"parameter_id": 1,
"parameter_value_id": 248
}
]
},
{
"parameter_groups": [
{
"parameter_id": 5,
"parameter_value_id": 16
},
{
"parameter_id": 3,
"parameter_value_id": 251
},
{
"parameter_id": 1,
"parameter_value_id": 254
}
]
}
]
}
}
还有 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
}
]
}
]
}
}
之后,我们将继续进行查询,该查询将查找这两个条件的 must组合,尽管它们位于单独的 parameter_groups路径下:
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
]
}
}
]
}
}
}
}
]
}
}
}
}
}
从而满足您所有的4个要求。

关于elasticsearch - 按多个嵌套属性过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64678935/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com