es笔记五之term-level的查询操作

本文首发于公众号:Hunter后端
原文链接:es笔记五之term-level的查询操作

官方文档上写的是 term-level queries,表义为基于准确值的对文档的查询,可以理解为对 keyword 类型或者 text 类型分词为 keyword 的字段进行 term 形式的精确查找。

以下是本篇笔记目录:

  1. 是否存在值
  2. 前缀搜索
  3. 大小于操作
  4. term 查询
  5. terms 查询
  6. wildcard 查询

1、是否存在值

exists 查询某个字段是否存在值。

还是使用上篇笔记讲的 exam 这个 index,我们创建一条数据,只给定 name 的值,那么 address 的值就 null,或者说查询返回的数据就没有这个字段了。

PUT /exam/_doc/12
{
    "name" : "test"
}

然后我们查询 address 字段有值的数据:

GET /exam/_search
{
  "query": {
    "exists": {
      "field": "address"
    }
  }
}

就可以发现返回的数据中没有我们创建的这条数据,或者我们取反操作,查询 address 字段没有值的数据:

GET /exam/_search
{
  "query": {
    "bool": {
      "must_not": [
        {"exists": {"field": "address"}}
      ]
    }
  }
}

2、前缀搜索

对于我们在前面创建的这条数据:

PUT /exam/_doc/16
{
    "name" : "张三丰",
    "address": "一个苹果"
}

如果是 name 字段,因为它是一个 keyword 类型,所以它是一个整体不会被分词处理,我们可以搜索 name 的值为 '张', '张三' 和 '张三丰' 都可以搜索到。

GET /exam/_search
{
  "query": {
    "prefix": {
      "name": {
        "value": "张"
      }
    }
  }
}

但是对于 address 字段,发现是可以搜索到 '一','一个' 和 '苹果',但是搜索 '一个苹',或者 '一个苹果' 是搜不到结果的。

GET /exam/_search
{
  "query": {
    "prefix": {
      "address": {
        "value": "一个苹"
      }
    }
  }
}

我们可以看一下 '一个苹果' 的分词结果:

GET /exam/_doc/16/_termvectors?fields=address

可以发现可以搜索到的词都在以分词结果的开头或者全部,但是 '一个苹' 是没有分词结果以此为开头的。

所以这里我们的搜索操作是基于 address 字段的分词结果列表来查询的。

如果想要搜索到从 '一' 开始到结尾之间任意地点截断的数据,我们就需要将 address 字段作为一个整体来搜索,那就是加上 .keyword 来操作。

GET /exam/_search
{
  "query": {
    "prefix": {
      "address.keyword": {
        "value": "一个苹"
      }
    }
  }
}

3、大小于操作

前面介绍了 gt, gte, lt, lte 的操作是在 bool 下的 filter 里操作,这里我们可以直接放到 query 下:

GET /bank/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

4、term 查询

前面介绍过 term 查询是一种精确查询,但是官方文档提醒我们应该尽量避免对 text 字段使用 term 查询,因为 text 类型的数据在写入的时候会被分词,通过 term 查询我们可能搜索不到想要的查询的数据。同时建议我们查询 text 字段应当使用 match 操作。

我们使用官方文档提供的一个示例来说明为什么应该尽量避免使用 term 查询来查询 text 字段,其实前面我们介绍过相关的示例,这里单独拿出来做一下说明。

还是使用我们前面用过的索引 exam,我们来写入一条数据:

PUT /exam/_doc/18
{
  "address": "quick brown foxes"
}

然后我们想要搜索 'quick brown foxes' 这个字符串,使用下面的操作:

GET /exam/_search
{
  "query": {
    "term": {
      "address": {
        "value": "quick brown foxes"
      }
    }
  }
}

这个肯定是搜索不到的,因为这个字符串在写入的时候已经被分词处理了,而 term 是一个精确查找,相当于搜索一整个字符串,这就肯定搜索不到了。

但是我们可以使用 match,match 操作会在搜索前先对搜索的字符串进行分词处理,然后进行匹配操作,所以使用下面的操作是可以搜索到数据的:

GET /exam/_search
{
  "query": {
    "match": {
      "address": "quick brown foxes"
    }
  }
}

前面还介绍过,如果想要搜索一整个 address 的值为我们搜索的字符串内容,可以使用 address.keyword:

GET /exam/_search
{
  "query": {
    "term": {
      "address.keyword": "quick brown foxes"
    }
  }
}

5、terms 查询

如果想要同时搜索多个精确字段值,比如搜索 "quick" 和 "苹果",就可以使用 terms:

GET /exam/_search
{
  "query": {
    "terms": {
      "address": ["quick", "苹果"]
    }
  }
}

6、wildcard 查询

wildcard 是通配符的意思,这里的用法有点类似于前缀的操作,都是通过符号来实现更为随意的匹配。

这里有两个通配符,一个是 *,一个是 ?

* 的作用是 0 到 n 个字符长度

比如我搜索 qui* 就可以查到 quick 的数据:

GET /exam/_search
{
  "query": {
    "wildcard": {
      "address": {
        "value": "qui*"
      }
    }
  }
}

? 的作用是匹配任意单个字符,比如我们搜索 qui?k,也可以查询到这条数据:

GET /exam/_search
{
  "query": {
    "wildcard": {
      "address": {
        "value": "qui?k"
      }
    }
  }
}

如果想获取更多后端相关文章,可扫码关注阅读:
image

本文转载于网络 如有侵权请联系删除

相关文章

  • CSDN 四川大学线下编程比赛第二题:Peter的X

    大家好,又见面了,我是全栈君。题目详情:http://student.csdn.net/mcs/programming_challengesPeter是个小男孩。他总是背不清26个英文字母。于是,刁钻的英语老师给他布置了一个很奇怪的作业。老师给了他一个由26个英文字母构成的N*N的矩阵(我们保证N一定是一个奇数),问他这个矩阵构成的图案是否是一个标准的“X”。一个标准的X的定义:1、对角线上全部元素都是同一个字母。2、全部非对角线上的元素也都是同一个字母。且字母与对角线上的字母不同。假设是则输出“YES”。否则输出“NO”。输入描写叙述:多组測试数据(数据量在100组以内)。每组測试数据第一行为一个整数N(1<=N<=300),表示表格的大小。以下是N行是一个由字母构成的N*N的矩阵。输出描写叙述:对于每组输入数据,输出一行“YES”或“NO”。输入例子:5xoooxoxoxosoxoooxoxoxooox3wswswswsw3xpxpxpxpe输出例子:NOYESNO题目分析:简单的模拟推断题,首先推断主对角线。然后推断副对角线,之后推断其它位置,最后推断对角线的元素是否

  • 赠书 | 站在数字化的十字路口,先问自己这八个问题

    文中有数据派THU福利哦企业功能的革新常谈常新。什么是企业功能?古人的说法是六管口诀中的“产销人发财资”,现代人最简单的说法就是让一间企业正常运转并达成目标的核心能力。近几年最常提及的企业功能变革是“数字化转型”,而关于数字化转型,一千个人嘴里有一千种说法,其中广受好评的CRM软件服务提供商Salesforce给的定义最为清晰易懂:资料数字化(Digitization)——将资料从物理环境转移到数据化环境,例如抛弃纸笔;作业数字化(Digitalization)——利用数据化技术来让既有工作变得更简单、更高效,但并不涉及改造工作流程本身;数字化转型(DigitalTransformation)——所有人都要围绕“把客户服务好”这个目的,利用数字化技术来重新规划工作流程,甚至不惜打破原有的功能编制——因此数字化转型的本质也在于效率的提升。麦肯锡的一份报告显示,新冠疫情已经把企业和社会的数字化转型推进了大约7年时间;哈佛商业评论一份关于数字转型的调查中,95%的高管认为数字转型在过去一年中在他们的行业中变得越来越重要。在《云上的中国2:科技创新与产业未来》中,作者写到国内企业仍处于数字化的

  • ARM64下if语句的状态寄存器变化

    一·代码voidfun(){asm("movw0,#0xffffffff\n""addsw0,w0,#0x0\n");}二·CPSR寄存器cpsr有32位,其中IFTM[0:4]称为控制位,程序无法改变,除非CPU运行在某种特殊的管理模式下。N,Z,C,V为条件码标志位,四位内容可以被算术或逻辑运算的结果所改变,并且决定某条指令是否可以被执行。3130292827~8保留位7~0IFTM位N位:CPSR的31位是N,记录相关指令执行后,其结果是否位负数。负数=1,非负数=0此时a!=bN位应该是1000=8那么cpsr=0x80000000我们修改一下指鹿为马三·内联汇编对asm内联代码打断点可以发现cpsr为0x6000000对应NZCV为:0110内联汇编ARM64指令集中,有的指令执行时影响状态寄存器,比如addsubor等,他们大都是运算指令Z位:CPSR的第30位,0标志位。它记录相关指令执行后,其结果是否为0.那么Z=1内联汇编代码中我们给w0赋值了0xfffffffflldb单步执行下一步mov发现,CPSR的值没有发生改变但是此时

  • 详述 GitHub 如何将代码从原分支合并到 fork 分支

    在使用GitHub的过程中,我们可能会遇到这样的问题,即:如何将原分支的代码合并到fork的分支?这个问题其实很常见。当我们fork别人代码的时候,实际上是对原项目当时状态以及进度进行了一个快照,其随后发生的改变,并不会自动同步到我们的fork分支!但是为了保证我们fork的分支状态与原分支同步,这就需要我们主动将原分支的代码合并到我们fork的分支了。现在,以博主fork的akka项目为例,就让我们一起看看,将原分支代码合并到fork分支的具体操作步骤:guobinhit-akka标注1:Newpullrequest,新建拉请求按钮;标注2:显示fork分支与原分支相差的提交次数。如上图所示,标注2显示了我们已经向fork的分支进行了6次提交以及在我们fork原分支或者上一次合并之后,原分支已经进行了160次提交。为了原分支的代码,点击标注1所示的Newpullrequest按钮。comparing-changes如上图所示,默认是从我们fork的分支向原分支合并,标注1左边的箭头表示合并的方向,点击标注1所示的位置,选择标注2所示的akka/akka,也就是原分支。compare-

  • eclipse安装svn插件的多种方式

    方法一:在线安装1.打开HELP-&gt;MyEclipseConfiguration Center。切换到SoftWare标签页。 2.点击AddSite打开对话框,在对话框Name输入Svn,URL中输入:http://subclipse.tigris.org/update_1.6.x 3.在左边栏中找到PersonalSite中找到SVN展开。将CoreSVNKitLibrary和OptionalJNA Library添加(右键AddtoProfile),Subclipse下面的SubclipseIntegrationforMylyn 3.0可以不添加(特别注意,此处不要添加)。 4.在右下角窗格(PendingChanges)中点击Apply。安装重启后MyEclipse即可。 方法二:link安装 安装subclipse,MyEclipse9.0SVN插件 1、从官网下载site-1.6.10.zip文件,网址是:subclipse.tigris.org, 2、从中解压出features与plugins文件夹,复制到E:\MyEclipse\myPlugin\svn里

  • 基于jieba库实现中文词频统计

    要实现中文分词功能,大家基本上都是在使用jieba这个库来实现,下面就看看怎样实现一个简单文本分词功能。安装python的工具,安装当然是使用pip安装了。pipinstalljieba复制使用先看一个小例子,下面的代码是从一个文本文件中分词并统计出现频率最高的10个单词,并打印到控制台。#!/usr/bin/envpython #-*-coding:utf-8-*- importjieba importjieba.analyse importcodecs importre fromcollectionsimportCounter classWordCounter(object): defcount_from_file(self,file,top_limit=0): withcodecs.open(file,'r','utf-8')asf: content=f.read() content=re.sub(r'\s+',r'',content) content=re.sub(r'\.+

  • Pointer Network

    PointerNetwork是seq2seq模型的一种变型。seq2seq模型是一种编码-解码框架的端到端生成模型,已经在机器翻译、对话生成、语法改错等领域有了成功的进展。本文不再赘述。此处主要介绍PointerNetwork的基本原理和作用。 PointerNetwork的主要作用PointerNetwork主要用于解决组合优化问题,传统的优化问题寻优一般使用启发式的搜索算法,基于PointerNetwork主要是对源数据进行组合,达到目标函数最优。常见的应用包括凸包问题、旅行商问题等。 PointerNetwork的模型框架对于凸包问题,可以简述为:可定图中若干点,选取其中几个连接成凸多边形使得该多边形能包含图中所有的点。(1)如果该问题使用普通的seq2seq建模,即encoder输入序列为P1,..,P4点的坐标,decoder输出为点的label(即1-4),此时decoder的输出范围与encoder的输入不相同,只需要输出encoder序列的位置。目标函数如下所示:(2)若使用seq2seq+Attention模型,即解码过程需要对encoder端进行Attention计

  • 如何用Python提取中文关键词?

    本文一步步为你演示,如何用Python从中文文本中提取关键词。如果你需要对长文“观其大略”,不妨尝试一下。(由于微信公众号外部链接的限制,文中的部分链接可能无法正确打开。如有需要,请点击文末的“阅读原文”按钮,访问可以正常显示外链的版本。)需求好友最近对自然语言处理感兴趣,因为他打算利用自动化方法从长文本里提取关键词,来确定主题。他向我询问方法,我推荐他阅读我的那篇《如何用Python从海量文本提取主题?》。看过之后,他表示很有收获,但是应用场景和他自己的需求有些区别。《如何用Python从海量文本提取主题?》一文面对的是大量的文档,利用主题发现功能对文章聚类。而他不需要处理很多的文档,也没有聚类的需求,但是需要处理的每篇文档都很长,希望通过自动化方法从长文提取关键词,以观其大略。我突然发现,之前居然忘了写文,介绍单一文本关键词的提取方法。虽然这个功能实现起来并不复杂,但是其中也有些坑,需要避免踩进去的。通过本文,我一步步为你演示如何用Python实现中文关键词提取这一功能。环境Python第一步是安装Python运行环境。我们使用集成环境Anaconda。请到这个网址下载最新版的An

  • C#获取CPU序列号,MAC地址,硬盘ID…

    //1.cpu序列号2.mac序列号3.硬盘id//在给软件加序列号时这三个应该是最有用的,可以实现序列号和机器绑定,对保护软件很有好处.using System; using System.Management; /// Computer Information publicclassComputer     { publicstring CpuID; //1.cpu序列号publicstring MacAddress; //2.mac序列号publicstring DiskID; //3.硬盘idpublicstring IpAddress; //4.ip地址publicstring LoginUserName; //5.登录用户名publicstring ComputerName; //6.计算机名publicstring SystemType; //7.系统类型publicstring TotalPhysicalMemory; //8.内存量单位:Mpublic   Computer()          {              CpuID = GetCpuID();  

  • 深入使用XMemcached1 XMemcached介绍和环境构建2 构建MemcachedClient对象12 初探Memcached分布式原理14 余数Hash算法15 一致性 Hash 算法16

    1XMemcached介绍和环境构建2构建MemcachedClient对象12初探Memcached分布式原理开两个不同进程,模拟分布式14余数Hash算法15一致性Hash算法pom.xml16XMemcached整合SpringBoot17XMemcachedBuilder相关参数18代码演示

  • 在react底下安装环境

    1.在react底下安装环境Image.pngImage.png2.新建一个文件夹Image.png3.配置入口文件redux:staticRoot+'/redux/app'Image.png4.在APP.js里,如何把store放到react里面运行Image.pngImage.pngImage.png把这两个方法注释掉Image.png类里面构造器的概念:Image.png把所有函数接收过来再原封不动的传给构造器Image.png开始写数据: //使用es6class去写组件时,对状态的数据赋值默认值Image.png在按钮上加上一个事件Image.png匿名函数导致函数传过去就是空的 所以,用什么? 传过去是add的行为; 点击按钮触发行为,触发数据,去store里面拿到新的数据,调用一次传一个行为 MVC的架构思想:包装组件,包装store;import{createClass,PropTypes}from'react'; //ReactcreateClass constAppComponent=createClass({ //设置pro

  • Mybatis框架中是如何获取到SQL语句的,让我们一起来模拟一下吧

    本文主要是通过代理和反射来模拟Mybatis此ORM框架是如何获得SQL语句及相关参数等。当我们拿到这些东西,那么一切就变得很简单啦,想做啥就做啥啦。 与君共勉? 一、基础知识我们都知道Mybatis框架主要就是靠代理和反射来进行操作,那么对于动态代理,怎么都需要了解一点点哈。Proxy.newProxyInstance(ClassLoaderloader,Class<?>[]interfaces,InvocationHandlerh)newProxyInstance,方法有三个参数:loader:用哪个类加载器去加载代理对象 interfaces:动态代理类需要实现的接口 h:动态代理方法在执行时,会调用h里面的invoke方法去执行 二、代码一个User类为了测试加上的。publicclassUser{ privateIntegerid; privateStringusername; privateStringpassword; }复制具体代码哦:加一下Mybatis的依赖就可以直接copy测试啦哦importorg.apache.ibatis.annotations.

  • 微信公众号开发(五)

      微信公众号开发    第二章 创建菜单 1.字定义回复主菜单:   1.回复文本消息:        2.回复单图文消息:        3.回复多图文消息:        4.回复单图片和回复音频:        2.Java后台处理逻辑:   /** *后台返回给微信 */ @Override protectedvoiddoPost(HttpServletRequestreq,HttpServletResponseresp)throwsServletException,IOException{ req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding("UTF-8"); PrintWriterout=resp.getWriter();//后台返回给微信页面的方法 try{ Map<String,String>map=MessageUtil.xmlToMap(req);//获取消息到集合中 //获取参数 StringtoUserName=map.get

  • C++11 多线程编程 使用lambda创建std::thread (生产/消费者模式)

    要写个tcpserver/client的博客,想着先写个c++11多线程程序。方便后面写博客使用。 目前c++11中写多线程已经很方便了,不用再像之前的pthread_create,c++11中已经有了std::thread库可以方便使用。   直接看代码(100个任务,多个线程处理): 1#include<iostream> 2#include<thread> 3#include<chrono> 4#include<vector> 5#include<mutex> 6 7classTask{ 8public: 9Task(intx,std::shared_ptr<std::mutex>mutex) 10:_x(x),_mutex(mutex){} 11 12voidhandle(){ 13inttask_id=0; 14while(true){ 15//获取任务,尽早释放锁 16if(_x>0){ 17std::lock_guard<std::mutex>lock(*_mutex);

  • 老板让只懂Java基本语法的我,基于AQS实现一个锁

    10点整,我到了公司,又成为全组最后一个到的员工。 正准备刷刷手机摸摸鱼,看见老板神秘兮兮地走了过来。 老板:闪客呀,你写个工具,基于AQS实现一个锁,给咱们组其他开发用 我:哦好的 老板:你多久能搞好? 我:就是一个工具类是吧,嗯今天下午就给你吧 老板:嗯,那你抓紧时间搞吧,大家都等着用呢 我:哦好的 先写个框架 关于锁,我还算有一个模糊的认识的,要让使用者可以获取锁、释放锁,来实现多线程访问时的安全性。于是我赶紧先把一个框架写了出来。 //给帅气老板用的锁 publicclassFlashLock{ //释放锁 publicvoidlock(){} //释放锁 publicvoidunlock(){} } 复制 工具类已经完成一半了,一想到全组的开发们下午就会这样用到我的工具,我不禁笑出了声音。 FlashLockflashLock=newFlashLock(); publicvoiddoSomeThing(){ //获取锁,表示同一时间只允许一个线程执行这个方法 flashLock.lock(); try{ ... }finally{ //优雅地在finally里释放锁

  • LLMNR和NetBIOS欺骗--获取win7 ntlm-hash

    1、LLMNR和Netbios是什么 链路本地多播名称解析(LLMNR)是一个基于域名系统(DNS)数据包格式的协议NetBIOS,为网上基本输入输出系统(NetworkBasicInput/OutputSystem)的缩写,它提供了OSI模型中的会话层服务,让在不同计算机上运行的不同程序,可以在局域网中,互相连线,以及分享数据。NetBIOS和Link-LocalMulticastNameResolution(LLMNR)是Microsoft针对工作组和域设计的名称解析协议,主要用于局域网中的名称解析。当DNS解析失败时,Windows系统会使用NetBIOS和LLMNR搜索名称。这些协议只为本地连接设计。 NetBIOS和LLMNR在WindowsVista以后的系统中均实现,二者的主要区别在于:1)NetBIOS基于广播,而LLMNR基于多播;2)NetBIOS在WindowsNT以后的所有操作系统上均可用,而只有WindowsVista和更高版本才支持LLMNR;3)LLMNR还支持IPv6,而NetBIOS不支持,因此,在启用了IPv6,但对IPv6管理不如IPv4那样细致

  • 大厂技术博客汇总

    团队 地址 美团点评 https://tech.meituan.com/         知乎专栏 腾讯大讲堂 http://djt.qq.com/videos/ 腾讯云技术 https://www.zhihu.com/org/teng-xun-yun-ji-zhu-she-qu/posts 阿里中间件 http://jm.taobao.org/ 阿里云栖 https://yq.aliyun.com/topic/list/       知乎专栏 淘宝前端 http://taobaofed.org/ 百度FEX http://fex.baidu.com/articles/ 百度EFE http://efe.baidu.com/ 360技术 http://blogs.360.cn/ 今日头条 https://techblog.toutiao.com/   &

  • 发布功能完成。

    编写要求登录的装饰器 fromfunctoolsimportwraps defloginFirst(func):#参数是函数 @wraps(func)     defwrapper(*args,**kwargs):#定义个函数将其返回       #要求登录         returnfunc(*args,**kwargs)     returnwrapper#返回一个函数 应用装饰器,要求在发布前进行登录,登录后可发布。 @app.route('/question/',methods=['GET','POST'])@loginFirstdefquestion():复制   建立发布内容的对象关系映射。 classQuestion(db.Model):复制 完成发布函数。 保存到数据库。 重定向到首页。 复制 {%extends'myweb

  • nodejs fs.open

    fs.open(path,flags,[mode],[callback(err,fd)])是POSIXopen函数的封装,与C语言标准库中的fopen函数类似。它接受两个必选参数,path为文件的路径,flags可以是以下值。r:以读取模式打开文件。r+:以读写模式打开文件。w:以写入模式打开文件,如果文件不存在则创建。w+:以读写模式打开文件,如果文件不存在则创建。a:以追加模式打开文件,如果文件不存在则创建。a+:以读取追加模式打开文件,如果文件不存在则创建。mode参数用于创建文件时给文件指定权限,默认是0666①。回调函数将会传递一个文件描述符fd②。

  • Invalid bound statement (not found)

    问题描述及解决 org.apache.ibatis.binding.BindingException:Invalidboundstatement(notfound): 项目启动报找不到statement,仔细检查了下没发现了配置有问题,看下是不是编译后的文件有问题?发现xml没有编译进来,看了pom文件的<build></build>,发现通过spring.io初始化项目,bulid默认是没有把xml打包到target下面的,设置下就可以了。 <build> <resources> <resource> <directory>src/main/resources/</directory> </resource> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> &

  • PowerDesgner的视图显示设置教程

    一、简介 PowerDesgner是一款实用的数据库原型设计软件,但一些新手往往会觉得不好上手,应小伙伴需要,整理了一下PowerDesgner的视图显示设置教程: 首先,PowerDesgner的数据表模型的默认视图效果是这样的: 如图所示,这样只能看到字段名和数据类型,并不够直观,数据表多字段复杂的时候就更达不到原型需要的展示效果了。所以这里会教小伙伴如何设置成下面的显示效果:     二、操作步骤 第一步,设置显示表名和表注释 这样就能显示表名及表注释了,效果如下图: 第二步,显示字段中文名、注释等   Ok,视图效果出来了,如下图:   这样的话,看起来是不是直观多了?如果不明显,可能只是因为数据不多。像下图那样稍复杂的数据库模型,清晰直观的视图效果就十分必要了  

相关推荐

推荐阅读