【问题标题】:Elasticsearch: efficient sorting on nested valuesElasticsearch:对嵌套值进行高效排序
【发布时间】:2019-05-29 00:15:44
【问题描述】:

我正在根据嵌套键/值结构中的值计算对来自 Elasticsearch (5.1.1) 的结果进行排序。

排序必须:

  1. 从多个嵌套结构中的给定键中查找值
  2. 将这些值相乘
  3. 将此乘法用作排序分数

我目前正在工作,但它真的很慢/效率低下。由于上面#2中的计算,我制作了一个无痛脚本。我正在做的是:

  1. 遍历所有键以找到它们各自的匹配值
  2. 对于第一次匹配,将值保存在变量中;对于后续匹配,将保存的值与当前值相乘,并将其保存在上述变量中​​

我认为效率低下的原因是:

  1. 循环遍历所有嵌套项(每个文档有很多,并且有很多文档)
  2. 我正在使用params['_source'],它以减慢速度着称。 AFAIK,我必须使用 params['_source'] 来解决 Painless 中的嵌套值

现在的问题是:我怎样才能更有效地解决这个问题?我是完全走错了路,还是有办法不使用params['_source']

我的映射(嵌套结构是"my_ratios"):

{
  "my_index": {
    "mappings": {
      "my_type": {
        "properties": {
          "a_value": {
            "type": "long"
          },
          "my_ratios": {
            "type": "nested",
            "properties": {
              "Key": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              },
              "Value": {
                "type": "float"
              }
            }
          }
        }
      }
    }
  }
}

嵌套键/值结构示例:

{
  {
    "Key": "Key1",
    "Value": 0.4898
  },
  {
    "Key": "Key2",
    "Value": 0.14286
  },
  {
    "Key": "Key3",
    "Value": 6.12245
  },
  ...
}

【问题讨论】:

    标签: elasticsearch elasticsearch-painless


    【解决方案1】:

    恐怕您唯一的选择是重塑您的数据,或者拥有一份相关数据结构的副本仅用于排序。

    据我所知,Elasticsearch 从未打算在 params['_source'] 上高效,您确实需要 - 正如您所指出的 - 使用它来访问 Painless 中的嵌套对象。换句话说 - Elasticsearch 在对嵌套对象执行自定义操作时效率不高。

    确保您在满足要求后立即退出循环,以避免不必要的迭代 - 如果您还没有这样做,这可能会带来一些改进。

    【讨论】:

    • 该死的。谢谢。当他们找到他们需要的东西时,我已经退出了 for 循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2019-06-25
    相关资源
    最近更新 更多