代码之家  ›  专栏  ›  技术社区  ›  Todd Menier

未知数据类型的Elasticsearch术语聚合

  •  0
  • Todd Menier  · 技术社区  · 6 年前

    在弹性搜索中索引未知模式的数据 dynamic mapping 也就是说,我们不知道很多数据的形状、数据类型等。在查询中,我希望能够在任何字段上聚合。字符串是 default )映射为两者 text keyword 类型,并且只有后者可以聚合。所以为了弦我 terms aggregations 一定是这样的:

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

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

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

    有没有办法指定一个术语聚合,它基本上说“如果 something.keyword 存在,使用它,否则只需使用 something “,而且没有受到显著的性能影响?

    要求在查询时提供数据类型信息可能是我的一个选择,但理想情况下,如果可能的话,我希望避免它。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Russ Cam    6 年前

    如果主要用例是聚合,则可能需要更改 string 要作为索引的属性 keyword 数据类型,多字段子字段索引为 text 数据类型,即输入 dynamic_templates

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