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

时间:2019-01-02 10:37:53

标签: elasticsearch elasticsearch-painless

我正在基于嵌套键/值结构中的值计算对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
  },
  ...
}

1 个答案:

答案 0 :(得分:1)

恐怕您唯一的选择是重新建模数据,或仅提供相关数据结构的副本以用于排序。

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

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