参考官方文档:
问题
我们有一个标签,所以这个标签会有很多,而且都是用户自己的标签,会有各种各样的内容。如果使用动态映射列,第一次可能就是数字类型,而后进来其它的字符就全是无法转换的错误。
解决
elasticsearch提供了一个默认的配置可以设置动态映射列的格式。
简单来说,就是匹配新加入的列的名称,如果匹配成功,则使用设置好的类型。
json格式
PUT /my_index
{
"mappings": {
"my_type": {
"dynamic_templates": [
{ "es": {
"match": "*_es",
"match_mapping_type": "string",
"mapping": { "type": "string", "analyzer": "spanish" } }},
{ "en": {
"match": "*",
"match_mapping_type": "string",
"mapping": { "type": "string", "analyzer": "english" } }}
]
}}}
PUT _template/logging
{
"template": "logs-*",
"settings": { "number_of_shards": 1 },
"mappings": {
"_default_": {
"_all": {
"enabled": false
},
"dynamic_templates": [
{
"strings": {
"match_mapping_type": "string",
"mapping": { "type": "string", "fields": { "raw": { "type": "string", "index": "not_analyzed", "ignore_above": 256 } } } }
}
]
}
}
}
PUT logs-2015.10.01/event/1
{ "message": "error:16" }
以上两段内容来自官方文档。
这里的字段名称已经非常明白了,我就不讲解了。
java格式
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.startObject(typeName)
.startArray("dynamic_templates")
.startObject()
.startObject("all_tag_string")
.field("match", "tag_*")
// .field("match_mapping_type","string")
.field("match_mapping_type", "*")
.startObject("mapping")
.field("type", "string")
.endObject()
.endObject()
.endObject()
.endArray()
.field("dynamic_date_formats", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd")
.startObject("properties")
.startObject("customer_list")
.field("type", "nested")
.endObject()
.startObject("goods_list")
.field("type", "nested")
.endObject()
.endObject()
.endObject().endObject();
这段代码的意思是,设置默认的时间格式为我们常用的格式,设置了两种。另外所有列名以 tag_ 开头的都设置为string类型
//es提供的一些查询方法
IndicesExistsResponse//判断index是否存在
TypesExistsResponse//判断type是否存在
DeleteMappingRequest//删除mapping,可删除index,type
PutMappingRequest//创建mapping,可以使用XContentBuilder参数
1289

被折叠的 条评论
为什么被折叠?



