首页 > 解决方案 > 搜索整数的聚合列表 Elasticsearch

问题描述

我正在设计一个新索引,并且我的数据中有一些结构可能会给搜索带来一些麻烦。

给定一个文档类型“目录”(将其转换为更通用的设置)

具有以下数据结构,

{
  "_id": 1,
  "categories": [
    {
      "category_name": "aaaa",
      "nb_items": 6
    },
    {
      "category_name": "bbbb",
      "nb_items": 5
    }
  ]
},
{
  "_id": 2,
  "categories": [
    {
      "category_name": "cccc",
      "nb_items": 9
    },
    {
      "category_name": "bbbb",
      "nb_items": 2
    }
  ]
}

如何查询所有类别的项目数(类别名称的 nb_items 总和)> 10 但类别 bbbb 中的 nb_items > 4 的文档以仅检索第一个文档?

使用两个独立的列表类别和 nb_items 或使用这样的嵌套文档会更容易吗?

标签: elasticsearchnestedaggregation

解决方案


这件有灵魂的作品。您可以在过滤器部分使用脚本制作总 nb 条件,但这会非常慢。

  {
      "size": 0,
      "query" : {
    "nested" : {
        "path" : "categories",
        "query" : {
            "bool" : {
                "must" : [
                    {
                        "term" : {"categories.origin" : "bbbb"}
                    },
                    {
                        "range" : {"categories.nb_items" : {"gt" : 4}}
                    }
                ]}
            }
        }
    },
      "aggregations": {
        "totalnbbydoc": {
          "terms": {
            "field": "youriddoc",
            "size": 10000
          },
          "aggregations": {
            "totalByNested": {
              "nested": {
                "path": "categories"
              },
              "aggregations": {
                "nbtotal": {
                  "sum": {
                    "field": "categories.nb_items"
                  }
                }
              }
            },
            "paidAmount_filter": {
              "bucket_selector": {
                "script": {
                  "inline": "params.totalnbbydoc > 10"
                },
                "buckets_path": {
                  "totalnbbydoc": "totalByNested>nbtotal"
                }
              }
            }
          }
        }
      }
    }

推荐阅读