按多个嵌套属性筛选

xj3cbfub  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(2)|浏览(334)

我有这样的索引定义:

  1. {
  2. "settings": {
  3. "index": {
  4. "number_of_shards": 1,
  5. "number_of_replicas": 0
  6. },
  7. },
  8. "mappings": {
  9. "properties": {
  10. "parameters_for_filter": {
  11. "type": "nested",
  12. "properties": {
  13. "parameters": {
  14. "type": "nested",
  15. "properties": {
  16. "parameter_id": {
  17. "type": "integer"
  18. },
  19. "parameter_value_id": {
  20. "type": "integer"
  21. }
  22. }
  23. }
  24. }
  25. }
  26. }
  27. }
  28. }

这是一个产品的导出结果:

  1. {
  2. "_index": "product_1_9107bbdeb03269e1142d9822e585008c",
  3. "_type": "_doc",
  4. "_id": "69",
  5. "_version": 1,
  6. "_score": 0,
  7. "_source": {
  8. "id": 69,
  9. "parameters_for_filter": {
  10. "parameters": [
  11. [
  12. {
  13. "parameter_id": 5,
  14. "parameter_value_id": 10
  15. },
  16. {
  17. "parameter_id": 3,
  18. "parameter_value_id": 251
  19. },
  20. {
  21. "parameter_id": 1,
  22. "parameter_value_id": 248
  23. }
  24. ],
  25. [
  26. {
  27. "parameter_id": 5,
  28. "parameter_value_id": 16
  29. },
  30. {
  31. "parameter_id": 3,
  32. "parameter_value_id": 251
  33. },
  34. {
  35. "parameter_id": 1,
  36. "parameter_value_id": 254
  37. }
  38. ]
  39. ]
  40. }
  41. }
  42. }

另一种产品:

  1. {
  2. "_index": "product_1_9107bbdeb03269e1142d9822e585008c",
  3. "_type": "_doc",
  4. "_id": "83",
  5. "_version": 5,
  6. "_score": 0,
  7. "_source": {
  8. "id": 83,
  9. "parameters_for_filter": {
  10. "parameters": [
  11. [
  12. {
  13. "parameter_value_id": 10,
  14. "parameter_id": 5
  15. },
  16. {
  17. "parameter_value_id": 251,
  18. "parameter_id": 3
  19. },
  20. {
  21. "parameter_value_id": 254,
  22. "parameter_id": 1
  23. }
  24. ],
  25. [
  26. {
  27. "parameter_value_id": 16,
  28. "parameter_id": 5
  29. },
  30. {
  31. "parameter_value_id": 121,
  32. "parameter_id": 2
  33. },
  34. {
  35. "parameter_value_id": 254,
  36. "parameter_id": 1
  37. }
  38. ]
  39. ]
  40. }
  41. }
  42. }

内部的每个子阵列 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种组合的产品:

  1. {
  2. "query": {
  3. "bool": {
  4. "must": {
  5. "match_all": {}
  6. },
  7. "filter": [
  8. {
  9. "nested": {
  10. "path": "parameters_for_filter.parameters",
  11. "query": {
  12. "bool": {
  13. "must": {
  14. "match_all": {}
  15. },
  16. "filter": [
  17. {
  18. "term": {
  19. "parameters_for_filter.parameters.parameter_id": 5
  20. }
  21. },
  22. {
  23. "terms": {
  24. "parameters_for_filter.parameters.parameter_value_id": [
  25. 10
  26. ]
  27. }
  28. }
  29. ]
  30. }
  31. }
  32. }
  33. },
  34. {
  35. "nested": {
  36. "path": "parameters_for_filter.parameters",
  37. "query": {
  38. "bool": {
  39. "must": {
  40. "match_all": {}
  41. },
  42. "filter": [
  43. {
  44. "term": {
  45. "parameters_for_filter.parameters.parameter_id": 1
  46. }
  47. },
  48. {
  49. "terms": {
  50. "parameters_for_filter.parameters.parameter_value_id": [
  51. 248
  52. ]
  53. }
  54. }
  55. ]
  56. }
  57. }
  58. }
  59. }
  60. ]
  61. }
  62. }
  63. }

实现我所需的过滤器是什么样子的,或者是否有更好的结构可以用于eshop中产品变量的参数(不将变量作为单独的对象导出)?

i2loujxw

i2loujxw1#

我们得让他知道 parameters 确实是不同的属性组,仔细观察,似乎有一个额外的括号 [ ] 包含基本上使嵌套性为空的参数的对b/c所有内容都是一个大数组。
我的建议如下:因为 parameters_for_filter 是一个正好由一个子对象组成的对象,我们将其默认为一个简单的 object 我们将再添加一个嵌套级别来隔离我所称的 parameter_groups . 因此Map将如下所示:

  1. PUT eshop
  2. {
  3. "settings": {
  4. "index": {
  5. "number_of_shards": 1,
  6. "number_of_replicas": 0
  7. }
  8. },
  9. "mappings": {
  10. "properties": {
  11. "parameters_for_filter": {
  12. "type": "object", <--
  13. "properties": {
  14. "parameters": {
  15. "type": "nested",
  16. "properties": {
  17. "parameter_groups": { <---
  18. "type": "nested",
  19. "properties": {
  20. "parameter_id": {
  21. "type": "integer"
  22. },
  23. "parameter_value_id": {
  24. "type": "integer"
  25. }
  26. }
  27. }
  28. }
  29. }
  30. }
  31. }
  32. }
  33. }
  34. }

之后,让我们同步这两个文档。注意param组在逻辑上是如何分开的:

  1. POST eshop/_doc
  2. {
  3. "id": 69,
  4. "parameters_for_filter": {
  5. "parameters": [
  6. {
  7. "parameter_groups": [
  8. {
  9. "parameter_id": 5,
  10. "parameter_value_id": 10
  11. },
  12. {
  13. "parameter_id": 3,
  14. "parameter_value_id": 251
  15. },
  16. {
  17. "parameter_id": 1,
  18. "parameter_value_id": 248
  19. }
  20. ]
  21. },
  22. {
  23. "parameter_groups": [
  24. {
  25. "parameter_id": 5,
  26. "parameter_value_id": 16
  27. },
  28. {
  29. "parameter_id": 3,
  30. "parameter_value_id": 251
  31. },
  32. {
  33. "parameter_id": 1,
  34. "parameter_value_id": 254
  35. }
  36. ]
  37. }
  38. ]
  39. }
  40. }

还有 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
}
]
}
]
}
}

  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
]
}
}
]
}
}
}
}
]
}
}
}
}
}

  1. 因此,您的4项要求都得到满足。
展开查看全部
4urapxun

4urapxun2#

添加一个包含索引数据、搜索查询和搜索结果的工作示例(使用与前面给出的Map相同的Map)
你可以用 filter 条款,代替 must 子句,如果你想忽略评分
索引数据:

  1. {
  2. "id": 69,
  3. "parameters_for_filter": {
  4. "parameters": [
  5. [
  6. {
  7. "parameter_id": 5,
  8. "parameter_value_id": 10
  9. },
  10. {
  11. "parameter_id": 3,
  12. "parameter_value_id": 251
  13. },
  14. {
  15. "parameter_id": 1,
  16. "parameter_value_id": 254
  17. }
  18. ]
  19. ]
  20. }
  21. }
  22. {
  23. "id": 69,
  24. "parameters_for_filter": {
  25. "parameters": [
  26. [
  27. {
  28. "parameter_id": 5,
  29. "parameter_value_id": 10
  30. },
  31. {
  32. "parameter_id": 3,
  33. "parameter_value_id": 251
  34. },
  35. {
  36. "parameter_id": 1,
  37. "parameter_value_id": 248
  38. }
  39. ]
  40. ]
  41. }
  42. }
  43. {
  44. "id": 69,
  45. "parameters_for_filter": {
  46. "parameters": [
  47. [
  48. {
  49. "parameter_id": 5,
  50. "parameter_value_id": 10
  51. },
  52. {
  53. "parameter_id": 3,
  54. "parameter_value_id": 251
  55. },
  56. {
  57. "parameter_id": 1,
  58. "parameter_value_id": 247
  59. }
  60. ]
  61. ]
  62. }
  63. }

搜索查询:

  1. {
  2. "query": {
  3. "bool": {
  4. "should": [
  5. {
  6. "bool": {
  7. "must": [
  8. {
  9. "nested": {
  10. "path": "parameters_for_filter.parameters",
  11. "query": {
  12. "bool": {
  13. "must": [
  14. {
  15. "match": {
  16. "parameters_for_filter.parameters.parameter_id": 5
  17. }
  18. },
  19. {
  20. "match": {
  21. "parameters_for_filter.parameters.parameter_value_id": 10
  22. }
  23. }
  24. ]
  25. }
  26. }
  27. }
  28. },
  29. {
  30. "nested": {
  31. "path": "parameters_for_filter.parameters",
  32. "query": {
  33. "bool": {
  34. "must": [
  35. {
  36. "match": {
  37. "parameters_for_filter.parameters.parameter_id": 1
  38. }
  39. },
  40. {
  41. "match": {
  42. "parameters_for_filter.parameters.parameter_value_id": 248
  43. }
  44. }
  45. ]
  46. }
  47. }
  48. }
  49. }
  50. ]
  51. }
  52. },
  53. {
  54. "bool": {
  55. "must": [
  56. {
  57. "nested": {
  58. "path": "parameters_for_filter.parameters",
  59. "query": {
  60. "bool": {
  61. "must": [
  62. {
  63. "match": {
  64. "parameters_for_filter.parameters.parameter_id": 5
  65. }
  66. },
  67. {
  68. "match": {
  69. "parameters_for_filter.parameters.parameter_value_id": 16
  70. }
  71. }
  72. ]
  73. }
  74. }
  75. }
  76. },
  77. {
  78. "nested": {
  79. "path": "parameters_for_filter.parameters",
  80. "query": {
  81. "bool": {
  82. "must": [
  83. {
  84. "match": {
  85. "parameters_for_filter.parameters.parameter_id": 1
  86. }
  87. },
  88. {
  89. "match": {
  90. "parameters_for_filter.parameters.parameter_value_id": 254
  91. }
  92. }
  93. ]
  94. }
  95. }
  96. }
  97. }
  98. ]
  99. }
  100. }
  101. ]
  102. }
  103. }
  104. }

搜索结果:

  1. "hits": [
  2. {
  3. "_index": "64678935",
  4. "_type": "_doc",
  5. "_id": "2",
  6. "_score": 4.0,
  7. "_source": {
  8. "id": 69,
  9. "parameters_for_filter": {
  10. "parameters": [
  11. [
  12. {
  13. "parameter_id": 5,
  14. "parameter_value_id": 10
  15. },
  16. {
  17. "parameter_id": 3,
  18. "parameter_value_id": 251
  19. },
  20. {
  21. "parameter_id": 1,
  22. "parameter_value_id": 248
  23. }
  24. ]
  25. ]
  26. }
  27. }
  28. }
  29. ]
展开查看全部

相关问题