【问题标题】:Elasticsearch Terms aggregation with unknown datatype具有未知数据类型的 Elasticsearch 术语聚合
【发布时间】:2019-01-11 16:01:08
【问题描述】:

我正在使用 dynamic mapping 在 Elasticsearch 中为未知模式的数据编制索引,即我们提前不知道大部分数据的形状、数据类型等。在查询中,我希望能够在任何字段上进行聚合。字符串(由default)映射为textkeyword 类型,并且只有后者可以聚合。所以对于字符串我的terms aggregations 必须是这样的:

"aggs": {
    "something": {
        "terms": {
            "field": "something.keyword"
        }
    }
}

但其他类型(如数字和布尔值)没有 .keyword 子字段,因此这些类型的聚合必须如下所示(对于文本字段会失败):

"aggs": {
    "something": {
        "terms": {
            "field": "something"
        }
    }
}

有没有办法指定一个术语聚合,基本上说“如果something.keyword 存在,则使用它,否则只使用something”,并且不会对性能造成重大影响?

要求在查询时提供数据类型信息对我来说可能是一种选择,但理想情况下我想尽可能避免它。

【问题讨论】:

    标签: elasticsearch nest elasticsearch-aggregation


    【解决方案1】:

    如果主要用例是聚合,则可能值得将string 属性的动态映射更改为索引为keyword 数据类型,并将多字段子字段索引为text 数据类型,即在dynamic_templates

    {
      "strings": {
        "match_mapping_type": "string",
        "mapping": {
          "type": "keyword",
          "ignore_above": 256,
          "fields": {
            "text": {
              "type": "text"
            }
          }
        }
      }
    },
    

    【讨论】:

    • 啊,我明白了,您正在翻转它,所以 text 是子字段而不是 keyword。好点子!我不会说这是 primary 用例,我仍然需要全文搜索(并且还需要在那里处理未知模式),但我会尝试一下,看看我是否可以让它工作而不会在搜索端遇到类似的问题。
    • 另一种方法可能是检索映射,在应用程序中将其缓存一段时间,然后使用它来指导应该定位哪些字段
    • dynamic_templates 解决方案效果很好,谢谢!虽然我确实发现自己处于一个非常熟悉的地方:渴望实现一个相当简单、有据可查的 Elasticsearch 操作,然后花了半天的时间试图弄清楚如何将其翻译成巢。我正在认真考虑切换我的所有代码以使用低级客户端,除非你能说服我离开壁架。 ;)
    猜你喜欢
    • 2014-07-09
    • 2021-06-06
    • 1970-01-01
    • 2021-06-06
    • 2015-11-06
    • 2015-01-21
    • 2015-06-26
    • 2021-05-28
    • 2021-10-07
    相关资源
    最近更新 更多