es的java实战

简介: 【5月更文挑战第22天】Elasticsearch (ES) 是一个强大的分布式搜索和分析引擎,它可以处理大量的数据并支持复杂的搜索需求。

Elasticsearch (ES) 是一个强大的分布式搜索和分析引擎,它可以处理大量的数据并支持复杂的搜索需求。在 Java 应用中集成和使用 Elasticsearch,可以通过官方提供的 Java High Level REST Client 进行。这个客户端简化了与 Elasticsearch 交互的过程,提供了一个更高级别的抽象来执行搜索、索引、更新等操作。

下面是一个简单的 Elasticsearch Java 实战示例,包括如何连接到 Elasticsearch 集群、创建索引、添加文档、执行搜索查询等基本操作。


概念:

搜索原理:

以下是 Elasticsearch 搜索原理的几个关键点:

  1. 倒排索引 (Inverted Index): Elasticsearch 的核心是倒排索引,这是一种索引方法,用于存储一个词与出现该词的文档列表的映射。当文档被索引时,它首先会被分析(tokenized)成词(tokens),然后这些词会被添加到倒排索引中。这种索引结构使得全文搜索变得非常高效。
  2. 文档分析 (Document Analysis): 在将文档存储到索引之前,文档经过分析(Analysis)阶段,这个阶段涉及分词(Tokenization)、小写处理、停用词去除(Removing Stop Words)、词干提取(Stemming)等过程。这一步骤的目的是将文本转化为一组标准化的词(tokens),以便存储和检索。
  3. 查询执行 (Query Execution): 当执行搜索查询时,Elasticsearch 会先解析查询,确定需要搜索哪些字段,以及如何为搜索结果打分和排序。然后,它会使用倒排索引来快速定位包含查询词的文档。Elasticsearch 还支持复杂的查询,如布尔查询、短语查询、范围查询等。
  4. 相关性打分 (Relevance Scoring): Elasticsearch 使用一种名为 TF/IDF (词频/逆文档频率)的方法来评估文档与查询的相关性。此外,它还结合了向量空间模型和布尔模型等算法来进一步优化打分和排序。Elasticsearch 7.0 及以后版本默认使用 BM25 算法作为其相关性打分的基准。
  5. 分布式架构: Elasticsearch 是为分布式环境设计的,它可以将数据自动分片并分布在多个节点上,以保证数据的高可用性和扩展性。它也能够在节点之间自动平衡负载,确保查询的快速响应。在执行查询时,Elasticsearch 会并行地在多个分片上执行,然后聚合结果,以此提高查询效率。

总之,Elasticsearch 的搜索原理基于高效的倒排索引机制,结合了文档分析、分布式架构和复杂的查询执行策略,使得它能够快速、准确地对海量数据进行搜索和分析。


倒排索引的基本概念

倒排索引(Inverted Index),顾名思义,是一种将文档中所有出现的词汇(Token)与包含它们的文档列表进行映射的索引结构。这与传统的正向索引(文档到词汇的映射)相反。

建立倒排索引的流程

  1. 文档分析(Analysis):当文档被索引时,它首先会经过分析器(Analyzer)的处理。分析器由分词器(Tokenizer)和零个或多个过滤器(Filters)组成。这一步骤将文档文本拆分成一系列标准化的词(Tokens),可能还会进行小写转换、停用词过滤、词干提取等处理。
  2. 创建倒排列表:对于每一个词,维护一个包含该词出现的所有文档的列表,这个列表通常还会包含词在文档中出现的位置、在文档中出现的次数等信息。

倒排索引的结构

  • 词典(Dictionary):存储所有词的部分,通常为了快速访问,会在内存中维护一个高效的数据结构(如树结构)。
  • 倒排列表(Postings List):每个词对应一个倒排列表,记录了包含该词的所有文档的ID,以及该词在各个文档中的位置和频率等信息。

为什么使用倒排索引

倒排索引使得搜索引擎能够非常高效地处理复杂查询,包括词项查询、短语查询、布尔查询等。它允许直接访问包含查询词的文档,而无需遍历数据库中的所有文档。

Elasticsearch 中的优化

Elasticsearch 在倒排索引的基础上进行了进一步的优化,例如:

  • 分片(Sharding):自动将数据分散存储在多个节点上,以提高容量和并行处理能力。
  • 复制(Replication):提供数据的高可用性和读取操作的负载均衡。
  • 缓存:利用缓存机制来提高查询效率,如查询缓存、字段数据缓存等。

倒排索引是 Elasticsearch 实现快速全文搜索能力的关键技术。通过倒排索引,Elasticsearch 能够在处理大规模数据集时提供快速、准确的搜索结果。


实战:

环境准备

  1. 确保 Elasticsearch 正在运行,并可从你的应用程序访问。本示例假设你运行的是 Elasticsearch 7.x 或以上版本。
  2. 在项目中引入 Elasticsearch High Level REST Client 的依赖。如果你使用 Maven,可以在 pom.xml 文件中添加如下依赖:

xml复制代码

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.10.1</version>
</dependency>

请注意,版本号“7.10.1”应与你的 Elasticsearch 服务的版本相匹配,或者是兼容的版本。

连接 Elasticsearch

java复制代码

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

public class ESClient {

    public static RestHighLevelClient createClient() {
        return new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));
    }
}

创建索引

java复制代码

import org.elasticsearch.action.admin.indices.create.CreateIndexRequest;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;

public class CreateIndex {

    public static void main(String[] args) throws IOException {
        try (RestHighLevelClient client = ESClient.createClient()) {
            CreateIndexRequest request = new CreateIndexRequest("posts");
            CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
            System.out.println("Index Created");
        }
    }
}

索引文档

java复制代码

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;

import java.io.IOException;

public class IndexDocument {
    public static void main(String[] args) throws IOException {
        try (RestHighLevelClient client = ESClient.createClient()) {
            IndexRequest request = new IndexRequest("posts");
            String jsonString = "{" +
                    "\"user\":\"kimchy\"," +
                    "\"postDate\":\"2023-01-30\"," +
                    "\"message\":\"trying out Elasticsearch\"" +
                    "}";
            request.source(jsonString, XContentType.JSON);
            IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
            System.out.println("Document Indexed");
            System.out.println(indexResponse.toString());
        }
    }
}

搜索文档

java复制代码

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

public class SearchDocuments {
    public static void main(String[] args) throws IOException {
        try (RestHighLevelClient client = ESClient.createClient()) {
            SearchRequest searchRequest = new SearchRequest("posts");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());
            searchRequest.source(searchSourceBuilder);

            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println("Search Results");
            System.out.println(searchResponse.toString());
        }
    }
}

这只是 Elasticsearch 和 Java 集成的基础用法。Elasticsearch 提供了丰富的 API 和查询DSL(领域特定语言),支持复杂的搜索、聚合和数据分析等功能。在实际项目中,你可能需要根据具体需求调整连接配置、设计合理的索引结构、优化查询性能等。

请注意,随着 Elasticsearch 和它的 Java 客户端版本的更新,API 和功能也会发生变化。因此,建议参考官方最新文档,以获取最准确的指导和最佳实践。

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
5月前
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
323 119
|
7月前
|
缓存 前端开发 Java
基于最新 Java 技术栈的在线任务管理系统开发实战详解
本项目基于最新Java技术栈开发在线任务管理系统,涵盖任务创建、分配、跟踪、统计等功能。采用Spring Boot 3.2.x、React 18、PostgreSQL 16等主流技术,详解项目架构设计、核心功能实现及部署流程,助力掌握现代Java全栈开发技能。
439 6
|
7月前
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
1100 3
|
7月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
1492 1
|
6月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
765 0
|
7月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
374 8
|
6月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
548 100
|
7月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
7月前
|
消息中间件 Java 数据库
Java 基于 DDD 分层架构实战从基础到精通最新实操全流程指南
本文详解基于Java的领域驱动设计(DDD)分层架构实战,结合Spring Boot 3.x、Spring Data JPA 3.x等最新技术栈,通过电商订单系统案例展示如何构建清晰、可维护的微服务架构。内容涵盖项目结构设计、各层实现细节及关键技术点,助力开发者掌握DDD在复杂业务系统中的应用。
1421 0
|
8月前
|
监控 Java API
现代 Java IO 高性能实践从原理到落地的高效实现路径与实战指南
本文深入解析现代Java高性能IO实践,涵盖异步非阻塞IO、操作系统优化、大文件处理、响应式网络编程与数据库访问,结合Netty、Reactor等技术落地高并发应用,助力构建高效可扩展的IO系统。
249 0