Elasticsearch:对嵌套值进行高效排序

Elasticsearch: efficient sorting on nested values

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

排序必须:

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

我目前的工作正常,但它确实 slow/inefficient。由于上面 #2 中的计算,我制作了一个 Painless 脚本。我正在做的是:

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

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

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

现在问题来了:我怎样才能更有效地解决这个问题?我是完全以错误的方式解决这个问题,还是有办法不使用 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/value 结构示例:

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

恐怕你唯一的选择是要么改造你的数据,要么有一份相关数据结构的副本来供你排序。

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

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