当前位置: 首页 > news >正文

elasticsearch term match 查询

1. 准备数据

PUT h1/doc/1
{"name": "rose","gender": "female","age": 18,"tags": ["白", "漂亮", "高"]
}PUT h1/doc/2
{"name": "lila","gender": "female","age": 18,"tags": ["黑", "漂亮", "高"]
}PUT h1/doc/3
{"name": "john","gender": "male","age": 18,"tags": ["黑", "帅", "高"]
}

运行结果:

{"_index" : "h1","_type" : "doc","_id" : "1","_version" : 1,"result" : "created","_shards" : {"total" : 2,"successful" : 1,"failed" : 0},"_seq_no" : 0,"_primary_term" : 1
}

2. match 查询

2.1 match 按条件查询

# 查询性别是男性的结果
GET h1/doc/_search
{"query": {"match": {"gender": "male"}}
}

查询结果:

{"took" : 59,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 0.2876821,"hits" : [{"_index" : "h1",		# 索引"_type" : "doc",		# 文档类型"_id" : "3",			# 文档唯一 id"_score" : 0.2876821,	# 打分机制打出来的分数"_source" : {			# 查询结果"name" : "john","gender" : "male","age" : 18,"tags" : ["黑","帅","高"]}}]}
}

2.2 match_all 查询全部

# 查询 h1 中所有文档
GET h1/doc/_search
{"query": {"match_all": {}}
}

match_all的值为空,表示没有查询条件,那就是查询全部。就像select * from table_name 一样。

查询结果:

{"took" : 2,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 3,"max_score" : 1.0,"hits" : [{"_index" : "h1","_type" : "doc","_id" : "2","_score" : 1.0,"_source" : {"name" : "lila","gender" : "female","age" : 18,"tags" : ["黑","漂亮","高"]}},{"_index" : "h1","_type" : "doc","_id" : "1","_score" : 1.0,"_source" : {"name" : "rose","gender" : "female","age" : 18,"tags" : ["白","漂亮","高"]}},{"_index" : "h1","_type" : "doc","_id" : "3","_score" : 1.0,"_source" : {"name" : "john","gender" : "male","age" : 18,"tags" : ["黑","帅","高"]}}]}
}

2.3 match_phrase 短语查询

match 查询时散列映射,包含了我们希望搜索的字段和字符串,即只要文档中有我们希望的那个关键字,但也会带来一些问题。

es 会将文档中的内容进行拆分,对于英文来说可能没有太大的影响,但是中文短语就不太适用,一旦拆分就会失去原有的含义,比如以下:

1、准备数据:

PUT t1/doc/1
{"title": "中国是世界上人口最多的国家"
}PUT t1/doc/2
{"title": "美国是世界上军事实力最强大的国家"
}PUT t1/doc/3
{"title": "北京是中国的首都"
}

2、先使用 match 查询含有中国的文档:

GET t1/doc/_search
{"query": {"match": {"title": "中国"}}
}

查询结果:

{"took" : 5,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 3,"max_score" : 0.68324494,"hits" : [{"_index" : "t1","_type" : "doc","_id" : "1","_score" : 0.68324494,"_source" : {"title" : "中国是世界上人口最多的国家"}},{"_index" : "t1","_type" : "doc","_id" : "3","_score" : 0.5753642,"_source" : {"title" : "北京是中国的首都"}},{"_index" : "t1","_type" : "doc","_id" : "2","_score" : 0.39556286,"_source" : {"title" : "美国是世界上军事实力最强大的国家"}}]}
}

发现三篇文档都被返回,与我们的预期有偏差;这是因为 title 中的内容被拆分成一个个单独的字,而 id=2 的文档包含了 字也符合,所以也被返回了。es 自带的中文分词处理不太好用,后面可以使用 ik 中文分词器来处理。

3、match_phrase 查询短语

不过可以使用 match_phrase 来匹配短语,将上面的 match 换成 match_phrase 试试:

# 短语查询
GET t1/doc/_search
{"query": {"match_phrase": {"title": "中国"}}
}

查询结果:

{"took" : 2,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 2,"max_score" : 0.5753642,"hits" : [{"_index" : "t1","_type" : "doc","_id" : "1","_score" : 0.5753642,"_source" : {"title" : "中国是世界上人口最多的国家"}},{"_index" : "t1","_type" : "doc","_id" : "3","_score" : 0.5753642,"_source" : {"title" : "北京是中国的首都"}}]}
}

4、slop 间隔查询

当我们要查询的短语,中间有别的词时,可以使用 slop 来跳过。比如上述要查询 中国世界,这个短语中间被 隔开了,这时可以使用 slop 来跳过,相当于正则中的中国.*?世界

# 短语查询,查询中国世界,加 slop 
GET t1/doc/_search
{"query": {"match_phrase": {"title": {"query": "中国世界","slop": 1}}}
}

查询结果:

{"took" : 4,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 0.7445889,"hits" : [{"_index" : "t1","_type" : "doc","_id" : "1","_score" : 0.7445889,"_source" : {"title" : "中国是世界上人口最多的国家"}}]}
}

2.4 match_phrase_prefix 最左前缀查询

场景:当我们要查询的词只能想起前几个字符时

# 最左前缀查询,查询名字为 rose 的文档
GET h1/doc/_search
{"query": {"match_phrase_prefix": {"name": "ro"}}
}

查询结果:

{"took" : 1,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 0.2876821,"hits" : [{"_index" : "h1","_type" : "doc","_id" : "1","_score" : 0.2876821,"_source" : {"name" : "rose","gender" : "female","age" : 18,"tags" : ["白","漂亮","高"]}}]}
}

限制结果集

最左前缀查询很费性能,返回的是一个很大的集合,一般很少使用,使用的时候最好对结果集进行限制,max_expansions 参数可以设置最大的前缀扩展数量:

# 最左前缀查询
GET h1/doc/_search
{"query": {"match_phrase_prefix": {"gender": {"query": "fe","max_expansions": 1}}}
}

查询结果:

{"took" : 2,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 2,"max_score" : 0.2876821,"hits" : [{"_index" : "h1","_type" : "doc","_id" : "2","_score" : 0.2876821,"_source" : {"name" : "lila","gender" : "female","age" : 18,"tags" : ["黑","漂亮","高"]}},{"_index" : "h1","_type" : "doc","_id" : "1","_score" : 0.2876821,"_source" : {"name" : "rose","gender" : "female","age" : 18,"tags" : ["白","漂亮","高"]}}]}
}

2.5 multi_match 多字段查询

1、准备数据:

# 多字段查询
PUT t3/doc/1
{"title": "maggie is beautiful girl","desc": "beautiful girl you are beautiful so"
}PUT t3/doc/2
{"title": "beautiful beach","desc": "I like basking on the beach,and you? beautiful girl"
}

2、查询包含 beautiful 字段的文档:

GET t3/doc/_search
{"query": {"multi_match": {"query": "beautiful",				# 要查询的词"fields": ["desc", "title"]		# 要查询的字段}}
}

还可以当做 match_phrasematch_phrase_prefix使用,只需要指定type类型即可:

GET t3/doc/_search
{"query": {"multi_match": {"query": "gi","fields": ["title"],"type": "phrase_prefix"}}
}GET t3/doc/_search
{"query": {"multi_match": {"query": "girl","fields": ["title"],"type": "phrase"}}
}

3. term 查询

3.1 初始 es 的分析器

term 查询用于精确查询,但是不适用于 text 类型的字段查询。

在此之前我们先了解 es 的分析机制,默认的标准分析器会对文档进行:

  • 删除大多数的标点符号
  • 将文档拆分为单个词条,称为 token
  • token 转换为小写

最后保存到倒排序索引上,而倒排序索引用来查询,如 Beautiful girl 经过分析后是这样的:

POST _analyze
{"analyzer": "standard","text": "Beautiful girl"
}# 结果,转换为小写了
{"tokens" : [{"token" : "beautiful","start_offset" : 0,"end_offset" : 9,"type" : "<ALPHANUM>","position" : 0},{"token" : "girl","start_offset" : 10,"end_offset" : 14,"type" : "<ALPHANUM>","position" : 1}]
}

3.2 term 查询

1、准备数据:

# 创建索引,自定义 mapping,后面会讲到
PUT t4
{"mappings": {"doc":{"properties":{"t1":{"type": "text"    # 定义字段类型为 text}}}}
}PUT t4/doc/1
{"t1": "Beautiful girl!"
}PUT t4/doc/2
{"t1": "sexy girl!"
}

2、match 查询:

GET t4/doc/_search
{"query": {"match": {"t1": "Beautiful girl!"}}
}

经过分析后,会得到 beautiful、girl 两个 token,然后再去 t4 索引上去查询,会返回两篇文档:

{"took" : 1,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 2,"max_score" : 0.5753642,"hits" : [{"_index" : "t4","_type" : "doc","_id" : "1","_score" : 0.5753642,"_source" : {"title" : "Beautiful girl"}},{"_index" : "t4","_type" : "doc","_id" : "2","_score" : 0.2876821,"_source" : {"title" : "sex girl"}}]}
}

3、但是我们只想精确查询包含 Beautiful girl 的文档,这时就需要使用 term 来精确查询:

GET t4/doc/_search
{"query": {"term": {"title": "beautiful"}}
}

查询结果:

{"took" : 0,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 1,"max_score" : 0.2876821,"hits" : [{"_index" : "t4","_type" : "doc","_id" : "1","_score" : 0.2876821,"_source" : {"title" : "Beautiful girl"}}]}
}

注意:term 查询不适用于类型是 text 的字段,可以使用 match 查询;另外 Beautiful 经过分析后变为 beautiful,查询时使用 Beautiful 是查询不到的~

3.3 查询多个

精确查询多个字段:

GET t4/doc/_search
{"query": {"terms": {"title": ["beautiful", "sex"]}}
}

相关文章:

elasticsearch term match 查询

1. 准备数据 PUT h1/doc/1 {"name": "rose","gender": "female","age": 18,"tags": ["白", "漂亮", "高"] }PUT h1/doc/2 {"name": "lila","gender&quo…...

canal使用说明:MySQL、Redis实时数据同步

1. canal简介 canal是阿里开源的数据同步工具&#xff0c;基于bin log可以将数据库同步到其他各类数据库中&#xff0c;目标数据库支持mysql,postgresql,oracle,redis,MQ,ES等 canal分成服务端deployer和客户端adapter&#xff0c;我们可以部署多个&#xff0c;同时为了方便管…...

计算机视觉框架OpenMMLab开源学习(三):图像分类实战

前言&#xff1a;本篇主要偏向图像分类实战部分&#xff0c;使用MMclassification工具进行代码应用&#xff0c;最后对水果分类进行实战演示&#xff0c;本次环境和代码配置部分省略&#xff0c;具体内容建议参考前一篇文章&#xff1a;计算机视觉框架OpenMMLab开源学习&#x…...

awk命令

一.介绍 awk是专门为文本处理设计的编程语言&#xff0c;是一门数据驱动的编程语言。与sed类似&#xff0c;都是以数据驱动的行处理软件&#xff0c;主要用于数据扫描&#xff0c;过滤和汇总。数据可以来自于标准输入&#xff0c;管道或者文件。 二.语法 awk是一种处理文本文件…...

LocalDateTime获取时间的年、月、日、时、分、秒、纳秒

如何把String/Date转成LocalDateTime参考String、Date与LocalDate、LocalTime、LocalDateTime之间互转 String、Date、LocalDateTime、Calendar与时间戳之间互相转化参考String、Date、LocalDateTime、Calendar与时间戳之间互相转化 方法介绍 getYear() 获取日期的年 getMon…...

MoveIT Rviz和Gazebo联合仿真

文章目录环境安装概述ros_control框架ros_control数据流文件配置附加工具故障问题解决参考接前两篇&#xff1a;ROS MoveIT1&#xff08;Noetic&#xff09;安装总结 Solidworks导出为URDF用于MoveIT总结&#xff08;带prismatic&#xff09; MoveIT1 Assistant 总结 环境 Ubu…...

ESP32S2(12K)-DS18B20数码管显示温度

一、物料清单: NODEMCU-32-S2 (ESP32-12K)四段数码管(共阴)DS18B20(VCC/DQ/GND)Arduino-IDE 2.0.3二、实现方法及效果图: 2.1 引用库 // #include <OneWire.h> //可以不引入,因为DallasTemperature.h中已经引入了OneWire.h #include <DallasTemperature.h>#…...

linux栈溢出定位

一、编译选项定位堆栈溢出 来源&#xff1a;堆栈溢出检测机制 - SkrSky - 博客园 1、栈溢出可能打印 unhandled level 1 translation fault (11) at 0x7f8d0347, esr 0x92000005 2、栈溢出保护机制 gcc提供了栈保护机制stack-protector&#xff08;编译选项-fstack-protec…...

CSS基础:选择器和声明样式

CSS概念 CSS&#xff08;Cascading Style Sheets&#xff09;层叠样式表&#xff0c;又叫级联样式表&#xff0c;简称样式表 CSS用于HTML文档中元素样式的定义 使用css让网页具有美观一致的页面 语法 CSS 规则由两个主要的部分构成&#xff1a;选择器和声明样式 选择器通常…...

VS中安装gismo库

文章目录前言一、下载安装paraview直接下载压缩包安装就可以了解压后按步骤安装即可二、gismo库的安装gismo库网址第一种方法&#xff1a;第二种方法第三种方法&#xff1a;用Cmake软件直接安装首先下载cmake软件[网址](https://cmake.org/download/)安装gismo库三、gismo库的使…...

元学习方法解决CDFSL以及两篇SOTA论文讲解

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 带你学习跨域小样本系列1-简介篇 跨域小样本系列2-常用数据集与任务设定详解 跨域小样本系列3&#xff1a;元学习方法解决CDFSL以及两篇SOTA论文讲解&#xff08;本篇&#xff09; 跨域小样本系列4&#xf…...

大数据之------------数据中台

一、什么是数据中台 **数据中台是指通过数据技术&#xff0c;对海量数据进行采集、计算、存储、加工&#xff0c;同时统一标准和口径。**数据中台的目标是让数据持续用起来&#xff0c;通过数据中台提供的工具、方法和运行机制&#xff0c;把数据变为一种服务能力&#xff0c;…...

Python 中 字符串是什么?

字符串是 Python 中最常用的数据类型。我们可以使用引号 ( ’ 或 " ) 来创建字符串。 创建字符串很简单&#xff0c;只要为变量分配一个值即可。例如&#xff1a; var1 ‘Hello World!’ var2 “Python Runoob” Python 访问字符串中的值 Python 不支持单字符类型&…...

OJ刷题Day1 · 一维数组的动态和 · 将数字变成 0 的操作次数 · 最富有的客户资产总量 · Fizz Buzz · 链表的中间结点 · 赎金信

一、一维数组的动态和二、将数字变成 0 的操作次数三、最富有的客户资产总量四、Fizz Buzz五、链表的中间结点六、赎金信一、一维数组的动态和 给你一个数组 nums 。数组「动态和」的计算公式为&#xff1a;runningSum[i] sum(nums[0]…nums[i]) 。 请返回 nums 的动态和。 示…...

【数据结构】栈——必做题

逆波兰表达式后缀表达式的出现是为了方便计算机处理&#xff0c;它的运算符是按照一定的顺序出现&#xff0c;所以求值过程中并不需要使用括号来指定运算顺序&#xff0c;也不需要考虑运算符号&#xff08;比如加减乘除&#xff09;的优先级。先介绍中简单的人工转化方法&#…...

LearnOpenGL 笔记 - 入门 04 你好,三角形

系列文章目录 LearnOpenGL 笔记 - 入门 01 OpenGLLearnOpenGL 笔记 - 入门 02 创建窗口LearnOpenGL 笔记 - 入门 03 你好&#xff0c;窗口 文章目录系列文章目录前言你好&#xff0c;三角形顶点输入顶点着色器&#xff08;Vertex Shader&#xff09;编译着色器片段着色器&…...

keepalived+mysql高可用

一.设置mysql同步信息两节点安装msyql略#配置节点11.配置权限允许远程访问mysql -u root -p grant all on *.* to root% identified by Root1212# with grant option; flush privileges;2.修改my.cnf#作为主节点配置(节点1)#作为主节点配置 server-id 1 …...

JAVA工具篇--1 Idea中 Gradle的使用

前言&#xff1a; 既然我们已经使用Maven 来完成对项目的构建&#xff0c;为什么还要使用Gradle 进行项目的构建&#xff1b;gradle和maven都可以作为java程序的构建工具&#xff0c;但两者还是有很大的不同之处的&#xff1a;1.可扩展性&#xff0c;gradle比较灵活&#xff0c…...

弄懂自定义 Hooks 不难,改变开发认知有点不习惯

前言 我之前总结逻辑重用的时候&#xff0c;就一直在思考一个问题。 对于逻辑复用&#xff0c;render props 和 高阶组件都可以实现&#xff0c;同样官方说 Hooks 也可以实现&#xff0c;且还是在不增加额外的组件的情况下。 但是我在项目代码中&#xff0c;没有找到自定义 …...

Java面向对象基础

文章目录面向对象类注意事项内存机制构造器this关键字封装javabean格式成员变量和局部变量区别static静态关键字使用成员方法使用场景内存机制注意事项static应用&#xff1a;工具类static应用&#xff1a;代码块静态代码块实例代码块&#xff08;用的比较少&#xff09;static…...

ESP32上玩转LVGL8:手把手教你解决移植中的常见坑(含ST7735S适配)

ESP32与LVGL8深度适配实战&#xff1a;ST7735S显示驱动的优化与避坑指南 在嵌入式GUI开发领域&#xff0c;LVGL&#xff08;Light and Versatile Graphics Library&#xff09;因其轻量级和高度可定制性已成为开源图形库的佼佼者。当ESP32这颗物联网明星芯片遇上LVGL8&#xff…...

GCP 运维实战指南:从 CLI 基础到 Vertex AI 项目管理

gcloud CLI | 项目管理 | IAM 权限 | Vertex AI 授权 | 配额管理 | 资源清理 一、gcloud CLI 安装与配置 安装 # macOS brew install --cask google-cloud-sdk# Linux curl https://sdk.cloud.google.com | bash exec -l $SHELL# 验证 gcloud...

IC设计工程师必看:ESD测试四大组合详解与实战避坑指南

IC设计工程师必看&#xff1a;ESD测试四大组合详解与实战避坑指南 在集成电路设计领域&#xff0c;静电放电&#xff08;ESD&#xff09;防护能力是衡量芯片可靠性的关键指标之一。据统计&#xff0c;超过35%的芯片失效案例与ESD事件相关&#xff0c;而设计阶段的防护策略直接影…...

SAP选择屏幕下拉框实战:从VRM_SET_VALUES函数到完整配置流程

SAP选择屏幕下拉框实战&#xff1a;从VRM_SET_VALUES函数到完整配置流程 下拉框是SAP选择屏幕中最常用的交互元素之一&#xff0c;它能有效提升用户操作体验并减少输入错误。本文将深入解析如何利用VRM_SET_VALUES函数实现专业级下拉框功能&#xff0c;涵盖从基础配置到高级应用…...

3步开启智能歌词管理:告别手动搜索,拥抱高效音乐体验

3步开启智能歌词管理&#xff1a;告别手动搜索&#xff0c;拥抱高效音乐体验 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 你是否曾在深夜听到一首动人的歌曲&#xff…...

Keil5嵌入式开发场景联想:Cosmos-Reason1-7B辅助生成硬件驱动注释与调试思路

Keil5嵌入式开发场景联想&#xff1a;Cosmos-Reason1-7B辅助生成硬件驱动注释与调试思路 1. 引言&#xff1a;从嵌入式调试到AI辅助编程 如果你用过Keil5这类嵌入式开发工具&#xff0c;肯定对那种感觉不陌生&#xff1a;面对着一行行寄存器配置代码&#xff0c;或者一个复杂…...

Revit模型Web端免费展示:从IFC到GLTF,我踩过的坑和避坑指南

Revit模型Web端免费展示&#xff1a;从IFC到GLTF&#xff0c;我踩过的坑和避坑指南 去年接手一个老旧厂房改造项目时&#xff0c;甲方突然要求提供Web端三维模型展示。作为独立开发者&#xff0c;我花了三个月时间在IFC和GLTF格式之间反复横跳&#xff0c;电脑崩溃了27次&#…...

信息学奥赛必备:用C++手把手教你实现圆的计算(附OpenJudge/洛谷真题解析)

信息学奥赛必备&#xff1a;用C手把手教你实现圆的计算&#xff08;附OpenJudge/洛谷真题解析&#xff09; 在信息学竞赛的入门阶段&#xff0c;几何计算往往是选手们遇到的第一个"拦路虎"。其中&#xff0c;圆的相关计算因其数学公式的简洁性和编程实现的多样性&…...

MIPI CSI接口调试实战:从时序校准到稳定传输

1. MIPI CSI接口调试的核心挑战 第一次接触MIPI CSI接口调试时&#xff0c;我盯着示波器上那些跳动的波形完全摸不着头脑。明明按照手册配置了所有参数&#xff0c;为什么图像还是会出现随机噪点&#xff1f;后来才发现&#xff0c;高速串行接口的调试和传统并行总线完全是两个…...

代码知识图谱进阶实战(非常详细),GitNexus公共记忆系统从入门到精通,收藏这一篇就够了!

&#x1f980;在 GitHub 日榜登顶的 GitNexus&#xff0c;表面是一款代码智能引擎&#xff0c;本质上是用图结构沉淀知识、让协作永不失忆的基础设施。它不仅解决了“屎山代码看不懂”的问题&#xff0c;更给我们提供了一套构建可靠公共记忆系统的底层范式。 一、GitNexus 到底…...