Elasticsearch 精确查询:术语查询、多术语查询、主键查询、范围查询、存在查询、前缀查询、正则查询与通配符查询

news/2024/11/14 15:07:14/

为了深入理解Elasticsearch的各种精确查询方法,我们将通过一系列示例来演示术语查询、多术语查询、主键查询、范围查询、存在查询、前缀查询、正则查询和通配符查询的应用场景。首先,我们为示例准备一组数据:

POST person/_doc/1
{"id": "1","sex": true,"name": "张三","born": "2020-09-18 00:02:20","location": {"lat": 41.12,"lon": -71.34}
}POST person/_bulk
{"index":{"_id":"3"}}
{"id":"3","name":"王五","sex":true,"born":"2020-09-14 00:02:20","location":{"lat":11.12,"lon":-71.34}}
{"index":{"_id":"4"}}
{"id":"4","name":"李四","sex":false,"born":"2020-10-14 00:02:20", "location":{"lat":11.12,"lon":-71.34}}
{"index":{"_id":"5"}}
{"id":"5","name":"黄六","sex":false,"born":"2020-11-14 00:02:20", "location":{"lat":11.12,"lon":-71.34}}
POST person/_bulk
{"index":{"_id":"2"}}
{"id":"2","name":"赵二","sex":true,"born":"2020-09-14 00:02:20","location":{"lat":11.12,"lon":-71.34}}
{"update":{"_id":"5"}}
{ "doc" : {"sex" : "false","born" : "2020-01-01 00:02:20"} }
{"delete":{"_id":"5"}}

接下来,我们将逐一展示各类查询方法的使用。

术语查询(Term Query)

术语查询用于匹配字段中确切的单个值。例如,查找名为“张三”的人:

POST person/_search
{"query": {"term": {"name.keyword": {"value": "张三"}}}
}

多术语查询(Terms Query)

多术语查询允许同时匹配多个确切值。查找名为“张三”或“王五”的人:

POST person/_search
{"query": {"terms": {"name.keyword": ["张三","王五"]}}
}

主键查询(IDs Query)

主键查询通过文档ID直接查找特定文档。查找ID为“1”和“2”的文档:

POST person/_search
{"query": {"ids": {"values": ["1","2"]}}
}

范围查询(Range Query)

范围查询用于筛选出某个字段值在指定区间内的文档。查找出生日期在“2020年9月11日至9月13日”之间的人员:

POST person/_search
{"query": {"range": {"born": {"gte": "2020/09/11 00:00:00","lte": "2020/09/13 00:00:00","format": "yyyy/MM/dd HH:mm:ss"}}}
}POST person/_search
{"query": {"range": {"born": {"gte": "2020/09/11 08:00:00","lte": "2020/09/13 08:00:00","format": "yyyy/MM/dd HH:mm:ss","time_zone": "+08:00"}}}
}

存在查询(Existence Query)

存在查询用于筛选出具有特定字段的文档。在以下示例中,我们首先为文档添加“age”字段,然后查找包含该字段的文档:

POST person/_doc/5
{"id": "5","sex": true,"name": "刘大","born": "2020-02-18 00:02:20","age": 20,"location": {"lat": 21.12,"lon": -71.34}
}POST person/_doc/5
{"id": "5","sex": true,"name": "刘大","born": "2020-02-18 00:02:20","age": 20,"location": {"lat": 21.12,"lon": -71.34}
}POST person/_search
{"query": {"exists": {"field": "age"}}
}

前缀查询(Prefix Query)

前缀查询适用于查找字段值以特定前缀开头的文档。首先创建一个索引并设置“address”字段启用前缀索引,然后插入示例数据,最后进行前缀查询:

PUT prefix-test
{"mappings": {"properties": {"address": {"type": "text","index_prefixes": {"min_chars" : 1,"max_chars" : 5}}}}
}PUT prefix-test/_bulk
{"index":{"_id":"1"}}
{"id":"1","address":"wuhan qingshan"}
{"index":{"_id":"2"}}
{"id":"2","address":"guangzhou baiyun"}
{"index":{"_id":"3"}}
{"id":"3","address":"beijing chaoyang"}POST prefix-test/_search
{"query": {"prefix": {"address": {"value": "baiy"}}}
}

请注意,如果字段类型为keyword而非text,则不能使用index_prefixes参数。keyword字段的前缀搜索会比较耗费性能,不宜大量使用。

正则查询(Regexp Query)

正则查询利用正则表达式模式匹配字段值。查找名字中包含“大”字的人:

POST person/_search
{"query": {"regexp": {"name.keyword": ".*大.*"}}
}

通配符查询(Wildcard Query)

通配符查询使用通配符字符(如?*)匹配字段值。查找名字以任意单个字符后接“大”字的人:

POST person/_search
{"query": {"wildcard": {"name.keyword": "?大"}}
}

正则查询和通配符查询虽然使用简便,但其性能开销较大,大量使用时需谨慎。

以上就是Elasticsearch中常用的精确查询方法,包括术语查询、多术语查询、主键查询、范围查询、存在查询、前缀查询、正则查询和通配符查询的示例。根据实际需求选择合适的查询类型,可以高效地从Elasticsearch索引中检索所需数据。


http://www.ppmy.cn/news/1440063.html

相关文章

【Node.js】03 —— HTTP 模块探索

🌟Node.js之HTTP模块探索✨ 🌟引言 在网络编程中,HTTP协议无处不在。在Node.js的世界里,我们可以通过内置的http模块来轻松创建HTTP服务器和客户端,实现数据的接收和发送。今天就让我们一起打开这扇门,探索…

05_Scala运算符

文章目录 **1.Scala运算符****2.scala中没有 --等语法****3.逻辑运算符和Java完全相同****4.scala认为万物皆对象** 1.Scala运算符 Scala底层 使用的是equals() 程序员比较两个量的时候,谁来没事比较内存地址? Java中引用数据类型比较地址&#xff0…

人工智能对数据分析领域的影响是什么?

人工智能(AI)对数据分析领域的影响深远且不断演进。这一领域的技术革新和应用拓展正在推动数据分析从传统的基于规则的方法转变为基于机器学习和深度学习的自动化方法。 人工智能极大地提高了数据分析的效率和准确性。传统的数据分析通常依赖于分析师的…

13 c++版本的五子棋

前言 呵呵 这大概是 大学里面的 c 五子棋了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 然后 貌似 放在 win10 上面执行 还有一些问题, 渲染的, 应该很好调整 五子棋 #include<Windows.h> #include<io…

网页提示语闪太快的定位问题(selenium)

selenium UI自动化时&#xff0c;提示语闪太快&#xff0c;导致无法获取元素的问题 解决办法 步骤一&#xff1a; F12---》控制台输入debugger 步骤二&#xff1a;对于需要定位的部分&#xff0c;在控制台的debugger处回车&#xff0c;可以定住页面 步骤三&#xff1a;正常定…

ES6 Module 的加载实现,浏览器加载,ES6 模块与 CommonJS 模块具体解析(2024-04-23)

目录 1、浏览器加载 1.2 加载规则 1.3 ES6 模块与 CommonJS 模块的差异 2、Node.js 的模块加载方法 2.1 概述 2.1.1 package.json 的 main 字段 2.1.2 package.json 的 exports 字段 &#xff08;1&#xff09;子目录别名 &#xff08;2&#xff09;main 的别名 &…

Java设计模式_适配器模式

基础 适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许接口不兼容的类能够一起工作。适配器模式通过创建一个包装类来实现这种兼容性&#xff0c;这个包装类包含了需要的目标接口&#xff0c;并持有一个适配者对象&#xff0c;以便进…

跨设备自动化协同提效新利器!边缘自动化流程编排工具

痛点剖析 随着企业生产环境的日益复杂化&#xff0c;不同生产设备间的协调性问题尤为凸显。 1、不同设备往往基于各自的技术标准、通信协议和操作系统设计&#xff0c;这使得它们之间的数据交换和指令传递存在显著的障碍。 2、技术上的不兼容性导致设备间难以实现无缝对接和…