Elasticsearch学习文档
Elastic 中文社区:https://elasticstack.blog.csdn.net/?type=blog
Elasticsearch版本:7.14.0
文档更新日期:2024年10月15日
1.1 相关术语
全文搜索引擎
全文搜索引擎是目前广泛应用的主流搜索引擎,工作原理是计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
倒排索引
1)正排索引:文档 →单词
2)倒排索引:倒排索引是实现“单词→文档矩阵”的一种具体存储形式,通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。
首先对文档集合中的文档根据分词器(比如IK分词器)进行分词,并且去掉停用词,然后对关键词建立倒排列表,倒排列表记载了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,根据倒排列表,即可获知哪些文档包含某个单词。
例如,要查询“搜索引擎”这个关键词在哪些文档中出现过。 首先通过倒排索引可以查询到该关键词出现的文档位置是在 1 和 3 中;然后再通过正排索引查询到文档 1和 3 的内容并返回结果。
1.2 介绍
The Elastic Stack, 包括 Elasticsearch
、Kibana
、Beats
和 Logstash
(也称为 ELK Stack)。能够安全可靠地获取任何来源、任何格式的数据,然后实时地对数据进行搜索、分析和可视化。Elaticsearch,简称为 ES,由 Elastic 公司创建,是一个开源的高扩展的分布式全文搜索引擎,底层基于开源的搜索引擎库 Lucene,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据,是整个 Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据。
Lucene 是一个搜索引擎工具包,用 Java 编写,主要用来构建倒排索引(一种数据结构)和对这些索引进行检索,从而实现全文检索功能。
缺点:仅仅是一个基础类库,没有考虑到高并发和分布式的场景。
目前市面上流行的搜索引擎软件,主流:Elasticsearch 和 Solr,这两款都是基于 Lucene 搭建的,可以独立部署启动的搜索引擎服务软件。
ELK Stack
Beats用于日志收集,然后将数据传给 Logstash,通过 Logstash 强大的数据清洗功能,最终把数据写入到 Elasticsearch 中,并由 Kibana 进行可视化。
(1)Elasticsearch :负责数据存储,并快速地搜索及分析数据。
(2)Logstash :一个开源的日志处理工具,负责数据的采集、处理,基于灵活的 Pipeline 管道架构来处理数据,支持多种输入数据源和多种输出数据源。
(3)Kibana:负责数据展示,分析,管理,监督,警报及方案
(4)Beats:轻量级的数据收集端,集合了多种单一用途数据采集器,从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。
Filebeat 用于日志传送,Packetbeat 用于网络数据传送, Metricbeat 用于系统和应用程序指标监视。
1.3 基本概念
一个 cluster集群由一个或多个 nodes 节点组成,在每个 node 里,包含一个或更多的 shards分片,这些 shards 可以是 primary shard(主分片),也可以是 replica shard(副本分片),每个 shard 里包含一个 index 的全部或部分数据,一个 index 由一个或多个 shard 组成。每个 index 包含无数的 documents,每个 document由相同属性的 JSON 文档组成。
1.3.1 Cluster
Cluster ,集群,Elasticsearch 集群由一个或多个节点组成,可通过集群名称进行标识。通常Cluster是可以在 Elasticsearch 里的配置文件中设置的。
默认情况下,会生成一个叫做 “elasticsearch” 的集群,可以在 config/elasticsearch.yml 里修改集群的名称:
GET _cluster/health 获取整个 cluster 的状态。
{
"cluster_name": "elasticsearch",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 2,
"active_shards": 2,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 4,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 33.3333333333333
}
响应信息中最重要的字段是
status
。状态可能是下列三个值之一:
green
所有的主分片和副本分片都已分配。你的集群是 100% 可用的。
yellow
所有的主分片已经分片了,但至少还有一个副本是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过,高可用性在某种程度上被弱化。如果 更多的 分片消失,你就会丢数据了。把
yellow
想象成一个需要及时调查的警告。
red
至少一个主分片(以及它的全部副本)都在缺失中。这意味着缺少数据:搜索只能返回部分数据,而分配到这个分片上的写入请求会返回一个异常。
1.3.2 node
单个 Elasticsearch 实例。 在大多数环境中,每个节点都在单独的服务器或虚拟机上运行。
一个集群由一个或多个 node 组成,在测试的环境中,可以把多个 node 运行在一个 server 上。在实际的部署中,大多数情况下一个 server 运行一个 node。
1.3.3 index
在 Elasticsearch 中,索引是文档的集合。
1.3.4 shard
比如,一个具有 10 亿文档的索引占据 1 TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。
为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,这些份就叫做分片(shard)。有两种类型的分片:primary shard 和 replica shard。
1)Primary shard: 每个文档都存储在一个 primary shard。
2)Replica shard: 每个主分片可以具有零个或多个副本。 replica 是主分片的副本。replica 只能是只读的,不可以进行写入操作。
1.3.5 Document
Elasticsearch 是面向文档的,这意味着索引或搜索的最小数据单元是文档。文档通常是数据的 JSON表示形式。
1.3.6 SQL VS Elasticsearch
SQL | Elasticsearch |
---|---|
row(行) | document(文档) |
table(表) | index(索引) |
database(数据库) | cluster集群实例 |
1.4 ES下载与安装
ES下载地址:https://www.elastic.co/cn/downloads/past-releases#elasticsearch
windows环境:
解压后,进入 bin 文件目录,双击 elasticsearch.bat 文件,启动 ES 服务
NOTE:9300端口为Elasticsearch集群间组件的通信端口,9200端口为浏览器访问的http协议RESTful端口。
检查 Elasticsearch 是否已运行,浏览器输入:http://localhost:9200
{
"name" : "CodePrince",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "6DyvUh-SSkaeGquP_sJRFg",
"version" : {
"number" : "7.14.0",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
TIPS: Ctrl+C 停止运行
如何选择elasticsearch自带的JDK?
添加系统变量ES_HOME,修改elasticsearch bin目录下的elasticsearch-env,配置ES_JAVA_HOME这个变量,指向es安装包自带的jdk目录
1.5 SpringBoot集成ElasticSearch
官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/4.4.5/reference/html/
Spring Data Release Train | Spring Data Elasticsearch | Elasticsearch | Spring Framework | Spring Boot |
---|---|---|---|---|
2021.2 (Raj) | 4.4.x | 7.17.9 | 5.3.x | 2.7.x |
2021.1 (Q) | 4.3.x | 7.15.2 | 5.3.x | 2.6.x |
2021.0 (Pascal) | 4.2.x[1] | 7.12.0 | 5.3.x | 2.5.x |
2020.0 (Ockham)[1] | 4.1.x[1] | 7.9.3 | 5.3.2 | 2.4.x |
Neumann[1] | 4.0.x[1] | 7.6.2 | 5.2.12 | 2.3.x |
Moore[1] | 3.2.x[1] | 6.8.12 | 5.2.12 | 2.2.x |
Lovelace[1] | 3.1.x[1] | 6.2.2 | 5.1.19 | 2.1.x |
Kay[1] | 3.0.x[1] | 5.5.0 | 5.0.13 | 2.0.x |
Ingalls[1] | 2.1.x[1] | 2.4.0 | 4.3.25 | 1.5.x |
NOTE:Elasticsearch、Spring Data Elasticsearch、Spring Framework、SpringBoot版本需对应
引入依赖
前提:Elasticsearch 7.14.0、springboot 2.7.5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
SpringBoot项目操作Elasticsearch的方式:
方式一:ElasticsearchRepository<T, ID> T实体,ID文档id类型
方式二:ElasticsearchOperations和ElasticsearchRestTemplate
补充:
- IndexOperations 定义了索引级的操作,如创建或删除索引
- DocumentOperations 定义基于实体id存储、更新和检索实体的操作
- SearchOperations 定义使用查询搜索多个实体的操作
- ElasticsearchOperations 组合了 DocumentOperations 和 SearchOperations 接口。
ElasticsearchRestTemplate
是使用 High Level REST Client的ElasticsearchOperations
接口的实现。
方式三:RestHighLevelClient 过时
添加配置
两种方式:配置类或配置文件,示例:在application.yml添加配置
配置项参考
ElasticsearchProperties
类
spring:
elasticsearch:
uris: 127.0.0.1:9200
核心类库
QueryBuilders
查询构建器(org.elasticsearch.index.query.QueryBuilders
),是构建复杂查询的强大工具集。
matchAllQuery
• 功能:匹配所有文档的查询。
• 示例:QueryBuilders.matchAllQuery()
matchQuery
• 功能:基于字段的全文本匹配查询。
• 参数:字段名,查询关键词。
• 示例:QueryBuilders.matchQuery(“title”, “elasticsearch”)
commonTermsQuery
• 功能:处理常用词的优化查询,平衡准确性和性能。
• 参数:字段名,查询文本,低频词阈值等。
• 示例:QueryBuilders.commonTermsQuery(“content”, “elasticsearch basics”)
multiMatchQuery
• 功能:在多个字段上执行匹配查询。
• 参数:查询文本,涉及的字段列表,查询类型等。
• 示例:QueryBui