推荐文章
第一章 MySQL:关系型数据库
第二章 Redis:高性能内存数据库
第三章 MQ:高性能、分布式消息队列
第四章 Elasticsearch:高性能分布式搜索、分析引擎
在当今大数据时代,搜索和分析海量数据是一项关键任务。Elasticsearch 是一种流行的开源搜索和分析引擎,具有分布式、实时和高可伸缩性的特性。本博客将介绍 Elasticsearch 的核心概念、基本架构和关键功能,帮助读者了解如何构建高性能的搜索和分析引擎。
Elasticsearch 是一种开源的分布式搜索和分析引擎,基于 Apache Lucene 引擎构建而成。它支持实时数据搜索、分析和存储,并具有高可用性、弹性和可扩展性。
Elasticsearch 的强大搜索和分析功能使其在许多不同的应用场景中得到广泛应用。以下是一些常见的 Elasticsearch 应用场景:
除了上述应用场景,Elasticsearch 还可以用于知识图谱构建、智能推荐、文档管理、事件日程管理等等。由于其灵活性和可扩展性,它已经成为许多组织和企业处理大数据和实时应用的首选工具之一。
当处理大量数据并需要进行全局搜索时,使用 Elasticsearch 和传统数据库之间存在一些区别和考虑因素。以下是一些需要注意的点:
需要注意的是,Elasticsearch并不是用来替代传统数据库的,它的设计目标是高性能搜索和分析,而传统数据库则更专注于数据的事务性操作和数据的可维护性。在实际应用中,可以将 Elasticsearch 与传统数据库结合使用,根据不同的需求选择合适的存储和查询方式。
总之,Elasticsearch 在全局搜索场景下具有较高的性能、灵活的数据结构、分布式和可扩展性,以及强大的搜索和分析功能,使其成为处理大量数据时的优选解决方案。
确保已经安装了 Docker。参考:Docker 简介
打开终端或命令提示符,并运行以下命令来拉取 Elasticsearch 镜像:
docker pull elasticsearch:7.9.2
# 根目录选择自身实际最大磁盘路径 一般为/home 或者定义/data
mkdir -p /home/elasticsearch/config
mkdir -p /home/elasticsearch/data
mkdir -p /home/elasticsearch/plugins
# 授权
chmod 777 /home/elasticsearch/config
chmod 777 /home/elasticsearch/data
chmod 777 /home/elasticsearch/plugins
编写配置文件
# 写入配置
echo 'http.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*" '>>/home/elasticsearch/config/elasticsearch.yml
# 单实例
docker run --name elasticsearch -p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \
-v /home/elasticsearch/config/elasticsearch.yml:/usr/shellare/elasticsearch/config/elasticsearch.yml \
-v /home/elasticsearch/data:/usr/shellare/elasticsearch/data \
-v /home/elasticsearch/plugins:/usr/shellare/elasticsearch/plugins \
-d elasticsearch:7.9.2
安装分词器
docker exec -it elasticsearch /bin/bash
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.2/elasticsearch-analysis-ik-7.9.2.zip
ps: 安装的ik分词器的版本一定要与elasticsearch的版本保持一致
下载完成之后,退出去,重新启动elasticsearch容器。
docker restart elasticsearch
测试ik分词器是否安装成功,postman post请求分词测试:http://服务器IP地址:9200/_analyze
{
"tokenizer":"ik_smart",
"text":"我爱技术"
}
结果
{
"tokens": [
{
"token": "我",
"start_offset": 0,
"end_offset": 1,
"type": "CN_CHAR",
"position": 0
},
{
"token": "爱",
"start_offset": 1,
"end_offset": 2,
"type": "CN_CHAR",
"position": 1
},
{
"token": "技术",
"start_offset": 2,
"end_offset": 4,
"type": "CN_WORD",
"position": 2
}
]
}
修改 elasticsearch.yml 配置文件
cluster.name: my-cluster
node.name: node-1
network.host: 0.0.0.0
discovery.seed_hosts: ["node-1", "node-2"]
cluster.initial_master_nodes: ["node-1", "node-2"]
在这个配置文件中,我们指定了集群名称为 my-cluster,节点名称为 node-1,使用了 0.0.0.0 作为网络主机,discovery.seed_hosts 指定了集群中其他节点的主机名(这里我们暂时使用 node-1 和 node-2),cluster.initial_master_nodes 用于指定初始主节点。
// 集群创建
docker run -d --name node-1 -p 9200:9200 -p 9300:9300 -v /path/to/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml docker.elastic.co/elasticsearch/elasticsearch:{版本号}
这将创建一个名为 node-1 的 Elasticsearch 容器,并将容器的 9200 和 9300 端口映射到主机上。-v 参数用于将主机上的配置文件路径 (/path/to/elasticsearch.yml) 挂载到容器中的相应路径,以应用我们之前创建的配置文件。
根据集群规模,您可以在其他主机或虚拟机上重复上述步骤以创建更多的 Elasticsearch 节点。请确保将每个节点的名称和配置文件中的 node.name 和 discovery.seed_hosts 参数进行相应的更改。
通过重复上述步骤为所有节点创建并运行容器后,您将拥有一个运行中的 Elasticsearch 集群。您可以使用 Elasticsearch 的 API 进行索引、搜索和其他操作,集群中的节点将自动进行数据分片和主节点选举。
在 Elasticsearch 中,数据组织在索引中,类似于关系数据库的数据库。在创建索引之前,您可以定义映射,即字段的数据类型和属性。这有助于 Elasticsearch 了解数据的结构和如何处理它。
插入、更新和删除 使用 Elasticsearch 的 RESTful API 或客户端库,可以执行文档操作。插入文档是将包含字段和对应值的文档插入索引中。更新文档可以修改现有文档的字段值。删除操作则是从索引中删除指定的文档。
Elasticsearch 提供丰富的搜索和查询功能。您可以使用查询语句对数据进行过滤和搜索。匹配搜索可用于匹配特定字段中的关键字。范围查询可用于查找具有特定范围值的字段。
除了基本搜索功能,Elasticsearch 还提供了高级功能,如聚合和过滤。聚合允许对搜索结果进行统计和汇总计算,如平均值、求和和直方图等。过滤器可以用来排除或包含特定的数据。
Elasticsearch 采用分布式架构进行数据存储和处理。它可以通过水平扩展来处理大规模数据集。集群中的多个节点相互合作,共享数据和负载,实现高可用性、负载均衡和故障恢复。
pom文件依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-elasticsearchartifactId>
dependency>
application.yaml
spring:
elasticsearch:
rest:
uris: es的ip:9200
还可以配置其他 Elasticsearch 相关的属性,如索引名称、刷新间隔等。
创建实体类: 创建一个用于映射到 Elasticsearch 文档的实体类。
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
// 创建一个命名为books的索引
@Document(indexName = "books")
public class Book {
@Id
private String id;
private String title;
private String author;
// Getters and setters
}
创建 Elasticsearch 资源库(Repository): 创建一个继承自 ElasticsearchRepository 的接口,用于执行 Elasticsearch 相关操作。
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface BookRepository extends ElasticsearchRepository<Book, String> {
// 这里的方法命名要规范命名,spring编译时会去检索与by后面的字段是否与es实体类一致,不一致则报异常。
List<Book> findByTitle(String title);
}
使用 Elasticsearch 资源库: 在您的服务或控制器中使用创建的 Elasticsearch 资源库。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class BookController {
@Autowired
private BookRepository bookRepository;
@GetMapping("/books")
public List<Book> getBooksByTitle(String title) {
return bookRepository.findByTitle(title);
}
}