代码之家  ›  专栏  ›  技术社区  ›  Scarabas

ElasticSearch:嵌套值的高效排序

  •  0
  • Scarabas  · 技术社区  · 5 年前

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

    排序必须:

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

    我目前正在工作,但速度很慢/效率很低。由于上面的计算,我已经写了一个无痛的剧本。我要做的是:

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

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

    1. 循环遍历所有嵌套项(每个文档有很多,文档也很多)
    2. 我正在使用 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 回复  |  直到 5 年前
        1
  •  1
  •   The_Torst    5 年前

    恐怕您唯一的选择是要么重新构建数据,要么拥有相关数据结构的副本,以便您进行排序。

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

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

    推荐文章