elasticsearch Elasticsearch:索引字符串的第一个字符
我使用的是5.3版 我有一个文本字段elasticsearch Elasticsearch:索引字符串的第一个字符,elasticsearch,aggregation,mappings,elasticsearch,Aggregation,Mappings,我使用的是5.3版 我有一个文本字段a。我想在a的第一个字符上进行聚合。我还需要整个原始值 我假设最有效的方法是使用自定义规范化器创建关键字字段a.firstLetter。我曾尝试使用模式替换字符过滤器来实现这一点,但我正在努力使用regexp 我是不是完全错了?你能帮我吗 编辑 这就是我尝试过的 settings.json { "settings": { "index": { "analysis": { "char_filter": {
a
。我想在a
的第一个字符上进行聚合。我还需要整个原始值
我假设最有效的方法是使用自定义规范化器创建关键字字段a.firstLetter
。我曾尝试使用模式替换字符过滤器来实现这一点,但我正在努力使用regexp
我是不是完全错了?你能帮我吗
编辑
这就是我尝试过的
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"]
}
}
}
}
}
}
当我尝试这样聚集时,我没有得到桶:
"aggregations": {
"grouping": {
"terms": {
"field": "a.firstLetter"
}
}
}
因此,基本上我的方法是“用空字符串替换除第一个字符以外的所有字符”
编辑2
我错误地配置了规范化程序(我已经修复了示例)。正确的配置表明,由于以下原因,规范化程序不支持模式替换字符过滤器。显然,对它的支持最早将在5.4版中实现
那么还有其他选择吗?我不想在代码中这样做,在文档中为第一个字母添加一个字段,因为我在其他聚合中使用Elasticsearch功能。您可以使用长度为1的
截断过滤器
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
}
]
}
分享您尝试过的代码示例。这是可行的,但需要在文本字段上启用fielddata。不推荐使用它,但我想它适合这个用例。谢谢哦,真的。您可以使用带有摄取管道的gsub
处理器来防止这种情况。
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
}
]
}