前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ES系列之原理copy_to用好了这么香

ES系列之原理copy_to用好了这么香

作者头像
用户7634691
发布于 2020-09-14 08:51:08
发布于 2020-09-14 08:51:08
3.9K00
代码可运行
举报
运行总次数:0
代码可运行

写在前面

Elasticsearch(以下简称ES)有个copy_to的功能,之前在一个项目中用到,感觉像是发现了一个神器。这个东西并不是像有些人说的是个语法糖。它用好了不但能提高检索的效率,还可以简化查询语句。

基本用法介绍

直接上示例。

先看看mapping,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT my_index
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "last_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "full_name": {
        "type": "text"
      }
    }
  }
}

first_name和last_name都指定了copy_to,表示他们这两个字段的值都会复制到full_name上。写入两条文档看看,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT my_index/_doc/1
{
  "first_name": "John",
  "last_name": "Smith"
}

PUT my_index/_doc/2
{
  "first_name": "Tom",
  "last_name": "Cruise"
}

然后我们在查询的时候,就可以指定从full_name这个字段查询了,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET my_index/_search
{
  "query": {
    "match": {
      "full_name": { 
        "query": "John Smith",
        "operator": "and"
      }
    }
  }
}

查询结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.3862944,
    "hits" : [
      {
        "_index" : "my_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.3862944,
        "_source" : {
          "first_name" : "John",
          "last_name" : "Smith"
        }
      }
    ]
  }

如果没有使用copy_to的话,我们需要指定两个字段查询,类似如下的语句:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "first_name": "John"
        }},
        {"match": {
          "last_name": "Smith"
        }}
      ]
    }
  }
}

两种方式查询的结果是一样的。

进阶

聊完了基本用法,来看看一些高级的功能。假如说我们想获取full_name的内容,有些业务场景下,我们会需要返回这个字段,怎么办呢?其实很简单,如下所示,我们在设置mapping的时候加上store:true即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT my_index
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "last_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "full_name": {
        "type": "text",
        "store": true
      }
    }
  }
}

然后再写入文档,我们可以通过下面的语句查询到full_name的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET my_index/_doc/1?stored_fields=full_name

得的结果是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "fields" : {
    "full_name" : [
      "John",
      "Smith"
    ]
  }
}

如果你没有指定store为true,查询的结果是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true
}

再来看另外一个问题。把上面的mapping改一下,text改为keyword,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT my_index
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "keyword",
        "copy_to": "full_name" 
      },
      "last_name": {
        "type": "keyword",
        "copy_to": "full_name" 
      },
      "full_name": {
        "type": "keyword",
        "store": true
      }
    }
  }
}

然后还是写入上面示例的两条数据。当我们用通用的查询语句查询时发现搜索不到结果了,这是为啥呢?

我这里先给出解决方案,但是不解释原理,有兴趣的可以思考下。

用下面两个查询语句都可以查询到结果,你觉得是什么原因?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {"term": {
          "first_name": {
            "value": "John"
          }
        }},
        {"term": {
          "last_name": {
            "value": "Smith"
          }
        }}

      ]
    }
  }
}

GET my_index/_search
{
  "query": {
    "terms": {
      "full_name": [
        "John",
        "Smith"
      ]
    }
  }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 犀牛的技术笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Springboot2.x整合ElasticSearch7.x实战(三)
还没开始的同学,建议先读一下系列攻略目录:Springboot2.x整合ElasticSearch7.x实战目录
JavaPub
2021/01/10
3.6K1
Springboot2.x整合ElasticSearch7.x实战(三)
023.基于IT论坛案例学习Elasticsearch(二):Query高级知识(一)
排名第一:标题包含"java",同时包含should中所有的关键字即"hadoop"和"elasticsearch" 排名第二:标题包含"java",同时包含should中的任何一个关键字 排名第三:标题包含"java",不包含should中的任何关键字
CoderJed
2020/08/11
7540
ES常用知识点整理第一部分
第三列倒排索引包含的信息为(文档ID,单词频次,<单词位置>),比如单词“乔布斯”对应的倒排索引里的第一项(1;1;<1>)意思是,文档1包含了“乔布斯”,并且在这个文档中只出现了1次,位置在第一个。
大忽悠爱学习
2023/02/13
5270
ES常用知识点整理第一部分
ES 查询优化(二)
接上一篇继续介绍。 1、查询精确匹配 假设有 { "tags" : ["search"] } { "tags" : ["search", "open_source"] } 两个文档,{ "term" : { "tags" : "search" } }都能匹配,但想只搜索包含一个的值,怎么办? 插入数据时多加一个长度字段: { "tags" : ["search"], "tag_count" : 1 } { "tags" : ["search", "open_source"], "tag_coun
YG
2018/05/23
2.6K0
Elasticsearch 学习笔记
es提供了一个测试分词的 api 接口,方便验证分词效果,endpoint 是 _analyze
学徒漠筱歌
2022/07/17
6310
ElasticSearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解
墨墨导读:之前我们分享了ElasticSearch最全详细使用教程:入门、索引管理、映射详解,本文详细介绍ElasticSearch的索引别名、分词器、文档管理、路由、搜索详解。
数据和云
2019/08/16
4.1K0
ElasticSearch教程(二)—— 基本使用
ElasticSearch是面向文档的,它存储文档,并索引每个文档的内容使之可以被索引。ES选择json作为文档序列化格式。
逝兮诚
2019/10/30
6830
ElasticSearch学习笔记
Create支持两种方式,一种是指定文档ID创建文档,另一种是让ES自动生成文档ID
UzJu@菜菜狗
2022/04/25
4540
Elasticsearch Mapping
Elasticsearch Mapping用于定义文档。比如:文档所拥有的字段、文档中每个字段的数据类型、哪些字段需要进行索引等。本文将先后从mapping type、mapping parameter、mapping field和mapping explosion这四个维度展开。
程序猿杜小头
2022/12/01
9360
es初探
1、ElasticSearch为了实现并发访问,每次实行更新、删除、添加之后都会为版本号自增1。
爱撒谎的男孩
2019/12/31
1.1K0
Elasticsearch入门——搜索与聚合
Elasticsearch作为分布式搜索引擎可以说应用非常广了,可以用于站内搜索,日志查询等功能。本文将着重介绍Elasticsearch的搜索与聚合功能。
灬沙师弟
2024/01/11
2510
Elasticsearch入门——搜索与聚合
Elasticsearch的Index和Mapping(二)
本文使用的Elasticsearch版本为6.5.4,基本命令以及操作大都通用。下面通过MySQL与Elasticsearch的对比图,让我们更好地理解接下来的增删改操作。
用户3467126
2020/02/25
2.9K0
Elasticsearch的Index和Mapping(二)
Elasticsearch初检索及高级
PUT customer/external/1 :在 customer 索引下的 external 类型下保存 1号数据
乐心湖
2021/01/18
1.1K0
Elasticsearch初检索及高级
Elasticsearch Mapping parameters(主要参数一览)
指定分词器。elasticsearch是一款支持全文检索的分布式存储系统,对于text类型的字段,首先会使用分词器进行分词,然后将分词后的词根一个一个存储在倒排索引中,后续查询主要是针对词根的搜索。
丁威
2019/06/10
2.5K0
Elasticserach Tips
PS:感叹elasticsearch在搜索和大数据聚合上面做的了不起的工作! 细致入微,基本上在工程层面解决了数不清的细节问题,了不起的产品设计和再创造,了不起的工作量! 就像docker重新唤醒容器技术一样,elasticsearch在Lucene之上的构建为个人数据分析和企业数据梳理开创新时代。 如果有条件,我是极为愿意买入他们的股票的。
happy123.me
2019/12/30
4790
Elasticsearch:inverted index,doc_values及source
这个几个概念分别指的是什么?有什么用处?如何配置它们?只有我们熟练地掌握了这些概念,我们才可以正确地使用它们。
腾讯云大数据
2020/09/29
1.3K0
Elasticsearch:inverted index,doc_values及source
es语法 rest api 模拟根据歌手,歌名,歌词来搜索demo
#创建索引 songs_v1 PUT { - "acknowledged": true, "shards_acknowledged": true, "index": "songs_v1" }
oktokeep
2024/10/09
790
es语法 rest api 模拟根据歌手,歌名,歌词来搜索demo
ElasticSearch系列18:Mapping 设计指南
ElasticSearch 的 mapping 该如何设计,才能保证检索的高效?想要回答这个问题,就需要全面系统地掌握 mapping 各种参数的含义以及其适用的场景。(ps:本文基于ElasticSearch 7.7.1)
方才编程_公众号同名
2020/11/13
1.6K0
ElasticSearch系列18:Mapping 设计指南
ElasticSearch基础入门学习笔记
本笔记的内容主要是在从0开始学习ElasticSearch中,按照官方文档以及自己的一些测试的过程。
Ryan-Miao
2020/02/24
5610
ElasticSearch系列03:ES的数据类型
从上图可以看到ES的数据类型和mysql或MongoDB的是很相似的,所以对于有数据结构基础的伙伴,这个知识点是非常轻松的。
方才编程_公众号同名
2020/11/12
1.5K0
ElasticSearch系列03:ES的数据类型
相关推荐
Springboot2.x整合ElasticSearch7.x实战(三)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验