概述
记录一次自己在操作Elasticsearch数据库新增一个字段出现的问题,由于业务需求,我们需要往ES中新增了一个字段,该字段不能使用keyword类型,因为查询的时候需要对该字段进行模糊查询,这就要求我们在ES原来的模板中新增一个字段设置分词。
1、设置分词
ES自带了一些分词器,即在默认情况下,如果不对自己创建的索引做任何的设置和修改,ES会按照standard进行分词
我业务中需要的的字段是按照逗号隔开的字符串,所以我只需要设置一个按照逗号分割的分词器就可以。
由于我原来使用了动态模板,把原来的text转化为keyword
#ES模板
PUT /_template/template_access_log
{
"template": "poc*",
"settings": {
"index": {
"refresh_interval": "10s",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"translog": {
"flush_threshold_size": "1gb",
"sync_interval": "30s",
"durability": "async"
}
}
},
"mappings": {
"doc": {
"dynamic_templates": [
{
"string_as_keyword": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"TRANSAMOUNT": {
"type": "double"
},
"consumeTime": {
"type": "integer"
},
"transTime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
},
"aliases" : {
"poc" : {}
}
}
此时我们需要给setting新增一个分词设置和字段字段
#ES模板
PUT /_template/template_access_log
{
"template": "poc*",
"settings": {
"index": {
"refresh_interval": "10s",
"number_of_shards" : "5",
"number_of_replicas" : "1",
"translog": {
"flush_threshold_size": "1gb",
"sync_interval": "30s",
"durability": "async"
}
},
"analysis": {
"analyzer": {
"comma": {
"type": "pattern",
"pattern":","
}
}
}
},
"mappings": {
"doc": {
"dynamic_templates": [
{
"string_as_keyword": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"TRANSAMOUNT": {
"type": "double"
},
"consumeTime": {
"type": "integer"
},
"transTime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"OPENGROUPPATH": {
"type": "text",
"analyzer": "comma",
"search_analyzer": "comma"
}
}
}
},
"aliases" : {
"poc" : {}
}
}
上面的模板中我们新增一个analysis分词器和一个OPENGROUPPATH字段,完成以后更新模板。
--------------------------------------------------------------------------------------------------------------------------------------------
上述步骤是不是很完美???
no
该过程忽略了一步,我们在创建完动态模板以后,由于数据源源不断的往ES写入数据,此时在ES索引库中已经存在以POC开头的索引库,如果直接接入新增的字段数据,该字段不会在当前已经存在的poc库中按照我们上面设置的模板创建数据。
wtf???
ES动态模板库仅仅针对没有接入数据,没有生成索引库之前才生效。
由于我ES的业务数据库设置的是按月存储数据,生成的数据按照poc201909这样子的格式生成数据库,此时我们还需要设置一下poc201909该索引库的setting结构和字段,
#设置es索引结构
PUT /poc201909
{
"settings": {
"index": {
"refresh_interval": "1s",
"translog": {
"flush_threshold_size": "1gb",
"sync_interval": "30s",
"durability": "async"
}
},
"analysis": {
"analyzer": {
"comma": {
"type": "pattern",
"pattern":","
}
}
}
},
"mappings": {
"resultdata": {
"dynamic_templates": [
{
"string_as_keyword": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"TRAMSAMOUNT": {
"type": "double"
},
"MONEY": {
"type": "float"
},
"transTime": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
},
"OPENGROUPPATH": {
"type": "text",
"analyzer": "comma",
"search_analyzer": "comma"
}
}
}
}
}
此时接入数据,新增的字段就会按照设置的格式生成数据