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

【Elasticsearch】 复合查询

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

在这里插入图片描述


在这里插入图片描述

【Elasticsearch】 复合查询

文章目录

  • 【Elasticsearch】 复合查询
    • 引言
    • 1. Elasticsearch Java 客户端简介
      • 1.1 Maven 依赖
      • 1.2 客户端初始化
    • 2. Bool 查询详解
      • 2.1 Bool 查询的基本结构
      • 2.2 Java 代码示例
      • 2.3 Bool 查询的高级用法
    • 3. 其他复合查询类型
      • 3.1 Constant Score 查询
        • 3.1.1 Java 代码示例
      • 3.2 Dis Max 查询
        • 3.2.1 Java 代码示例
    • 4. 总结
    • 参考资料

引言

在现代的大数据时代,Elasticsearch 已经成为了一个不可或缺的搜索引擎工具,广泛应用于日志分析、全文搜索、实时数据分析等场景。作为一个基于 Lucene 的分布式搜索引擎,Elasticsearch 提供了强大的搜索能力,尤其是在处理复杂查询时,其灵活的查询 DSL(Domain Specific Language)使得开发者能够轻松构建各种复杂的查询逻辑。

在 Elasticsearch 中,复合查询Compound Queries)是一类非常重要的查询类型,它允许开发者将多个子查询组合在一起,形成一个更复杂的查询逻辑。其中,bool 查询 是最常用的复合查询之一,它通过 mustshouldmust_not 等子句,能够灵活地组合多个查询条件,实现诸如“与”、“或”、“非”等逻辑操作。

本文将深入探讨 Elasticsearch 中的复合查询,特别是 bool 查询 的使用方法,并结合实际的 Java 代码示例,展示如何在实际开发中灵活运用这些查询类型。此外,我们还将介绍其他常见的复合查询类型,如 constant_score 查询dis_max 查询,帮助开发者根据实际需求选择合适的查询方式。

1. Elasticsearch Java 客户端简介

在开始深入探讨复合查询之前,我们首先需要了解如何在 Java 项目中使用 Elasticsearch。Elasticsearch 提供了官方的 Java 客户端库,开发者可以通过 Maven 或 Gradle 将其引入到项目中。

1.1 Maven 依赖

要在 Java 项目中使用 Elasticsearch,首先需要在 pom.xml 文件中添加以下 Maven 依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.17.0</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>7.17.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.17.1</version>
</dependency>

这些依赖项包括了 Elasticsearch 的高级 REST 客户端、核心库以及日志框架 Log4j。通过这些依赖项,开发者可以在 Java 项目中轻松地与 Elasticsearch 集群进行交互。

1.2 客户端初始化

在使用 Elasticsearch 客户端之前,首先需要初始化一个 RestHighLevelClient 实例。以下是一个简单的初始化示例:

import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;

public class ElasticsearchClient {
    private static RestHighLevelClient client;

    public static RestHighLevelClient getClient() {
        if (client == null) {
            RestClientBuilder builder = RestClient.builder(
                new HttpHost("localhost", 9200, "http")
            );
            client = new RestHighLevelClient(builder);
        }
        return client;
    }
}

在这个示例中,我们创建了一个 RestHighLevelClient 实例,并配置了连接到本地 Elasticsearch 集群的地址和端口。

2. Bool 查询详解

Bool 查询 是 Elasticsearch 中最常用的复合查询类型之一。它允许开发者通过 mustshouldmust_not 等子句,将多个查询条件组合在一起,形成一个复杂的查询逻辑。

2.1 Bool 查询的基本结构

Bool 查询的基本结构如下:

{
  "query": {
    "bool": {
      "must": [],
      "should": [],
      "must_not": [],
      "filter": []
    }
  }
}
  • must:查询条件必须满足,相当于逻辑“与”。
  • should:查询条件可以满足,相当于逻辑“或”。
  • must_not:查询条件必须不满足,相当于逻辑“非”。
  • filter:与 must 类似,但不参与评分。

2.2 Java 代码示例

以下是一个使用 Java 客户端构建 Bool 查询的示例:

import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.builder.SearchSourceBuilder;

public class BoolQueryExample {
    public static void main(String[] args) {
        RestHighLevelClient client = ElasticsearchClient.getClient();

        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.matchQuery("title", "Elasticsearch"));
        boolQuery.should(QueryBuilders.matchQuery("content", "Java"));
        boolQuery.mustNot(QueryBuilders.matchQuery("status", "deleted"));

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.query(boolQuery);

        SearchRequest searchRequest = new SearchRequest("my_index");
        searchRequest.source(sourceBuilder);

        try {
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println(searchResponse.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

在这个示例中,我们构建了一个 Bool 查询,要求文档的 title 字段必须包含 “Elasticsearch”,content 字段可以包含 “Java”,并且 status 字段不能为 “deleted”。

2.3 Bool 查询的高级用法

Bool 查询不仅可以嵌套其他查询类型,还可以嵌套自身,从而实现更复杂的查询逻辑。例如:

BoolQueryBuilder nestedBoolQuery = QueryBuilders.boolQuery();
nestedBoolQuery.must(QueryBuilders.matchQuery("author", "John Doe"));
nestedBoolQuery.should(QueryBuilders.matchQuery("tags", "tech"));

boolQuery.must(nestedBoolQuery);

在这个示例中,我们创建了一个嵌套的 Bool 查询,并将其作为外层 Bool 查询的 must 条件。

3. 其他复合查询类型

除了 Bool 查询,Elasticsearch 还提供了其他几种常用的复合查询类型,如 constant_score 查询dis_max 查询

3.1 Constant Score 查询

Constant Score 查询 是一种将查询结果的得分固定为指定值的查询类型。它通常用于过滤查询,不关心文档的得分,只关心文档是否匹配。

3.1.1 Java 代码示例
import org.elasticsearch.index.query.ConstantScoreQueryBuilder;

ConstantScoreQueryBuilder constantScoreQuery = QueryBuilders.constantScoreQuery(
    QueryBuilders.termQuery("status", "active")
).boost(2.0f);

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(constantScoreQuery);

SearchRequest searchRequest = new SearchRequest("my_index");
searchRequest.source(sourceBuilder);

try {
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println(searchResponse.toString());
} catch (IOException e) {
    e.printStackTrace();
}

在这个示例中,我们创建了一个 Constant Score 查询,将 status 字段为 “active” 的文档得分固定为 2.0。

3.2 Dis Max 查询

Dis Max 查询 是一种用于在多个字段中查找最佳匹配的查询类型。它会将多个查询的结果进行合并,并返回得分最高的文档。

3.2.1 Java 代码示例
import org.elasticsearch.index.query.DisMaxQueryBuilder;

DisMaxQueryBuilder disMaxQuery = QueryBuilders.disMaxQuery();
disMaxQuery.add(QueryBuilders.matchQuery("title", "Elasticsearch"));
disMaxQuery.add(QueryBuilders.matchQuery("content", "Java"));
disMaxQuery.tieBreaker(0.7f);

SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(disMaxQuery);

SearchRequest searchRequest = new SearchRequest("my_index");
searchRequest.source(sourceBuilder);

try {
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.println(searchResponse.toString());
} catch (IOException e) {
    e.printStackTrace();
}

在这个示例中,我们创建了一个 Dis Max 查询,分别在 titlecontent 字段中查找最佳匹配的文档,并设置了 tieBreaker 参数来控制得分计算。

4. 总结

通过本文的介绍,我们深入探讨了 Elasticsearch 中的复合查询,特别是 bool 查询 的使用方法。我们还介绍了其他常见的复合查询类型,如 constant_score 查询dis_max 查询,并通过实际的 Java 代码示例展示了如何在实际开发中灵活运用这些查询类型。

掌握这些复合查询的使用方法,将帮助开发者更好地应对复杂的搜索需求,提升应用的搜索性能和用户体验。

参考资料

  1. Elasticsearch 官方文档
  2. Elasticsearch Java 高级 REST 客户端文档
  3. Elasticsearch 复合查询官方指南

http://www.kler.cn/a/500342.html

相关文章:

  • 【微服务】SpringBoot 整合Redis实现延时任务处理使用详解
  • 深入Android架构(从线程到AIDL)_21 IPC的Proxy-Stub设计模式03
  • 前端开发:HTML常见标签
  • Linux第一个系统程序---进度条
  • 使用sqlplus的easy connect时如何指定是链接到shared server还是dedicated process
  • 【Notepad++】Notepad++如何删除包含某个字符串所在的行
  • 贪心算法汇总
  • NLP文本数据增强全攻略:从回译到多样化策略,全面提升模型表现!
  • 8 事件等待
  • Windows下调试Dify相关组件(1)--前端Web
  • 2024版idea 插件无法加载
  • C#中通道(Channels)的应用之(生产者-消费者模式)
  • 微商关系维系与服务创新:链动2+1模式、AI智能名片与S2B2C商城小程序的应用研究
  • AI刷题-数列推进计算任务、数组中的幸运数问题
  • 【复习小结】1-13
  • [ Spring ] Install MongoDB on Ubuntu24
  • windows及linux 安装 Yarn 4.x 版本
  • 记录一个在增量更新工具类
  • SpringBoot操作spark处理hdfs文件
  • 第432场周赛:跳过交替单元格的之字形遍历、机器人可以获得的最大金币数、图的最大边权的最小值、统计 K 次操作以内得到非递减子数组的数目
  • IDEA中创建maven项目
  • Redis之秒杀活动
  • django基于Python的智能停车管理系统
  • 限制图层列表
  • (2025,Cosmos,世界基础模型 (WFM) 平台,物理 AI,数据处理,分词器,世界基础模型预训练/后训练,3D一致性)
  • 【JVM-1】深入解析JVM:Java虚拟机的核心原理与工作机制