环境

  • Elasticsearch 8.1
  • Kibana 8.1
  • MacOS 10.14.6

简介

首先咱们还是先理解一下,什么是字段别名?大家可能据说过索引别名,通过索引的别名能够轻松的切换所需的数据起源与哪一个索引,那么什么是字段别名呢?所谓字段别名,就是索引mapping定义时的备用字段,通过字段别名能够替换搜寻申请中的指标字段,字段别名能够用于搜寻排序聚合高亮docvalue_fieldsstored_fieldssuggestions,上面咱们一起来看一下字段别名的具体应用过程

应用

定义字段别名标准

  • 必须是一个明确的字段,不能是一个对象或者指向另一个字段别名
  • 在创立字段别名时,字段别名指向的指标字段必须曾经存在
  • 如果定义了嵌套的对象,则字段别名必须具备同样的嵌套范畴

字段别名只能指向一个字段,不能同时指向多个字段;

然而能够通过批改mapping中的字段别名设置指向另一个新字段

不反对应用字段别名的API

  • 首先是不能在写入数据的时候应用字段别名,因为自身字段别名是虚构的,不存在的,所以不反对写入,同样也不能用于copy_to
  • 因为字段的别名是不存在_source中的,所以搜寻申请时的过滤字段也是不会失效的

测试

  • 创立索引,定义字段别名

    其中创立了索引blog1blog2,各自定义了两个字段别名public_countpublic_content,在blog1索引中,public_count指向doc.count,public_content指向doc.content;在blog2索引中,public_count指向doc_count,public_content指向doc_content;

    PUT blog1{  "mappings": {    "properties": {      "doc": {        "properties": {          "count": {            "type": "long"          },          "content": {            "type": "text",            "fields": {              "keyword": {                "type": "keyword"              }            }          }        }      },      "creater": {        "type": "keyword"      },      "public_count": {        "type": "alias",        "path": "doc.count"      },      "public_content": {        "type": "alias",        "path": "doc.content"      }    }  }}PUT blog2{  "mappings": {    "properties": {      "doc_count": {        "type": "long"      },      "doc_content": {        "type": "text",        "fields": {          "keyword": {            "type": "keyword"          }        }      },      "creater": {        "type": "keyword"      },      "public_count": {        "type": "alias",        "path": "doc_count"      },      "public_content": {        "type": "alias",        "path": "doc_content"      }    }  }}
  • 插入测试数据

    POST _bulk{ "index":{"_index":"blog1","_id":"1"}}{"creater":"zuiyu1","doc.count":"100","doc.content":"zuiyu elasticsearch "}{ "index":{"_index":"blog1","_id":"2"}}{"creater":"zuiyu2","doc.count":"200","doc.content":"zuiyu vue"}{ "index":{"_index":"blog1","_id":"3"}}{"creater":"zuiyu3","doc.count":"300","doc.content":"java demo"}{ "index":{"_index":"blog1","_id":"4"}}{"creater":"zuiyu4","doc.count":"300","doc.content":"java demo plus"}{ "index":{"_index":"blog1","_id":"5"}}{"creater":"zuiyu5","doc.count":"300","doc.content":"java pro and elasticsearch"}{ "index":{"_index":"blog2","_id":"1"}}{"creater":"zuiyu1","doc_count":"10","doc_content":"醉鱼ES小白入门课"}{ "index":{"_index":"blog2","_id":"2"}}{"creater":"zuiyu2","doc_count":"550","doc_content":"醉鱼前端 vue 小白入门课"}{ "index":{"_index":"blog2","_id":"3"}}{"creater":"zuiyu3","doc_count":"60","doc_content":"醉鱼java小白入门课"}{ "index":{"_index":"blog2","_id":"4"}}{"creater":"zuiyu4","doc_count":"60","doc_content":"醉鱼MySQL8.0小白入门课"}{ "index":{"_index":"blog2","_id":"5"}}{"creater":"zuiyu5","doc_count":"60","doc_content":"醉鱼Redis小白入门课"}
  • 搜寻测试、聚合、排序、高亮、倡议

    指标是实现搜寻索引blog1blog2content内容中蕴含java的文档,因为两个索引的mapping构造齐全不一样,所以应用定义的雷同名称的public_countpublic_content

    • 聚合

      应用public_count字段搜寻索引blog1blog2public_count 大于100的文档,对public_count进行聚合分桶

      GET blog*/_search?size=0{  "query": {    "range": {      "public_count": {        "gte": 100        }    }  },  "aggs": {    "all_agg": {      "terms": {        "field": "public_count"      }    }  }}
    • 排序

      应用public_count字段搜寻索引blog1blog2public_count后果大于100的文档,对public_count进行降序输入

      GET blog*/_search{  "query": {    "range": {      "public_count": {        "gte": 100        }    }  },  "sort": [    {      "public_count": {        "order": "desc"      }    }  ]}
    • 高亮

      应用public_content字段搜寻索引blog1blog2中蕴含java的,高亮输入,后果前后加上em标签

      GET blog*/_search{  "query": {    "wildcard": {      "public_content": {        "value": "*java*"      }    }  },  "highlight": {    "fields": {      "public_content": {        "pre_tags": [          "<em>"        ],        "post_tags": [          "</em>"        ]      }    }  }}
  • 倡议

    应用public_count字段搜寻索引blog1blog2中搜寻public_content中蕴含java的文档,输出一个谬误单词jave,倡议返回java

    GET blog*/_search{  "query": {    "wildcard": {      "public_content": {        "value": "*java*"      }    }  },  "suggest": {    "YOUR_SUGGESTION": {      "text": "jave",      "term": {        "field": "public_content"      }    }  }}
  • _source测试

    应用_source测试返回字段public_countpublic_content,因为字段别名是虚构的,所以此时是没有返回后果的

    GET blog*/_search{  "query": {    "wildcard": {      "public_content": {        "value": "*java*"      }    }  },  "_source": [    "public_count",    "public_content"  ]}
  • 应用docvalue_fields申请字段获取

    GET blog*/_search{  "query": {    "wildcard": {      "public_content": {        "value": "*java*"      }    }  },   "docvalue_fields": [    "public_count"  ]}

应用场景

简略总结一下字段别名的应用场景:

  • 文中的例子,能够对同一个人在不同博客网站上写的内容进行统计
  • 获取采集的日志信息,不同的数据源,索引的日志mapping不一样,统计时就能够应用字段别名进行对立的统计

本文由mdnice多平台公布