es的java实战

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 【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 和功能也会发生变化。因此,建议参考官方最新文档,以获取最准确的指导和最佳实践。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
3天前
|
安全 Java 程序员
Java8实战-新的日期和时间API
Java8实战-新的日期和时间API
14 3
|
17小时前
|
设计模式 Java
一文掌握 Java 面向对象精髓:从类定义到对象实战
【6月更文挑战第15天】Java面向对象编程初学者指南:类是对象模板,如`Person`类含`name`和`age`属性。创建对象用`new`,如`Person person = new Person()`。访问属性如`person.name=&quot;Alice&quot;`,调用方法如`person.sayHello()`。类能继承,如`Student extends Person`。对象间共享数据可传参或共用引用。多态性允许父类引用调用子类方法。注意对象生命周期和内存管理,避免内存泄漏。通过实践和理解这些基础,提升编程技能。
|
1天前
|
Java 编译器 程序员
【实战攻略】Java高手教你如何灵活运用if-else和switch,提升代码效率!
【6月更文挑战第14天】本文探讨了Java中if-else和switch语句的巧妙运用,通过示例展示了如何提升代码效率和可读性。通过使用Map重构if-else结构,使代码更简洁易维护;利用switch处理枚举类型,实现清晰的代码结构。在性能方面,switch在选项少时占优,而现代JIT编译器优化后的if-else适用于大规模字符串比较。理解并灵活运用这两种控制结构,能助你在Java编程中写出高效、易读的代码。
|
1天前
|
监控 Java Spring
Java 动态代理详解与实战示例
Java 动态代理详解与实战示例
4 1
|
1天前
|
缓存 NoSQL Java
Java高并发实战:利用线程池和Redis实现高效数据入库
Java高并发实战:利用线程池和Redis实现高效数据入库
11 0
|
3天前
|
安全 Java 数据安全/隐私保护
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(二)
12 0
|
3天前
|
JSON 安全 Java
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
Java基础4-一文搞懂String常见面试题,从基础到实战,更有原理分析和源码解析!(一)
10 0
|
3天前
|
安全 算法 Java
Java8实战-用Optional取代null
Java8实战-用Optional取代null
4 0
|
3天前
|
设计模式 Java 测试技术
Java8实战-默认方法
Java8实战-默认方法
5 2
|
3天前
|
设计模式 Java 测试技术
Java8实战-重构、测试和调试(二)
Java8实战-重构、测试和调试(二)
7 2