首页 > 解决方案 > 比较按日期分区的不同索引中的两个弹性搜索文档字段

问题描述

我使用以下简化结构按天对数据进行了分区(将数组中的对象视为单独的文档)。实际文件量将超过1000万:

/products-2019.01.01

[
  {
    "id": 1,
    "name": "Product1",
    "price": 15
  },
  {
    "id": 2,
    "name": "Product2",
    "price": 10
  },
  {
    "id": 3,
    "name": "Product3",
    "price": 10
  }
]

/products-2019.01.02

[
  {
    "id": 1,
    "name": "Product1",
    "price": 10
  },
  {
    "id": 2,
    "name": "Product2",
    "price": 12
  },
  {
    "id": 3,
    "name": "Product3",
    "price": 10
  }
]

/products-2019.01.03

[
  {
    "id": 1,
    "name": "Product1",
    "price": 10
  },
  {
    "id": 2,
    "name": "Product2",
    "price": 10
  },
  {
    "id": 3,
    "name": "Product3",
    "price": 13
  }
]

我的用例是我需要比较两个确切日期之间的价格,在这种情况下,它可能是:

显然,每日数据越多,可能的组合就越多。

如果我必须将 2019.01.01 与 2019.01.03 进行比较,则查询必须返回 2,因为产品 1 和产品 3 的价格在这些索引之间不同。

我正在寻求帮助来构建这样的查询,并对任何其他数据模型建议持开放态度。

标签: elasticsearch

解决方案


我认为您可以在这种情况下按 id 和 price 聚合并添加min_doc_count以过滤掉两个索引中不同的地方

GET logs1,logs2/_search
{
  "size": 0,
  "aggs": {
    "by_product": {
      "terms": {
        "script": {
          "inline": "doc.id+'_'+doc.price"
        },
        "min_doc_count": 2
      }
    }
  }
}

推荐阅读