meta参数
元数据附加在字段上且对es不透明,元数据只用于多应用使用同一个索引下的共享元数据信息,该字段允许重载;
meta字段中允许最多创建5个key-value,且key-value均要求为string类型,key的长度在20个字符之内,value的长度在50个字符内;
//以下meta将触发两类异常
//[meta] values can only be strings, but got Boolean[false] for field [length]
//[meta] can't have more than 5 entries, but got 6 on field [length]
PUT param_meta_index
{
"mappings": {
"properties": {
"length":{
"type": "long",
"meta":{
"unit":"cm",
"default":"10",
"shard":false,
"addr":"hz",
"date":"2020-05-30",
"limit":"50"
}
}
}
}
}
fields参数
很多场景下需要针对同一个字段有不同的访问模式,fields参数允许定义字段不同的类型来达到这种需求;
例如映射为text类型的string字段可以进行全文索引,若希望同一个字段也可以进行排序或聚合操作就需要映射keyword类型,fields可以处理这种情况
//city.raw字段是city字段的keyword类型
PUT /param_fields_index
{
"mappings": {
"properties": {
"city":{
"type": "text",
"fields": {
"raw":{
"type":"keyword"
}
}
}
}
}
}
PUT param_fields_index/_doc/1
{
"city":"Hang Zhou"
}
PUT param_fields_index/_doc/2
{
"city":"Shang Hai"
}
PUT param_fields_index/_doc/3
{
"city":"Su Zhou"
}
//city字段可以使用全文索引,city.raw可以进行排序和聚合操作
GET param_fields_index/_search
{
"query": {
"match": {
"city": "Zhou"
}
},
"sort": [
{
"city.raw": {
"order": "desc"
}
}
],
"aggs": {
"cities": {
"terms": {
"field": "city.raw",
"size": 10
}
}
}
}
多字段映射不会改变原始的_source字段的json信息
GET param_fields_index/_search
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "param_fields_index",
"_type" : "_doc",
"_id" : "1",
"_score" : 1.0,
"_source" : {
"city" : "Hang Zhou"
}
},
{
"_index" : "param_fields_index",
"_type" : "_doc",
"_id" : "2",
"_score" : 1.0,
"_source" : {
"city" : "Shang Hai"
}
},
{
"_index" : "param_fields_index",
"_type" : "_doc",
"_id" : "3",
"_score" : 1.0,
"_source" : {
"city" : "Su Zhou"
}
}
]
}
}
针对索引映射中已存在字段可以进行多字段映射
PUT param_fields_index/_mapping
{
"properties":{
"city":{
"type":"text",
"fields":{
"unit":{
"type":"keyword"
}
}
}
}
}
GET param_fields_index/_mapping
{
"param_fields_index" : {
"mappings" : {
"properties" : {
"city" : {
"type" : "text",
"fields" : {
"raw" : {
"type" : "keyword"
},
"unit" : {
"type" : "keyword"
}
}
}
}
}
}
}
多字段与多分词器
多字段的另一个用例是以不同的方式分析同一字段以获得更好的相关性,例如可以使用standard分词器(文本分为单词)为字段索引,在使用english分词器(将单词转成词根形式)进行索引;
//desc字段默认分词器为standard,desc.english字段分词器为english
PUT param_fields_analyzer_index
{
"mappings": {
"properties": {
"desc":{
"type": "text",
"fields": {
"english":{
"type":"text",
"analyzer":"english"
}
}
}
}
}
}
//添加两个doc,区别只在于首字母大小写
PUT param_fields_analyzer_index/_doc/1
{
"desc":"Once the RestClient has been created"
}
PUT param_fields_analyzer_index/_doc/2
{
"desc":"once the RestClient has been created"
}
//同时查询desc与desc.english
GET param_fields_analyzer_index/_search
{
"query": {
"multi_match": {
"query": "Once the RestClient has been created",
"fields": [
"desc",
"desc.english"
],
"type": "most_fields"
}
}
}
两个doc中desc字段包含了created,但是desc.english字段只包含了create,因为该字段只保存词根,可通过create查询结果
GET param_fields_analyzer_index/_search
{
"query": {
"match": {
"desc.english": "create"
}
}
}
normalizer参数
analyzer只能用于text类型的字段,normalizer则只能用于keyword类型,两个参数功能类似,不过normalizer保证分析处理链只产生一个词(token);
normalizer在字段建立索引之前先执行,在查询时同样会先执行(使用match查询或者term级别的查询);
//normalize只用于keyword类型字段,若指定其他类型将报错, Mapping definition for [desc_message] has unsupported parameters: [normalizer : custom_normalizer]
PUT param_normalizer_index
{
"settings": {
"analysis": {
"normalizer":{
"custom_normalizer":{
"type":"custom",
"char_filter":[],
"filter":["lowercase","asciifolding"]
}
}
}
},
"mappings": {
"properties": {
"desc_message":{
"type": "text",
"normalize": "custom_normalizer"
}
}
}
}
//自定义normalizer
PUT param_normalizer_index
{
"settings": {
"analysis": {
"normalizer":{
"custom_normalizer":{
"type":"custom",
"char_filter":[],
"filter":["lowercase","asciifolding"]
}
}
}
},
"mappings": {
"properties": {
"desc_message":{
"type": "keyword",
"normalizer": "custom_normalizer"
}
}
}
}
PUT param_normalizer_index/_doc/1
{
"desc_message":"déjàvu"
}
PUT param_normalizer_index/_doc/2
{
"desc_message":"dejavu"
}
PUT param_normalizer_index/_doc/3
{
"desc_message":"DEJAVU"
}
PUT param_normalizer_index/_doc/4
{
"desc_message":"dejau"
}
//term与match查询返回结果一致,在实际查询时会先使用normalizer将'DEJAVU'转换成dejavu再执行查询操作;
GET param_normalizer_index/_search
{
"query": {
"term": {
"desc_message": {
"value": "DEJAVU"
}
}
}
}
GET param_normalizer_index/_search
{
"query": {
"match": {
"desc_message": "DEJAVU"
}
}
}
//可以通过聚合操作查看实际索引中记录的token,此处为'dejavu'
GET param_normalizer_index/_search
{
"size": 0,
"aggs": {
"desc_terms": {
"terms": {
"field": "desc_message"
}
}
}
}
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4,
"relation" : "eq"
},
"max_score" : null,
"hits" : [ ]
},
"aggregations" : {
"desc_terms" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "dejavu",
"doc_count" : 3
},
{
"key" : "dejau",
"doc_count" : 1
}
]
}
}
}