微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 微服务SpringCloud ES分布式全文搜索引擎简介 下载安装及简单操作入门

Elasticsearch

ES简介

Elasticsearch(简称ES)是一个开源的分布式搜索和分析引擎,常用于全文搜索、日志存储和分析等场景。它构建在Apache Lucene搜索引擎库之上,提供了一个分布式的多租户能力,支持大规模的数据处理。

主要特性和用途

  1. 全文搜索: Elasticsearch 是为了高效地进行全文搜索而设计的。它支持快速的文本搜索、复杂的查询、高亮显示匹配文本等功能。这使得它在许多应用中被广泛应用,例如电子商务平台的产品搜索、新闻网站的文章检索等。
  2. 实时数据分析: Elasticsearch 可以处理大规模的实时数据分析任务。通过将结构化和非结构化数据索引到Elasticsearch中,用户可以执行复杂的数据分析、聚合和可视化操作,支持企业的数据分析需求。
  3. 分布式和高可用性: Elasticsearch 是一个分布式系统,数据被分布在多个节点上,每个节点可以处理部分查询和数据操作。它具有内置的容错和高可用机制,通过复制和分片技术实现数据的高可用性和水平扩展。
  4. 实时数据处理: Elasticsearch 支持实时数据写入和检索,因此非常适合需要快速存储和检索数据的应用场景,如实时日志处理和监控系统。
  5. 多种数据类型支持: Elasticsearch 不仅仅支持文本数据的索引和搜索,还可以处理地理空间数据、结构化数据等。它提供了丰富的数据类型和灵活的映射机制,使得能够存储和处理各种类型的数据。
  6. 开放的生态系统: Elasticsearch 生态系统丰富,与许多常见的数据存储、数据处理工具和流行的编程语言集成良好。它还支持插件系统和强大的API,使得可以轻松扩展和定制功能。

应用场景

  • 搜索引擎:用于构建复杂的全文搜索引擎,如电商平台的产品搜索、新闻聚合网站的内容搜索等。
  • 日志和指标分析:通过存储和分析大量的日志数据,支持实时监控和分析系统性能和运行状况。
  • 业务分析:支持企业对大数据的实时查询和分析,帮助做出数据驱动的决策。
  • 安全分析:用于实时分析网络安全事件和入侵检测。
  • 地理信息系统:处理和分析地理空间数据,支持地理位置查询和可视化分析。

总之,Elasticsearch 是一个功能强大的搜索和分析引擎,适用于处理大规模数据的搜索、分析和实时数据处理需求。

分布式全文搜索引擎

我们天天在用ES

搜索的时候

要与多个信息进行匹配查找

然后返回给用户

首先

ES会将数据库中的信息

先进行一个拆分

这个叫做分词

是按照词语关键词拆的

然后就能进行搜索的时候匹配对应的id

每一个关键字对应若干id

每一个id对应数据

然后搜索的时候展示简化版数据

点击简化版数据反映全部信息属于的是全文搜索

在数据库中有索引

在ES中也有索引

但是根据关键字查ID 再由ID查数据

这个在全文搜索里叫倒排索引

倒排索引是怎么出现的呢

是根据创建文档 出现一个一个的库

然后我们进行查找的时候就是在使用这个库,使用文档

ES的下载和安装

下载地址

Download Elasticsearch | Elastic

下载好了

内置

有个jdk17

250MB左右

总大小600MB

双击初始化

文件: elasticsearch.bat

查找端口

访问本地地址

http://localhost:9200/

http://localhost:9200/

即可访问到

成功监测访问成功 部署成功

ES索引操作

ES没有数据库的概念

只有索引

我们可以把ES里的索引理解成数据库

用postman进行测试操作

创建一个名字叫books的索引

数据库

表示本次操作成功

索引不允许重复创建

如果再次创建就会报错

我们可以进行查询

用get进行查询

返回结果

代表查询成功

同样的我们通过不同的请求操作

能完成对索引的不同操作

需要的是路径和请求一一对应

幂等性是指一个操作或函数被多次应用后所产生的效果与一次应用时的效果相同的性质。换句话说,如果对同一个对象或系统进行一次或多次操作,最终的状态或结果都是一致的,那么这个操作就是幂等的。

在Web开发中,HTTP方法如GET、PUT、DELETE等应该是幂等的。例如,无论你调用一次还是多次相同的HTTP PUT请求,资源的状态应该是相同的。

这个地方就是放索引的分词信息的

我们下载一个分词器

看看

我们把他放到es的plugins目录下

相当于是装了一个插件

这时候我们要重新启动我们的ES

如果版本一致并且plugins文件夹下只有ik文件夹 即可启动成功

接下来我们就要去使用了

我们在postman里指定路径 在后面跟上一请求体的信息

在postman里写请求体

{
    "mappings":{
        "properties":{
            "id":{
                "type":"keyword",
                 "analyzer":"ik_max_word"
            },
            "name":{
                "type":"text",
                "analyzer":"ik_max_word"
            },
            "type":{
                "type":"keyword"
            }
        }
    }
}

发送后即创建成功

让索引挂上设定

然后数据进来的时候就会进行操作

小结

实际操作

添加依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.17.0</version> <!-- 替换为您使用的 Elasticsearch 版本 -->
</dependency>
总结

这段代码是一个 Maven 依赖配置,用于在 Java 项目中引入 Elasticsearch 的高级 REST 客户端库。让我们逐行解释每个部分的含义:

  1. <dependency>: 这是 Maven POM 文件中用来声明项目依赖的标签,告诉 Maven 构建工具需要获取和管理哪些库和版本。
  2. <groupId>: 指定了依赖库的组织或者项目组的唯一标识符。在这里,org.elasticsearch.client 表示 Elasticsearch 官方客户端的组织。
  3. <artifactId>: 指定了具体的库或者项目的名称。在这里,elasticsearch-rest-high-level-client 是 Elasticsearch 的高级 REST 客户端库,它提供了更高级别的 API 接口来与 Elasticsearch 集群进行交互。
  4. <version>: 指定了要使用的库的版本号。在这里,7.17.0 是 Elasticsearch 高级 REST 客户端库的版本号。根据您实际使用的 Elasticsearch 版本,可以将这个版本号替换为适合的版本。

通过这些配置,您的 Maven 项目就能够使用 Elasticsearch 高级 REST 客户端库,从而方便地与 Elasticsearch 进行索引、搜索和管理数据的操作。

连接到 Elasticsearch

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
 
public class ElasticsearchExample {
 
    public static void main(String[] args) {
        // 连接本地 Elasticsearch 服务,默认端口为9200
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http")));
 
        // 在这里进行索引文档和查询的操作
    }
}

这段代码是一个简单的 Java 示例,演示了如何使用 Elasticsearch 的高级 REST 客户端连接到本地的 Elasticsearch 服务,并进行基本的索引文档和查询操作。让我们逐行解释代码的各个部分:

  1. import org.apache.http.HttpHost;
  • 这是导入了 Apache 的 HttpHost 类,用于指定 Elasticsearch 服务的主机名、端口和协议。
  1. import org.elasticsearch.client.RestClient;
  • 这是导入了 Elasticsearch 的低级 REST 客户端类 RestClient,用于构建连接 Elasticsearch 的客户端。
  1. import org.elasticsearch.client.RestHighLevelClient;
  • 这是导入了 Elasticsearch 的高级 REST 客户端类 RestHighLevelClient,它提供了更加友好和面向对象的 API 接口,方便进行索引、搜索和管理操作。
  1. public class ElasticsearchExample {
  • 定义了一个名为 ElasticsearchExample 的公共类。
  1. public static void main(String[] args) {
  • 这是 Java 程序的入口点,main 方法是程序执行的起点。
  1. RestHighLevelClient client = new RestHighLevelClient(
  • 创建了一个 RestHighLevelClient 对象 client,用于与 Elasticsearch 服务进行交互。
  1. RestClient.builder(new HttpHost("localhost", 9200, "http")));
  • 使用 RestClient.builder 方法构建了一个 RestClient 实例,参数 new HttpHost("localhost", 9200, "http") 指定了 Elasticsearch 服务的主机名为 localhost,端口为 9200,协议为 http
  1. // 在这里进行索引文档和查询的操作
  • 这是一个注释,表明在这个代码块内可以添加实际的索引文档和查询操作代码。
总结

这段代码的主要作用是建立了与本地 Elasticsearch 服务的连接,并创建了一个高级 REST 客户端 RestHighLevelClient 对象 client。通过这个客户端对象,您可以使用 Elasticsearch 的高级 API 进行索引、搜索和管理数据的操作。

索引文档

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.common.xcontent.XContentType;
 
public class ElasticsearchExample {
 
    public static void main(String[] args) {
        // 索引文档示例
        String jsonString = "{" +
                "\"title\":\"Elasticsearch Basics\"," +
                "\"content\":\"Elasticsearch is a distributed search and analytics engine.\"" +
                "}";
 
        IndexRequest request = new IndexRequest("my_index")
                .id("1")
                .source(jsonString, XContentType.JSON);
 
        try {
            IndexResponse indexResponse = client.index(request);
            System.out.println("文档索引成功,文档 ID: " + indexResponse.getId());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
总结

当然!这段示例代码演示了如何使用 Elasticsearch 的高级 REST 客户端来索引一个文档到指定的索引中。

  1. 准备索引文档的数据: 在示例中,我们定义了一个 JSON 字符串来表示要索引的文档内容。这个文档包括两个字段:titlecontenttitle 字段包含了文档的标题,而 content 字段描述了 Elasticsearch 是一个分布式搜索和分析引擎。
  2. 创建 IndexRequest 对象: 使用 Elasticsearch 的 Java 客户端,我们创建了一个 IndexRequest 对象。这个对象指定了要将文档索引到的目标索引名称(在示例中是 "my_index")和文档的唯一标识符(ID)。此外,我们使用 source 方法将之前准备的 JSON 字符串和指定的内容类型(XContentType.JSON)添加到请求中。
  3. 执行索引操作: 调用 Elasticsearch 客户端的 index 方法并传递 IndexRequest 对象。这个操作将会把文档发送给 Elasticsearch 集群进行索引。如果索引操作成功,将返回一个 IndexResponse 对象,其中包含了有关索引操作结果的信息,比如索引的文档 ID。
  4. 处理索引响应: 在示例中,我们捕获可能抛出的 IOException 异常,这可能由于网络问题或 Elasticsearch 服务不可用等原因造成。如果索引操作成功,我们通过 IndexResponse 对象获取文档的 ID,并将其打印输出。

这个示例展示了如何利用 Elasticsearch 的 Java 客户端,通过简单的 API 调用,将结构化数据索引到 Elasticsearch 中。这种方式非常适合构建应用程序,将搜索和分析功能集成到应用中,并利用 Elasticsearch 的强大搜索引擎能力来快速检索和分析数据。

查询文档

import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.builder.SearchSourceBuilder;
 
import java.io.IOException;
 
public class ElasticsearchExample {
 
    public static void main(String[] args) {
        // 查询文档示例
        SearchRequest searchRequest = new SearchRequest("my_index");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("title", "Elasticsearch"));
        searchRequest.source(searchSourceBuilder);
 
        try {
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            System.out.println("搜索到 " + searchResponse.getHits().getTotalHits().value + " 个文档:");
            searchResponse.getHits().forEach(hit -> {
                System.out.println("文档 ID: " + hit.getId() + ", 标题: " + hit.getSourceAsMap().get("title"));
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
总结

这段代码演示了如何使用 Elasticsearch 的 Java 客户端来执行搜索请求并处理搜索结果。以下是关键步骤的解释:

  1. 创建 SearchRequest 对象: 首先,通过 SearchRequest 类创建了一个搜索请求对象 searchRequest,指定了要搜索的索引名称为 "my_index"
  2. 构建查询条件: 使用 SearchSourceBuilder 对象 searchSourceBuilder 构建查询条件。在这个例子中,使用 QueryBuilders.matchQuery("title", "Elasticsearch") 创建了一个匹配查询,用于搜索包含指定标题("Elasticsearch")的文档。
  3. 配置搜索请求: 将构建好的查询条件设置到搜索请求对象中,通过 searchRequest.source(searchSourceBuilder) 方法实现。
  4. 执行搜索请求: 使用 Elasticsearch 客户端执行搜索请求,并通过 client.search(searchRequest, RequestOptions.DEFAULT) 方法发送请求。这里假设 client 是已经初始化好的 Elasticsearch 客户端对象。
  5. 处理搜索响应:try-catch块中,捕获可能抛出的IOException异常,这是因为执行 Elasticsearch 操作时可能会涉及到网络通信。如果搜索操作成功,会得到一个SearchResponse对象searchResponse
  • 使用 searchResponse.getHits().getTotalHits().value 获取搜索到的文档总数,并打印出来。
  • 使用 searchResponse.getHits().forEach(...) 迭代处理每个搜索到的文档结果。
  • hit.getId() 获取文档的 ID。
  • hit.getSourceAsMap().get("title") 获取文档的标题字段。
  1. 异常处理:catch 块中,打印出任何发生的 IOException 异常信息。

这段代码展示了如何利用 Elasticsearch 的 Java 客户端进行简单的文档搜索操作,并处理搜索结果。通过这种方式,可以轻松地集成 Elasticsearch 的搜索功能到 Java 应用程序中,实现快速、灵活的文档检索。

关闭客户端连接

import java.io.IOException;
 
public class ElasticsearchExample {
 
    public static void main(String[] args) {
        // 关闭客户端连接
        try {
            client.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
总结

这段代码展示了如何关闭 Elasticsearch 客户端连接。以下是关键点的解释:这行代码导入了 IOException 类,用于处理在关闭客户端连接时可能抛出的异常。

  1. 关闭客户端连接:main 方法中,通过调用 client.close() 方法来关闭 Elasticsearch 客户端连接。这里假设 client 是一个已经初始化和配置好的 Elasticsearch 客户端对象。
  2. 异常处理: 使用 try-catch 块来捕获可能抛出的 IOException 异常。在 catch 块中,通过 e.printStackTrace() 打印异常堆栈信息,以便查看问题所在。
  3. 作用: 关闭 Elasticsearch 客户端连接是一个良好的实践,特别是在应用程序即将退出时或者不再需要连接 Elasticsearch 服务时。关闭连接可以释放资源并确保不会出现连接泄漏或资源浪费。
  4. 注意事项:
  • 确保 client 对象在调用 close() 方法之前已经正确初始化和配置。
  • 处理 IOException 是为了在关闭连接时处理可能出现的网络或IO异常,确保程序能够在异常情况下正常退出或给予适当的反馈。

总结来说,这段代码展示了如何安全地关闭 Elasticsearch 客户端连接,并提供了基本的异常处理以应对可能出现的异常情况。

总结

这些示例展示了如何使用 Java 客户端连接到 Elasticsearch、索引文档以及执行简单的查询操作。您可以根据实际需求和场景进一步扩展这些操作,例如添加更复杂的查询、处理搜索结果等。请确保根据您的具体情况调整代码,包括替换索引名称、文档内容和查询条件。

个人号推广

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
3月前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
3月前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
4月前
|
存储 SQL 分布式数据库
OceanBase 入门:分布式数据库的基础概念
【8月更文第31天】在当今的大数据时代,随着业务规模的不断扩大,传统的单机数据库已经难以满足高并发、大数据量的应用需求。分布式数据库应运而生,成为解决这一问题的有效方案之一。本文将介绍一款由阿里巴巴集团自主研发的分布式数据库——OceanBase,并通过一些基础概念和实际代码示例来帮助读者理解其工作原理。
338 0
|
2月前
|
消息中间件 关系型数据库 Java
‘分布式事务‘ 圣经:从入门到精通,架构师尼恩最新、最全详解 (50+图文4万字全面总结 )
本文 是 基于尼恩之前写的一篇 分布式事务的文章 升级而来 , 尼恩之前写的 分布式事务的文章, 在全网阅读量 100万次以上 , 被很多培训机构 作为 顶级教程。 此文修改了 老版本的 一个大bug , 大家不要再看老版本啦。
|
2月前
|
消息中间件 存储 负载均衡
微服务与分布式系统设计看这篇就够了!
【10月更文挑战第12天】 在现代软件架构中,微服务和分布式系统设计已经成为构建可扩展、灵活和可靠应用程序的主流方法。本文将深入探讨微服务架构的核心概念、设计原则和挑战,并提供一些关于如何在分布式系统中实现微服务的实用指导。
58 2
|
2月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
3月前
|
自然语言处理 搜索推荐 数据库
高性能分布式搜索引擎Elasticsearch详解
高性能分布式搜索引擎Elasticsearch详解
88 4
高性能分布式搜索引擎Elasticsearch详解
|
3月前
|
Dubbo Java 应用服务中间件
分布式-dubbo的入门
分布式-dubbo的入门
|
4月前
|
Java 数据库连接 微服务
揭秘微服务架构下的数据魔方:Hibernate如何玩转分布式持久化,实现秒级响应的秘密武器?
【8月更文挑战第31天】微服务架构通过将系统拆分成独立服务,提升了可维护性和扩展性,但也带来了数据一致性和事务管理等挑战。Hibernate 作为强大的 ORM 工具,在微服务中发挥关键作用,通过二级缓存和分布式事务支持,简化了对象关系映射,并提供了有效的持久化策略。其二级缓存机制减少数据库访问,提升性能;支持 JTA 保证跨服务事务一致性;乐观锁机制解决并发数据冲突。合理配置 Hibernate 可助力构建高效稳定的分布式系统。
69 0
|
20天前
|
设计模式 Java API
微服务架构演变与架构设计深度解析
【11月更文挑战第14天】在当今的IT行业中,微服务架构已经成为构建大型、复杂系统的重要范式。本文将从微服务架构的背景、业务场景、功能点、底层原理、实战、设计模式等多个方面进行深度解析,并结合京东电商的案例,探讨微服务架构在实际应用中的实施与效果。
78 6