【问题标题】:Query elasticsearch nested field by index(order of insert)按索引查询elasticsearch嵌套字段(插入顺序)
【发布时间】:2020-12-06 16:42:18
【问题描述】:

我有一个包含一些嵌套对象的 elasticsearch 文档(映射为嵌套字段) 例如:

{
  "FirstName": "Test",
  "LastName": "Test",
  "Cost": 322.54,
  "Email": "test@test.com",
  "Vehicles": [
    {
      "Year": 2000,
      "Make": "Mazda",
      "Model": "6"
    },
    {
      "Year": 2012,
      "Make": "Ford",
      "Model": "F150"
    }
  ]
}

我正在尝试对数组的特定索引进行聚合,例如,我想对福特制造但在第一辆车上的文档的成本求和。

这有可能吗?互联网上几乎没有关于弹性搜索嵌套字段的信息,也没有关于它们的索引/顺序的信息

【问题讨论】:

    标签: elasticsearch elasticsearch-aggregation elasticsearch-nested


    【解决方案1】:

    可以实现你想要的,但你还需要在嵌套文档中添加索引顺序作为字段:

    {
      "FirstName": "Test",
      "LastName": "Test",
      "Cost": 322.54,
      "Email": "test@test.com",
      "Vehicles": [
        {
          "Year": 2000,
          "Make": "Mazda",
          "Model": "6",
          "Index": 0
        },
        {
          "Year": 2012,
          "Make": "Ford",
          "Model": "F150",
          "Index": 1
        }
      ]
    }
    

    然后您可以使用IndexMake 上的两个条件查询您的索引,如下所示:

    {
      "query": {
        "nested": {
          "path": "Vehicles",
          "query": {
            "bool": {
              "filter": [
                {
                  "match": {
                    "Vehicles.Index": 0
                  }
                },
                {
                  "match": {
                    "Vehicles.Make": "Ford"
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    在这种特定情况下,查询不会产生任何结果,如您所料。

    【讨论】:

    • 是的,我同意你的观点,我也很喜欢这个解决方案,但我想弄清楚是否有办法在不更改数据的情况下做到这一点,因为其中已经有很多数据数据库
    • 不幸的是不是,因为每个嵌套文档都是一个独立的(但隐藏的)文档,它不知道它是包含其他兄弟的“数组”的一部分,因此为什么你需要给每个文档“知道”它在父数组中的位置......利用_update_by_query API 来更新所有文档非常容易,而无需重新索引所有内容。
    • 我没有时间检查 _update_by_query 的想法,但听起来不错,我希望它真的可能,无论如何我的问题的底线是弹性搜索没有保存嵌套文档的顺序,所以它不可能在不添加索引字段的情况下执行此操作
    • Coo,很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2020-02-15
    • 2019-10-25
    • 1970-01-01
    • 2021-08-07
    相关资源
    最近更新 更多