聚合和搜索在弹性搜索中使用了两种不同的数据结构
例如
如果我用这些值和标准分析器索引一个字段
数据棕色,
狗 ,
小狗 ,
狐狸 ,
狐狸,
在 ,
跳了,
懒惰的 ,
飞跃,
超过 ,
快,夏天,该
这是倒排索引
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
你的问题的解决方案是
您必须使用字段以两种不同的方式索引相同的数据
例如
{
"mappings": {
"my_type": {
"properties": {
"field1": {
"type": "string",
"analyzer":"standard",
"fields": {
"raw": {
"type": "string",
"index": "keywordAnalyzed"
}
}
}
}
}
}
}
这将使用两个不同的分析器索引两个不同字段中的相同数据。
所以在第一种情况下
- 您可以在 field1 上进行聚合。
- 对于第二种情况,您需要在令牌过滤器中使用标记器 -> keyword 和 lowercasetokenfilter 构建自定义分析器,并使用此自定义分析器 在 field1.raw 中。但是,最好将字段 field1.raw 索引为 not_analyzed,因为在分析的字符串字段上进行聚合是一个内存密集型过程,并且在代码级别索引时使用小写字段值