【问题标题】:Elasticsearch: count rows in a tableElasticsearch:计算表中的行数
【发布时间】:2020-06-24 16:11:58
【问题描述】:

我有一张大桌子(15000 x 2000 个条目)。在此表中,我需要计算具有某些属性的行,例如“所有行,在第 5 列中具有 1 或 2,在第 6 列中具有 0”。我将这种类型的操作称为计数操作。对于我的用例,计数操作需要非常快,因为我执行了数百个计数操作。

我尝试使用弹性搜索来执行此操作,但性能似乎非常糟糕(例如 180 次计数操作需要 10 秒)。我想知道,我是否以错误的方式构建查询,或者 Elasticsearch 是否是错误的技术?

我的查询都是相同的形式。我用java创建它们,所以很难在这里发布它们的样子,但我会尽力解释

我将每个单独的计数操作构建为 BoolQuery。对于上面的示例,它将是一个类似于此的查询(如果它错了不要怪我,我无法复制正确的查询,因为它是用 java 构建的):

  "query": {
    "bool" : {
      "must" : [
        "should" : [
          { "column 5" : "1" },
          { "column 5" : "2" }
        ],
        "should" : [
          { "column 6" : "0" }
        ],
        "minimum_should_match" : 1
      ],
      "boost" : 1.0
    }
  }

这种形式的许多 bool 查询然后被分组到一个 MultiSearchRequest。我使用“fetchSource = false”选项来阻止 Elasticsearch 自己加载实体。

如果您需要任何进一步的信息,或者不清楚,请告诉我,我想做什么!

【问题讨论】:

  • 180 次计数操作是什么意思?都被索引了吗?你在做什么样的计数?它非常不清楚。在你的 java 部分解释中,你不是 syaung 你是如何执行每个计数的。
  • 感谢您的提示,我试图更清楚地重新表述它!如果您还有任何问题,请告诉我!
  • 有多少个分片?您要查询多少个索引?节点上的资源容量是多少?有多少个节点?等等。

标签: elasticsearch


【解决方案1】:

我自己解决了这个问题。对于所有有类似问题的人,方法如下:

我更改了 SearchSourceBuilder,使其现在使用 ValueCountAggregator。这个计数值并允许我将 SearchSourceBuilder.size() 设置为 0。通过这种方式,我自己摆脱了命中并仅检索聚合值。

之前需要 4 秒的请求现在在不到 100 毫秒内执行。

【讨论】:

    猜你喜欢
    • 2016-06-09
    • 2010-11-12
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多