bool查询原理 es_ES系列之原理copy_to用好了这么香

写在前面

4ab6e1944f42761c15209acfa8962bf2.png

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

基本用法介绍

直接上示例。

先看看mapping,

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上。写入两条文档看看,

PUT my_index/_doc/1
{
  "first_name": "John",
  "last_name": "Smith"
}

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

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

GET my_index/_search
{
  "query": {
    "match": {
      "full_name": { 
        "query": "John Smith",
        "operator": "and"
      }
    }
  }
}

查询结果如下:

"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的话,我们需要指定两个字段查询,类似如下的语句:

GET my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "first_name": "John"
        }},
        {"match": {
          "last_name": "Smith"
        }}
      ]
    }
  }
}

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

进阶

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

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的内容。

GET my_index/_doc/1?stored_fields=full_name

得的结果是:

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "fields" : {
    "full_name" : [
      "John",
      "Smith"
    ]
  }
}

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

{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true
}

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

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
      }
    }
  }
}

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

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

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

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"
      ]
    }
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

加密算法—MD5、RSA、DES

最近因为要做一个加密的功能,简单了解了一下加密算法,现在比较常用的有三个加密算法MD5加密算法、RSA加密算法、DES加密算法。 MD5加密算法 定义:MD5算法是将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字…

随机加密_随机艺术和加密圣诞树

随机加密When I first learned how to code, one of my first tasks was setting up an SSH key so I could use encryption to securely connect to my friend’s Linux server.当我第一次学习如何编码时,我的第一个任务是设置SSH密钥,以便可以使用加密…

用c语言编写一个2048 游戏,求c语言编写的2048游戏代码,尽量功能完善一些

正在编写中,请稍后!追答 : 代码来了!有点急,没做界面。追答 : 2048_launcher。c:#include#include#includevoid main(){printf("正在启动中,请稍后!");Sleep(1000);system("bin\…

MySQL之数据库对象查看工具mysqlshow

mysqlshow:数据库对象查看工具,用来快速查找存在哪些数据库、数据库中的表、表中的列或索引。选项:--count 显示数据库和表的统计信息-k 显示指定的表中的索引-i 显示表的状态信息不带任何参数显示所有数据库[rootwww mys…

软件工程分组

电子零售系统 陈仔祥 孟拓 陈庚 汪力 郭澳林 崔祥岑 刘校 肖宇 武清 胡圣阳转载于:https://www.cnblogs.com/2231c/p/9960751.html

vnr光学识别怎么打开_干货|指纹锁的指纹识别模块的前世今生,智能锁的指纹识别到底有多智能?...

智能锁现在也有很多叫法:指纹锁、电子锁。可见指纹识别是智能锁的核心功能了,那我们今天来聊聊智能锁的指纹识别模块。指纹识别的历史指纹识别认证的流程指纹识别技术的种类指纹识别的历史早在2000多年前我国古代的人就将指纹用于签订合同和破案了&#…

使用Kakapo.js进行动态模拟

by zzarcon由zzarcon 使用Kakapo.js进行动态模拟 (Dynamic mocking with Kakapo.js) 3 months after the first commit, Kakapo.js reaches the first release and we are proud to announce that now it is ready to use. Let us introduce you Kakapo.首次提交3个月后&#…

android ble 实现自动连接,Android:自动重新连接BLE设备

经过多次试验和磨难之后,这就是我最好让Android自动连接的唯一用户操作是首先选择设备(如果使用设置菜单然后首先配对).您必须将配对事件捕获到BroadcastReceiver中并执行BluetoothDevice.connectGatt()将autoconnect设置为true.然后当设备断开连接时,调用gatt.connect().更新&…

莱斯 (less)

less中的变量 1、声明变量:变量名:变量值 使用变量名:变量名 less中的变量类型 ①数字类1 10px ②字符串:无引号字符串red和有引号字符串"haha" ③颜色类red#000000 rgb() …

hackintosh黑苹果_如何构建用于编码的Hackintosh

hackintosh黑苹果by Simon Waters西蒙沃特斯(Simon Waters) 如何构建用于编码的Hackintosh (How to build a Hackintosh for coding) Let’s talk about Hackintosh-ing — the installation of Mac OS X on PC hardware.我们来谈谈Hackintosh-ing-在PC硬件上安装Mac OSX。 I…

hide show vue 动画_(Vue动效)7.Vue中动画封装

关键词&#xff1a;动画封装——进行可复用一、如何封装&#xff1f;1、使用&#xff1a;局部组件传递数据局部组件中使用JS动画2、原理&#xff1a;将动画效果完全第封装在一个名为<fade>的组件中&#xff0c;今后如要复用&#xff0c;只需要复制有其组件名的部分&#…

android项目编译命令行,命令行编译Android项目

1. 生成R文件> aapt package -f -m -J ./gen -S res -M AndroidManifest.xml -I D:\android.jar-f 如果编译生成的文件已经存在&#xff0c;强制覆盖。-m 使生成的包的目录存放在-J参数指定的目录-J 指定生成的R.java 的输出目录路径-S 指定res文件夹的路径-I 指定某个版本平…

jQuery datepicker和jQuery validator 共用时bug

当我们给一个元素绑定一个datepick后又要对它用validator进行验证时会发现验证并没有成功 因为当点击该元素时候input弹出datepick的UI就已经失去了焦点它验证的仍然是前一个值&#xff0c; 不过还好 datepick提供了onSelect 事件我们可以在这个事件触发的时候重新把焦点在赋给…

《Python地理数据处理》——导读

前言本书可以帮助你学习使用地理空间数据的基础知识&#xff0c;主要是使用GDAL / OGR。当然&#xff0c;还有其他选择&#xff0c;但其中一些都是建立在GDAL的基础之上&#xff0c;所以如果你理解了本书中的内容&#xff0c;就可以很轻松地学习其他知识。这不是一本关于地理信…

记一次Java AES 加解密 对应C# AES加解密 的一波三折

最近在跟三方对接 对方采用AES加解密 作为一个资深neter Ctrl CV 是我最大的优点 所以我义正言辞的问他们要了demo java demo代码&#xff1a; public class EncryptDecryptTool {private static final String defaultCharset "UTF-8";private static final String …

zemax评价函数编辑器_ZEMAX与光学设计案例:激光扩束系统详细设计与公差分析(二)...

目前超过两千人的光学与光学设计方面的微信公众号&#xff0c;欢迎您的到来&#xff01;激光扩束系统公差分析ZEMAX与光学设计案例&#xff1a;激光扩束系统详细设计与公差分析(二)作者&#xff1a;墨子川上10倍扩束系统在上篇已经设计好了&#xff0c;接下来就是进行系统的公差…

决策者根据什么曲线做出决策_如何做出产品设计决策

决策者根据什么曲线做出决策by Tanner Christensen由Tanner Christensen 如何做出产品设计决策 (How Product Design Decisions are Made) Recently in a Facebook group dedicated to designers, known as Designers Guild, a young design student named Marina Candela ask…

移动前端框架重构几个关键问题

1. 是否该废弃iscroll&#xff1f; 我得出的结论是&#xff0c;是该废弃了。那当时为什么要用iscroll&#xff1f; 原因有三个&#xff1a; 1. 因为别人也用了。 2. 为了iPhone上页面滑动更顺畅。 3. 为了用上拉、下拉刷新。 关于这三个原因有几点观点&#xff1a; 1. 人最容易…

android 内部共享存储,Android共享内部存储

我现在面对txt文件的类似情况,并做到了这一点.File downloadedFile new File( context.getFilesDir(),"simple.txt" );downloadedFile.setReadable( true,false );downloadedFile.setWritable( true,false ); //set read/write for othersUri downloadFileUri Uri.f…

UiPath: Selectors repair 选择器的修复,即被选择的按钮发生改变如何选择第二按钮...

实现批量注册用户功能时&#xff0c;出现第一个用户注册完时&#xff0c;弹出确认按钮&#xff0c;点击即可&#xff0c;但是第二个用户注册完成时&#xff0c;弹出的按钮与第一个有差异&#xff0c;图形用户界面元素及其父元素的属性都发生改变。所以就点不了按钮&#xff0c;…