【问题标题】:aggregation on keyword field fails关键字字段聚合失败
【发布时间】:2018-02-14 10:20:40
【问题描述】:

我目前遇到的问题是,6 个聚合中有 3 个因错误而失败。

"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [experience_slug] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."

有问题的字段被定义为类型关键字(doc_values true),因此查询应该没有问题。 (直接取自 _mapping 部分):

      "experience_slug": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        },
        "analyzer": "default",
        "search_analyzer": "default_search"
      },

由于文档、谷歌和 StackOverflow 都没有为这个问题提供答案,我认为存在根本性错误。

我能想象的唯一一件事就是现场未设置的数据。现在,该字段可以确保有内容。 同样在这个过程中,我删除了查询的所有其他部分以隔离问题,使用aggs以及aggregations,重命名聚合的名称只是为了确定..

这是请求正文和匿名搜索 url:

http://localhost:9200/project_development/some_type/_search


{
  "aggregations": {
    "foo": {
      "terms": {
        "field": "experience_slug"
      }
    }
  }
}

官方 docker 容器中的 Elasticsearch 5.2.2,内存有限(但足够)。 日志中也没有条目。

如果有任何关于如何解决这个困境的提示,我将不胜感激。

最好的问候

【问题讨论】:

    标签: elasticsearch-5


    【解决方案1】:

    聚合需要不同的数据结构而不是倒排索引。 例如

    如果我用这些值和标准分析器索引一个字段 数据棕色, 狗 , 小狗 , 狐狸 , 狐狸, 在 , 跳了, 懒惰的 , 飞跃, 超过 , 快,夏天,该

    这是倒排索引

    Term      Doc_1   Doc_2   Doc_3
    ------------------------------------
    brown   |   X   |   X   |
    dog     |   X   |       |   X
    dogs    |       |   X   |   X
    fox     |   X   |       |   X
    foxes   |       |   X   |
    in      |       |   X   |
    jumped  |   X   |       |   X
    lazy    |   X   |   X   |
    leap    |       |   X   |
    over    |   X   |   X   |   X
    quick   |   X   |   X   |   X
    summer  |       |   X   |
    the     |   X   |       |   X
    

    聚合使用的结构

    Doc      Terms
    -----------------------------------------------------------------
    Doc_1 | brown, dog, fox, jumped, lazy, over, quick, the
    Doc_2 | brown, dogs, foxes, in, lazy, leap, over, quick, summer
    Doc_3 | dog, dogs, fox, jumped, over, quick, the
    

    所以也可以聚合

    • 应该在字段上启用 doc_value
    • 应在字段上启用field_data。

    现在,

    1. doc_values 只能在 not_analyzed 字符串字段上启用。
    2. field_data 在来自 elasticsearch 5 的分析字符串字段中被默认禁用

    现在解决方案

    • 字段experience_slug.keyword上的任一聚合
    • 或在 experience_slug 上启用 field_data。

    但请确保这两者都会给出不同的结果,因为 experience_slug 将汇总分析后生成的术语

    experience_slug.keyword 将汇总字段的完整值。

    experience_slug 和experience_slug.keyword 是两个不同的字段,具有不同的设置但相同的数据。

    【讨论】:

    • 如我所说,doc_values 已开启。在我的一项试验中,我确实也激活了 fielddata,只是为了确保。它被忽略了(因为类型是关键字..)。出于某种未知原因,使用 experience_slug.keyword 确实有效。
    • experience_slug.keyword 有效,因为 es 中的关键字类型是 not_analyzed 并且默认情况下在 not_analyzed 字符串字段上启用了 doc_values
    • experience_slug 无法正常工作,因为它分析了无法启用 doc_values 的字符串字段,并且默认情况下 field_data 处于关闭状态
    • 并且聚合聚合在索引时产生的术语。因此,关键字字段将聚合整个数据,而标准分析器的文本字段将根据标准分析器生成的术语进行聚合。
    • 据我了解:当实际数据类型是文本(不是字段类型)时,我必须设置 "fielddata": true 或使用 .keyword-notation 正确聚合。
    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2017-12-31
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多