# spring-boot-es-guide **Repository Path**: void-wu/spring-boot-es-guide ## Basic Information - **Project Name**: spring-boot-es-guide - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2022-02-23 - **Last Updated**: 2022-02-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1.Elasticsearch概述 es是一个开源的**高扩展**的**分布式全文检索引擎**,它可以近乎**实时的存储**、**检索数据;**本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es使用java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的**目的**是通过简单的**RESTful API**来隐藏Lucene的复杂性,从而让全文搜索变得简单。 **Lucene** - 是一个**开放源代码**的**全文检索引擎工具包** - **不是一个完整的全文检索引擎,而是一个全文检索引擎的架构**,提供了完整的查询引擎和索引引擎,部分[文本分析](https://baike.baidu.com/item/文本分析/11046544)引擎 - **免费Java信息检索程序库**。 **Solr** 对外提供类似于web-service的api接口,用户通过http请求,向solr搜索引擎服务器提交一定格式的文件,生成索引 国内现在有大量的公司都在使用 Elasticsearch,包括携程、滴滴、今日头条、饿了么、360安全、小米、vivo等诸多知名公司。 ![image-20220222142949684](https://lancemoll.oss-cn-chengdu.aliyuncs.com/typora/image-20220222142949684.png) # 2.solr和es的区别 [博客地址](https://www.cnblogs.com/blueskyli/p/8326229.html) ---- # 3.使用场景 - ![(https://lancemoll.oss-cn-chengdu.aliyuncs.com/typora/image-20220222170718035.png)全文检索 比如: 电商的搜索,音乐搜索,视频搜索,问答搜索等 - 数据分析 全栈的日志分析,包括各种应用日志、数据库日志、用户行为日志、网络数据、安全数据等 es版本和jvm版本的关系:https://www.elastic.co/cn/support/matrix#matrix_jvm es启动占用最少1g内存,需要手动调节占用内存的大小 **启动报错** > MaxDirectMemorySize may have been miscalculated due to JDK-8074459 在elasticsearch7.x之后的版本, 已经集成了自带的jdk, 在根目录下的jdk文件夹中 这里需要修改elasticsearch-env.bat启动文件的配置内容, 设置系统使用elasticsearch自带的jdk版本 在elasticsearch-env.bat文件中找到关于JAVA_HOME的配置, 注释掉if…else判断的东西 ```bat set JAVA="%ES_HOME%\jdk\bin\java.exe" set JAVA_HOME="%ES_HOME%\jdk" set JAVA_TYPE=bundled jdk ``` ---- ```console GET /_cat/health?v ``` 获取es的运行状态 # 4.核心概念 > ElasticSearch是面向文档,关系行数据库和ElasticSearch客观对比!一切都是JSON! | Relational DB | ElasticSearch | | ------------------ | ------------------- | | 数据库(database) | 索引(**indices**) | | 表(tables) | types/_doc | | 行(rows) | documents | | 字段(columns) | fields | **elasticsearch(集群)**中可以包含多个**索引(数据库)** ,每个索引中可以包含多个**类型(表)** ,每个类型下又包含多个**文档(行)** ,每个文档中又包含多个**字段(列)**。 1. 索引 > 名词:一个索引**(index)**就像是传统关系数据库中的数据库,它 是相关文档存储的地方 > > 动词:表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。就像SQL中的 INSERT 关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档 2. 类型 > 在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。不同的版本,类型发生了不同的变化 | 版本 | Type | | ---- | ---------------------------------------------- | | 5.x | 支持多种type | | 6.x | 只能有一种type | | 7.x | 默认不再支持自定义索引类型(默认类型为:_doc) | 3. 文档 > 一个文档是一个可被索引的基础信息单元,也就是一条数据 4. 字段 > 相当于是数据表的字段,对文档数据根据不同属性进行的分类标识。 5. 映射 > 处理数据的方式和规则方面做一些限制,如:某个字段的数据类型、默认值、分析器、是否被索引等 6. 分片(Shards) > 一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有10亿文档数据的索引占据1TB的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。为了解决这个问题ES提供了将索引划分成多份的能力,每一份就称之为分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的"索引",这个"索引"可以被放置到集群中的任何节点上。分片很重要,主要有两方面的原因: > i.允许你水平分割/扩展你的内容容量。 > ii.允许你在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。 > 至于一个分片怎样分布,它的文档怎样聚合和搜索请求,是完全由Elasticsearch管理的,对于作为用户的你来说,这些都是透明的,无需过分关心。 7. 副本(replicas) > 在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。 > 扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。 es 7.x 默认分片和副本 number_of_shards 每个索引的主分片数,默认值是 5 。这个配置在索引创建后不能修改。 number_of_replicas 每个主分片的副本数,默认值是 1 。对于活动的索引库,这个配置可以随时修改。 # 5. 聚合查询 聚合的两个主要的概念,分别是 桶 和 指标 `桶(Buckets)` : 满足特定条件的文档的集合,当聚合开始被执行,每个文档会决定符合哪个桶的条件,如果匹配到,文档将放入相应的桶并接着进行聚合操作,像是一个员工属于男性桶或者女性桶,日期2014-10-28属于十月桶,也属于2014年桶,桶可以被嵌套在其他桶里面,像是北京能放在中国桶裡,而中国桶能放在亚洲桶裡 Elasticsearch提供了很多种类型的桶,像是时间、最受欢迎的词、年龄区间、地理位置桶等等,不过他们在根本上都是通过同样的原理进行操作,也就是基于条件来划分文档,一个文档只要符合条件,就可以加入那个桶,因此一个文档可以同时加入很多桶 `指标(Metrics) `: 对桶内的文档进行统计计算,桶能让我们划分文档到有意义的集合, 但是最终我们需要的是对这些桶内的文档进行一些指标的计算,指标通常是简单的数学运算(像是min、max、avg、sum),而这些是通过当前桶中的文档的值来计算的,利用指标能让你计算像平均薪资、最高出售价格、95%的查询延迟这样的数据 ------------------------------------------------ ## 聚合中常用的桶 terms、filter、top_hits terms桶 : 针对某个field的值进行分组,field有几种值就分成几组 filter桶 : 一个用来过滤的桶 top_hits桶 : 在某个桶底下找出这个桶的前几笔hits ![image-20220221151119049](https://lancemoll.oss-cn-chengdu.aliyuncs.com/typora/image-20220221151119049.png) 倒排索引: i 1,2 love 1,2 china 1 chongq 2 正排索引 1 ilove china 2 ilove chongq