关键字字段聚合失败
aggregation on keyword field fails
我目前遇到的问题是,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"
},
由于文档、google 和 Whosebug 均未提供此问题的答案,因此我认为存在根本性错误。
我唯一能想到的就是现场未设置的数据。现在该字段肯定有内容。
同样在这个过程中,我删除了查询的所有其他部分以隔离问题,使用 aggs
以及 aggregations
,重命名聚合的名称只是为了确定..
这是请求正文和匿名搜索url:
http://localhost:9200/project_development/some_type/_search
{
"aggregations": {
"foo": {
"terms": {
"field": "experience_slug"
}
}
}
}
官方 docker 容器中的 Elasticsearch 5.2.2,内存有限(但足够)。
日志中也没有条目。
对于如何解决这个难题的任何提示,我将不胜感激。
此致
聚合需要不同的数据结构而不是倒排索引。
例如
如果我用这些值和标准分析器索引一个字段
数据棕色,
狗 ,
小狗 ,
狐狸 ,
狐狸,
在 ,
跳了,
懒惰的 ,
飞跃,
超过 ,
快,夏天,
这是倒排索引
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 应在字段上启用。
现在,
- doc_values 只能在 not_analyzed 字符串字段上启用。
- field_data 默认在 elasticsearch 5
分析的字符串字段上禁用
现在解决方案是
- 在字段 experience_slug.keyword
上聚合
- 或在 experience_slug.
上启用 field_data
但请确保这两者会给出不同的结果,因为 experience_slug 将根据分析后生成的术语进行汇总
experience_slug.keyword 将聚合字段的完整值。
experience_slug 和 experience_slug.keyword 是两个不同的字段,具有不同的设置但相同的数据。
我目前遇到的问题是,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"
},
由于文档、google 和 Whosebug 均未提供此问题的答案,因此我认为存在根本性错误。
我唯一能想到的就是现场未设置的数据。现在该字段肯定有内容。
同样在这个过程中,我删除了查询的所有其他部分以隔离问题,使用 aggs
以及 aggregations
,重命名聚合的名称只是为了确定..
这是请求正文和匿名搜索url:
http://localhost:9200/project_development/some_type/_search
{
"aggregations": {
"foo": {
"terms": {
"field": "experience_slug"
}
}
}
}
官方 docker 容器中的 Elasticsearch 5.2.2,内存有限(但足够)。 日志中也没有条目。
对于如何解决这个难题的任何提示,我将不胜感激。
此致
聚合需要不同的数据结构而不是倒排索引。 例如
如果我用这些值和标准分析器索引一个字段 数据棕色, 狗 , 小狗 , 狐狸 , 狐狸, 在 , 跳了, 懒惰的 , 飞跃, 超过 , 快,夏天,
这是倒排索引
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 应在字段上启用。
现在,
- doc_values 只能在 not_analyzed 字符串字段上启用。
- field_data 默认在 elasticsearch 5 分析的字符串字段上禁用
现在解决方案是
- 在字段 experience_slug.keyword 上聚合
- 或在 experience_slug. 上启用 field_data
但请确保这两者会给出不同的结果,因为 experience_slug 将根据分析后生成的术语进行汇总
experience_slug.keyword 将聚合字段的完整值。
experience_slug 和 experience_slug.keyword 是两个不同的字段,具有不同的设置但相同的数据。