我正在使用5.3版本。
我有一个文字字段a
。我想聚合a
的第一个字符。我还需要整个原始值。
我认为最有效的方法是使用自定义规范化器设置关键字字段a.firstLetter
。我试图通过模式替换char过滤器实现这一点,但我正在努力使用正则表达式。
我完全错了吗?你能救我吗?
修改
这就是我尝试过的。
settings.json
{
"settings": {
"index": {
"analysis": {
"char_filter": {
"first_char": {
"type": "pattern_replace",
"pattern": "(?<=^.)(.*)",
"replacement": ""
}
}
"normalizer": {
"first_letter": {
"type": "custom",
"char_filter": ["first_char"]
"filter": ["lowercase"]
}
}
}
}
}
}
mappings.json
{
"properties": {
"a": {
"type": "text",
"index_options": "positions",
"fields": {
"firstLetter": {
"type": "keyword",
"normalizer": "first_letter"
}
}
}
}
}
当我尝试聚合时,我没有得到任何桶:
"aggregations": {
"grouping": {
"terms": {
"field": "a.firstLetter"
}
}
}
所以基本上我的方法是“用空字符串替换除第一个char之外的所有字符。”正则表达式是我能够通过谷歌搜索收集的。
编辑2 我错误配置了规范化器(我修复了这些例子)。正确的配置显示,由于issue 23142,规范化器不支持模式替换字符过滤器。显然,对它的支持将在5.4版本中最早实现。
还有其他选择吗?我不想在代码中执行此操作,方法是在第一个字母的doc中添加一个字段,因为我正在为其他所有聚合使用Elasticsearch功能。
答案 0 :(得分:1)
您可以使用长度为1的truncate
过滤器
PUT foo
{
"mappings": {
"bar" : {
"properties": {
"name" : {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
},
"settings": {
"index": {
"analysis": {
"analyzer" : {
"my_analyzer" : {
"type" : "custom",
"tokenizer" : "keyword",
"filter" : [ "my_filter", "lowercase" ]
}
},
"filter": {
"my_filter": {
"type": "truncate",
"length": 1
}
}
}
}
}
}
GET foo/_analyze
{
"field" : "name",
"text" : "New York"
}
# response
{
"tokens": [
{
"token": "n",
"start_offset": 0,
"end_offset": 8,
"type": "word",
"position": 0
}
]
}