Elasticsearch 字段别名 field-alias

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch 字段别名 field-alias

环境

  • 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不一样,统计时就可以使用字段别名进行统一的统计


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
6月前
|
PHP
Elasticsearch模糊查询单字段多字段
Elasticsearch模糊查询单字段多字段
51 0
|
6月前
|
Oracle 关系型数据库 API
实时计算 Flink版产品使用合集之当sink到elasticsearch时,可以指定es的指定字段吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用合集之当sink到elasticsearch时,可以指定es的指定字段吗
|
5月前
|
SQL 安全 数据挖掘
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
Elasticsearch聚合查询用于复杂数据分析,包括统计空值率。示例展示了如何计算字段`my_field`非空非零文档的百分比。查询分为三步:总文档数计数、符合条件文档数计数及计算百分比。聚合概念涵盖度量、桶和管道聚合。脚本在聚合中用于动态计算。常见聚合类型如`sum`、`avg`、`date_histogram`等。组合使用可实现多值统计、嵌套聚合和空值率计算。[阅读更多](https://zhangfeidezhu.com/?p=515)
297 0
Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?
|
6月前
|
搜索推荐 JavaScript Java
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
Elasticsearch 8.X 如何依据 Nested 嵌套类型的某个字段进行排序?
90 0
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之源MySQL表新增字段后,要同步这个改变到Elasticsearch的步骤是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
运维 测试技术 数据处理
Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!
Elasticsearch 优化查询中获取字段内容的方式,性能提升5倍!
67 0
|
6月前
|
数据采集 机器学习/深度学习 自然语言处理
Elasticsearch 8.X 如何动态的为正文添加摘要字段?
Elasticsearch 8.X 如何动态的为正文添加摘要字段?
40 0
|
6月前
|
分布式计算 DataWorks 安全
DataWorks产品使用合集之在DataWorks中,从Elasticsearch同步数据到ODPS时同步_id字段的如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
83 0
|
6月前
|
SQL JSON DataWorks
DataWorks产品使用合集之DataWorks 数据集成任务中,将数据同步到 Elasticsearch(ES)中,并指定 NESTED 字段中的 properties 类型如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
88 0
|
6月前
|
iOS开发 索引 MacOS
Elasticsearch 聚合字段aggregate-metric-double
Elasticsearch 聚合字段aggregate-metric-double
79 0