【Elasticsearch】八种Query搜索类型详解

🧑 博主简介:CSDN博客专家 ,历代文学网 (PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索"历代文学 ")总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作 请加本人wx(注明来自csdn ):foreast_sea


【Elasticsearch】八种Query搜索类型详解

一、引言

在当今数据驱动的时代,数据的高效搜索和检索成为了许多应用程序的核心需求。Elasticsearch作为一款强大的开源搜索和分析引擎,以其分布式 、高可用 、实时性 等诸多优势,在日志分析 、全文搜索 、数据挖掘等众多领域得到了广泛的应用。

Elasticsearch提供了多种搜索类型,每种搜索类型都有其独特的功能和适用场景。理解这些搜索类型对于充分发挥Elasticsearch的能力至关重要。例如,在一个电商平台中,我们可能需要精确查询某个商品的特定属性(如商品ID ),这时候就可能用到TermQuery;而如果要进行模糊搜索,比如搜索包含某个关键词的商品描述,可能就需要其他的搜索类型。再比如,在处理复杂的业务逻辑查询时,可能会用到BoolQuery来组合多个查询条件。

无论是简单的单一条件搜索,还是复杂的多条件组合搜索,Elasticsearch的搜索类型都能提供相应的解决方案。通过深入学习这些搜索类型,开发者能够构建出更加高效、精准的搜索功能,提升用户体验。接下来,我们将详细介绍Elasticsearch中的各种搜索类型。

二、Elasticsearch八种搜索类型

1. MatchQuery

  • 作用
    • 这是一种全文搜索查询,它会对输入的文本进行分析(例如分词),然后在索引中查找匹配的文档。它可以处理文本字段,并且在处理自然语言查询时非常有用。
  • 应用场景
    • 适用于搜索文章内容、产品描述等文本字段。例如在一个新闻网站中搜索包含特定关键词的新闻文章,或者在电商平台上搜索包含某个关键词的产品描述。
  • 代码示例
java 复制代码
// 假设已经创建了Elasticsearch客户端对象RestHighLevelClient client
// 创建MatchQuery
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("content", "keyword");
// content是索引中的字段名,keyword是要搜索的关键词
SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(matchQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 执行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

2. TermQuery

  • 作用
    • 用于精确匹配索引中的某个词条。它不会对输入进行分析,直接在倒排索引中查找完全匹配的词条。
  • 应用场景
    • 当需要精确查询某个字段的值时,如查询某个产品的唯一标识符(ID),或者查询具有特定状态(如"active"或"inactive")的文档。
  • 代码示例
java 复制代码
// 创建TermQuery
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("product_id", "12345");
// product_id是索引中的字段名,12345是要精确匹配的值
SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(termQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 执行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

3. RangeQuery

  • 作用
    • 用于查询某个字段的值在指定范围内的文档。可以用于数字、日期等类型的字段。
  • 应用场景
    • 在查询某个时间段内的日志记录,或者查询价格在某个区间内的产品等场景中非常有用。
  • 代码示例
java 复制代码
// 创建RangeQuery
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("price");
rangeQueryBuilder.gte(10.0);
rangeQueryBuilder.lte(100.0);
// price是索引中的字段名,这里查询价格在10到100之间的产品
SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(rangeQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 执行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

4. BoolQuery

  • 作用
    • 用于组合多个查询条件。可以实现逻辑与(must)、逻辑或(should)和逻辑非(must_not)的操作。
  • 应用场景
    • 在处理复杂的查询需求时,例如查询既满足某个条件又满足另一个条件的文档(逻辑与),或者满足其中一个条件即可的文档(逻辑或)等情况。
  • 代码示例
java 复制代码
// 创建BoolQuery
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// 逻辑与操作
MatchQueryBuilder matchQuery1 = QueryBuilders.matchQuery("field1", "value1");
MatchQueryBuilder matchQuery2 = QueryBuilders.matchQuery("field2", "value2");
boolQueryBuilder.must(matchQuery1);
boolQueryBuilder.must(matchQuery2);
// 逻辑或操作
MatchQueryBuilder matchQuery3 = QueryBuilders.matchQuery("field3", "value3");
boolQueryBuilder.should(matchQuery3);
// 逻辑非操作
TermQueryBuilder termQuery = QueryBuilders.termQuery("field4", "value4");
boolQueryBuilder.must_not(termQuery);

SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 执行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

5. PrefixQuery

  • 作用
    • 用于查找某个字段以指定前缀开始的文档。
  • 应用场景
    • 在搜索以某个特定字符或字符串开头的词条时很有用,例如搜索以"abc"开头的产品名称。
  • 代码示例
java 复制代码
// 创建PrefixQuery
PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("product_name", "abc");
// product_name是索引中的字段名,abc是要匹配的前缀
SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(prefixQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 执行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

6. WildcardQuery

  • 作用
    • 支持通配符查询,可以使用?和*来匹配单个字符和多个字符。
  • 应用场景
    • 在需要进行模糊匹配且通配符规则适用的情况下,例如搜索包含特定模式的文件路径或者产品名称。
  • 代码示例
java 复制代码
// 创建WildcardQuery
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("file_path", "/*.txt");
// file_path是索引中的字段名,/*.txt是通配符表达式,表示查找以.txt结尾的文件路径
SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(wildcardQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 执行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

7. FuzzyQuery

  • 作用
    • 用于进行模糊搜索,它会根据编辑距离来查找与输入词条相似的文档。
  • 应用场景
    • 在处理用户可能输入错误的搜索词时非常有用,例如用户输入了近似正确的单词,仍然可以找到相关的文档。
  • 代码示例
java 复制代码
// 创建FuzzyQuery
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("keyword_field", "approximate_keyword");
// keyword_field是索引中的字段名,approximate_keyword是近似的关键词
SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(fuzzyQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 执行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

8. IdsQuery

  • 作用
    • 用于根据文档的ID来查询特定的文档。
  • 应用场景
    • 当已经知道要查询的文档的ID时,可以直接使用这个查询类型来获取文档。
  • 代码示例
java 复制代码
// 创建IdsQuery
IdsQueryBuilder idsQueryBuilder = QueryBuilders.idsQuery();
idsQueryBuilder.addIds("doc_id_1", "doc_id_2");
// doc_id_1和doc_id_2是要查询的文档的ID
SearchRequest searchRequest = new SearchRequest("your_index_name");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(idsQueryBuilder);
searchRequest.source(searchSourceBuilder);
// 执行搜索
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

三、Maven依赖

在Java项目中使用Elasticsearch,需要添加相应的Maven依赖。

对于Elasticsearch的高级客户端(RestHighLevelClient),我们需要添加以下依赖:

xml 复制代码
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.17.3</version>
</dependency>

这个依赖允许我们使用Java代码与Elasticsearch进行交互,执行诸如索引创建、文档搜索等操作。它内部依赖于Elasticsearch的REST API,通过HTTP协议与Elasticsearch集群进行通信。

同时,我们还需要添加Elasticsearch的核心依赖,因为高级客户端依赖于核心库中的一些类和功能:

xml 复制代码
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.17.3</version>
</dependency>

此外,为了处理JSON数据(Elasticsearch使用JSON格式进行数据交互),我们可能需要添加JSON处理库的依赖,如Jackson:

xml 复制代码
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>

这些依赖协同工作,使得我们能够在Java项目中顺利地使用Elasticsearch的各种功能,包括不同的搜索类型。

四、参考资料文献

  1. Elasticsearch官方文档
  2. 《Elasticsearch实战》书籍
  3. Elasticsearch相关博客文章
相关推荐
远方16096 分钟前
118-五大进程LGWR DBWn CKPT SMON PMON 与存储故障-文件系统对照
大数据·数据库·sql·oracle·database
远方160914 分钟前
119-Oracle CDB 下修改和重置 SYS SYSTEM密码记录
大数据·数据库·sql·oracle·database
大大大大晴天️18 分钟前
每天认识一个组件:Elasticsearch
大数据·elasticsearch
yyk3332423 分钟前
Spark介绍
大数据·分布式·spark
科创致远26 分钟前
第一代 e+SOP 盒子配显示器实测:物美价廉的产线可视化方案
大数据·网络·人工智能·信息可视化·计算机外设·制造·精益工程
ruxshui32 分钟前
Hadoop 生产运维实战手册
大数据·运维·hadoop
QYR-分析35 分钟前
汽车可开启全景天窗:座舱舒适核心配置,智能化升级打开产品溢价空间
大数据·人工智能·汽车
Raas1001 小时前
2026年AI网关推荐?MAI Gateway(魔芋企业级AI网关)等主流方案横评
大数据·人工智能·ai·gateway·ai网关·mai gateway
泡干脆面就番茄1 小时前
Hive窗口函数:从原理到三大面试题
大数据·数据仓库·hive·hadoop
一个热爱拳击的玩家1 小时前
本地实体如何构建面向 AI 检索的信任链?以杭州拳击行业案例分析
大数据·人工智能·信任链