elasticSearch允许一个字段有两种不同的类型,例如一个字段即可以为text类型,也可以为keyword类型。
1.方式一:mapping的fields属性
未创建索引时,直接插入文档,es会自动生成mapping关系。
POST test_fields/_doc
{
"name":"li bai",
"id":202112120202
}
即name字段即是text类型,name.keyword是keyword属性。我们可以直接去搜索name.keyword。
扩展:es的script脚本,对于text字段,官网推荐我们使用
doc['first_name.keyword']
获取值,其本质就是因为mapping中存在fields字段。
# id即是long类型,也是date类型
PUT test_fields
{
"mappings": {
"properties": {
"name":{
"type":"text",
"fields": {
"rz":{
"type":"keyword"
}
}
},
"id":{
"type": "long",
"fields": {
"time":{
"type":"date",
"format":"yyyyMMddhhmmss"
}
}
}
}
}
}
POST test_fields/_doc
{
"name":"li bai",
"id":20211012020200
}
GET test_fields/_search
使用date类型进行搜索时:
当然,搜索的_source
字段只会存在id和name两个属性。
2. 方式二:copy_to配置
当然,创建mapping的时候,copy_to是将多个字段的值,合并到一个字段中,便于搜索。但是也可以实现一个字段存在多个类型的需求。
创建索引:
PUT test_fields
{
"mappings": {
"properties": {
"name":{
"type":"text",
"fields": {
"rz":{
"type":"keyword"
}
}
},
"id":{
"type": "long",
"copy_to": "r_time"
},
"r_time":{
"type":"date",
"format": "yyyyMMddhhmmss"
}
}
}
}
填充数据:
POST test_fields/_doc
{
"name":"li bai",
"id":20211012020200
}
在_source中也不会体现,但是可以进行搜索。
可以看到,在插入数据的时候并未插入r_time字段。它是将id字段(long类型)填充到了r_time字段中,并转化为了date类型。