![](https://img-blog.csdnimg.cn/20200617102244363.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
从头开始学ElasticSearch
本专栏系统地梳理了ElasticSearch的各个核心知识点,并对其进行讲解和演示。
lwen.steven
学好Java,为公司“添砖加瓦”!
展开
-
8.12 SpringBoot集成ElasticSearch之拦截器
1.简介eBatis中拦截器的加载通过SPI方式实现,只需要提供的目标类实现io.manbang.ebatis.core.interceptor.Interceptor接口,在目标类上加上注解@AutoService(Interceptor.class),由auto-service生成。2.interceptor开发在项目目录“/src/main/java/com/example/es”下新建interceptor目录,并在interceptor目录下新建EmployeeInterceptor类,Em原创 2022-01-06 19:23:02 · 1192 阅读 · 0 评论 -
8.11 SpringBoot集成ElasticSearch之聚合
1.condition开发在项目目录“/src/main/java/com/example/es/condition”下新建AggEmployeeCondition聚合条件类,AggEmployeeCondition类需要实现AggProvider接口,具体代码如下。@Datapublic class AggEmployeeCondition extends SampleEmployeeCondition implements AggProvider { @Override publ原创 2022-01-06 16:44:55 · 796 阅读 · 0 评论 -
8.10 SpringBoot集成ElasticSearch之深度分页
1.condition开发在项目目录“/src/main/java/com/example/es/condition”的EmployeeCondition类中实现ScrollProvider接口,具体代码如下。@Datapublic class EmployeeCondition extends SampleEmployeeCondition implements RoutingProvider, ScoreFunctionProvider, SortProvider, ScrollProvider原创 2022-01-06 15:00:16 · 867 阅读 · 0 评论 -
8.9 SpringBoot集成ElasticSearch之高亮
1.condition开发在项目目录“/src/main/java/com/example/es/condition”的EmployeeCondition类中实现SortProvider接口,具体代码如下。@Datapublic class EmployeeCondition extends SampleEmployeeCondition implements RoutingProvider, ScoreFunctionProvider,SortProvider, HighlighterProvide原创 2022-01-05 16:58:49 · 435 阅读 · 0 评论 -
8.8 SpringBoot集成ElasticSearch之指定返回字段
1.接口实现方式(1).condition开发在项目目录“/src/main/java/com/example/es/condition”的EmployeeCondition类中实现SourceProvider接口,具体代码如下。@Datapublic class EmployeeCondition extends SampleEmployeeCondition implements RoutingProvider, ScoreFunctionProvider, SourceProvider {原创 2022-01-05 14:52:11 · 1653 阅读 · 2 评论 -
8.7 SpringBoot集成ElasticSearch之排序
1.condition开发在项目目录“/src/main/java/com/example/es/condition”的EmployeeCondition类中实现SortProvider接口,具体代码如下。@Datapublic class EmployeeCondition extends SampleEmployeeCondition implements RoutingProvider, ScoreFunctionProvider, SortProvider { private stat原创 2022-01-05 14:23:17 · 1130 阅读 · 0 评论 -
8.6 SpringBoot集成ElasticSearch之DSL查询
1.简介(1).DSL查询为了便于统一设计,所有的查询语句最后都被封装成BoolQueryBuilder,查询条件最终会被封装成为一个有层级关系的对象。查询操作统一由@Search注解来标记,支持分页查询。(2).基本条件定义查询条件统一定义成一个POJO对象,对象的属性名即为mapping字段名称,如果属性名称和mapping字段名称不一致,通过@Field注解来映射。属性分为基本类型和对象类型,对象类型会再次递归定义查询条件。(3).查询语句类型语句类型通过属性注解来表示,如果属性不加注解,原创 2022-01-05 11:11:10 · 2032 阅读 · 0 评论 -
8.5 SpringBoot集成ElasticSearch之查询文档
1.condition开发在项目目录“/src/main/java/com/example/es”下新建condition目录,并在condition目录下新建SampleEmployeeCondition查询条件类,具体代码如下。@Datapublic class SampleEmployeeCondition { @Must @Field("employeeId") private String employeeId; @Must @Field("name原创 2021-12-27 16:49:36 · 656 阅读 · 0 评论 -
8.4 SpringBoot集成ElasticSearch之修改文档
1.mapper开发在项目目录“/src/main/java/com/example/es”的EmployeeMapper类中新增修改员工信息接口,具体代码如下。@EasyMapper(indices = "employee", clusterRouter = "sampleCluster")public interface EmployeeMapper { /** * 更新员工,支持部分更新,如果文档不存在,则做插入操作 * * @param employeeE原创 2021-12-19 17:37:29 · 1560 阅读 · 2 评论 -
8.3 SpringBoot集成ElasticSearch之删除文档
1.mapper开发在项目目录“/src/main/java/com/example/es”的EmployeeMapper类中新增删除员工接口,具体代码如下。@EasyMapper(indices = "employee", clusterRouter = "sampleCluster")public interface EmployeeMapper { /** * 删除员工 * * @param id 员工文档id * @return 删除成功,返回t原创 2021-12-19 17:36:42 · 2063 阅读 · 0 评论 -
8.2 SpringBoot集成ElasticSearch之新增文档
1.entity开发在项目目录“/src/main/java/com/example/es”下新建entity目录,并在entity目录下新建EmployeeEntity实体类,具体代码如下。@Datapublic class EmployeeEntity { @JsonProperty("employeeId") private String employeeId; @JsonProperty("name") private String name; @原创 2021-12-19 15:12:52 · 2245 阅读 · 2 评论 -
8.1 SpringBoot集成ElasticSearch之EBatis简介
1.简介EBatis是一个声明式的ElasticSearch ORM框架。类似MyBatis,只需要定义接口,便可轻松访问ElasticSearch,优雅地帮助开发者隔离业务对ElasticSearch底层接口的调用,无需手动构建繁琐的DSL语句。同时,当升级ElastiSearch版本时,无需关心底层接口的变动,平滑升级。目前,支持ElasticSearch6.5.1与7.5.1版本(本教程演示版本)。2.连接集群(1).依赖<parent> <artifactId>eb原创 2021-12-18 23:37:21 · 1132 阅读 · 0 评论 -
7.3 ElasticSearch运行机制之排序
1.简介elasticsearch默认采用相关性算分排序,用户可以通过设定sort参数自行设定排序规则。2.query查询job字段为“Java engineer”的文档,然后按照出生日期为第一排序字段、相关性得分为第二排序字段、文档id为第三排序字段进行降序排序。POST /employee/_search{ "query": { "match": { "job": "Java engineer" } }, "sort": [ { "原创 2021-09-06 00:07:13 · 1509 阅读 · 0 评论 -
7.2 ElasticSearch运行机制之分页与遍历
1.简介elasticsearch提供了如下三种方式来解决分页与遍历问题,分别是from/size、scroll以及search_after。2.from/size(1).query查询job字段为"Java engineer"的文档,从第2个位置开始,展示2条。POST /employee/_search{ "query": { "match": { "job": "Java engineer" } }, "from": 1, "size": 2原创 2021-09-06 00:04:42 · 578 阅读 · 0 评论 -
7.1 ElasticSearch运行机制之Search
1.简介search在执行的时候实际上分query和fetch两个阶段来运作的,在elasticsearch里这种执行方式被称为query-then-fetch。下图为拥有3个node的elasticsearch集群。2.query阶段node3在接到用户的search请求后,会先进行query阶段,此时node3是coordinating node角色,query阶段主要包含如下3个步骤。node3会在9个主副分片中随机选择3个分片发送search request,只要这3个分片包含完整的数据原创 2021-09-06 00:04:04 · 177 阅读 · 0 评论 -
6.7 ElasticSearch分布式特性之思考题
1.条件搭建一个拥有三个节点的集群,每个节点都含有1个主分片和2个副本分片,并创建一个名为test_index的索引。2.思考题(1).此时增加节点是否能提高test_index的数据容量?不能。因为集群有3个分片且已经分布在3个节点上,新增的节点无法利用。(2).此时增加副本数是否能提高test_index的读取吞吐量?不能。因为新增的副本也是分布在前3个节点上,还是只利用了之前的机器资源。如果需要增加吞吐量,需要增加节点和副本,然后重新导入数据。3.分片数设定分片数需要提前规划好,过小原创 2021-09-06 00:03:32 · 108 阅读 · 0 评论 -
6.6 ElasticSearch分布式特性之分片详解
1.倒排索引的不可变更性倒排索引一旦生产,便不能更改,其中的利弊如下。不用考虑并发性问题,杜绝锁机制带来的性能问题由于文件不再更改,可以充分利用文件系统缓存,只需要载入一次,只要内存足够,对文件的读取都会从内存读取,性能高利于对文件进行压缩存储,节省磁盘和内存存储空间坏处为需要写入新文档时,必须重新构建倒排索引文件,然后替换老文件后,新文档才能被检索,导致文档开销大和实时性差2.文档搜索实时性lucene便是采用了下图所示的这种方案,它构建的单个倒排索引称为segment,合在一起称为in原创 2021-09-06 00:02:50 · 394 阅读 · 0 评论 -
6.5 ElasticSearch分布式特性之脑裂问题
1.简介脑裂问题是分布式系统中的经典网络问题,如下图所示,3个节点组成的集群,突然node1的网络和其它两个节点中断。那么当node2和node3连接不上node1时,它们会重新选举master,比如node2被推选成新的master,此时会更新cluster state,而node1自己组成集群后,也会更新cluster state。这时,同一个集群中就会有2个master,而且维护着不同的cluster state,网络恢复后就无法选择正确的master,这就是脑裂问题。2.解决方案解决方案为通原创 2021-09-06 00:01:46 · 243 阅读 · 0 评论 -
6.4 ElasticSearch分布式特性之文档存储
1.简介(1).问题文档最终会存储在分片上,假如一个文档最终存储在分片P1上,那么该文档是如何存储到分片P1上的?选择P1的依据是什么?(2).解决方案需要文档到分片的映射算法,目的是使得文档均匀分布在所有分片上,以充分利用资源。算法既不是随机选择算法,也不是轮询(round-robin)算法,原因是这两者算法需要维护文档到分片的映射关系,成本巨大。实际上elasticsearch选择的是根据文档值实时计算对应的分片来完成文档存储的,具体的映射算法如下。shard = hash(routing)%原创 2021-09-06 00:01:13 · 235 阅读 · 0 评论 -
6.3 ElasticSearch分布式特性之故障转移
1.集群的健康状况(1).简介可以通过API查看集群的健康状况,健康状态只是表明主分片的分配情况,并不代表集群服务的状态,elasticsearch的集群健康状态包括如下三种状态。green:健康状态,指所有主副分片都正常分配yellow:指所有主分片都可以正常分配,但有副本分片未正常分配red:有主分片未正常分配(2).queryGET _cluster/health{ "cluster_name" : "sampleCluster", "status" : "yellow"原创 2021-09-06 00:00:40 · 307 阅读 · 0 评论 -
6.2 ElasticSearch分布式特性之高可用
1.服务可用性多个节点的情况下,允许其中一些节点停止服务,但至少保证一个节点可用。2.数据可用性(1).Shard(分片)index可以存储大量的数据,可以超过单个节点的硬件限制。但是大量数据不适合都存储在一个节点上,这样会减慢搜索速度。为解决这样的问题,elasticsearch提供了细分index到多片的功能,这些分片叫做shard,shard包含如下特性。分片存储了部分数据,可以分布于任意节点上分片数在索引创建时指定且后续不允许再更改,默认为5分片有主分片和副分片之分,以实现数据的高可原创 2021-09-05 18:12:42 · 297 阅读 · 0 评论 -
6.1 ElasticSearch分布式特性之基本概念
1.集群和节点简介elasticsearch支持集群模式,是一个分布式系统,其好处主要有两个。一是增大系统的容量,如内存和磁盘,使得elasticsearch集群可以支持pb级的数据。二是提高系统可用性,即使部分节点停止服务,整个集群依然可以正常运行。elasticsearch集群由多个elasticsearch实例组成。不同集群通过集群名字来区分,可以通过配置文件中的cluster.name来设置,默认为“elasticsearch”。每个elasticsearch实例本质上是一个jvm进程且有自己的原创 2021-09-05 18:11:32 · 157 阅读 · 0 评论 -
5.4 ElasticSearch聚合分析之作用范围
1.简介elasticsearch聚合分析默认的作用范围是query的结果集,但是可以通过query、filter、post_filter和global来改变其作用范围。2.query对查询结果集进行聚合分析,如先过滤年龄大于25的文档,然后再按照job进行分桶。POST /employee/_search{ "size": 0, "query": { "range": { "age": { "gt": "25" } } }, "aggs": { "sal原创 2021-09-05 18:10:31 · 132 阅读 · 0 评论 -
5.3 ElasticSearch聚合分析之Pipeline
1.Sibling找出所有bucket中值最小的bucket名称和值,如找出平均薪水最低的岗位。PUT /employee/_mapping{ "size": 0, "aggs": { "job_terms": { "terms": { "field": "job", "size": 10 }, "aggs": { "salary_avg": { "avg": { "field": "salary" } }原创 2021-09-05 18:09:47 · 206 阅读 · 0 评论 -
5.2 ElasticSearch聚合分析之Bucket
1.terms该分桶策略最简单,直接按照term来分桶,如果是text类型,则按照分词后的结果分桶(field的值需要设置为field_name.keyword),如对salary字段进行分桶。POST /employee/_search{ "size": 0, "aggs": { "salary_terms": { "terms": { "field": "salary", "size": 10 } } }}{ "took" : 1, "ti原创 2021-09-05 18:08:55 · 383 阅读 · 0 评论 -
5.1 ElasticSearch聚合分析之Metric
1.简介聚合分析是用来对ElasticSearch中存储的数据进行统计分析的,主要包括三种类型。(1).Metric指标分析类型主要分为两类,一类是单值分析,只输出一个分析结果,主要包括min、max、avg、sum和cardinality(没有count)。另一类是多值分析,可以输出多个分析结果,如stats、extended_stats、percentiles、percentile_ranks和top hits。(2).Bucket分桶分析类型是按照一定的规则将文档分配到不同的桶中,达到分类分原创 2021-09-05 18:08:04 · 409 阅读 · 0 评论 -
4.6 ElasticSearch搜索之Count And Source
1.count查询name字段中包含Mike的文档数。POST /people/_count{ "query": { "bool": { "filter": [{ "match": { "name": "Mike" } }] } }}{ "count" : 3, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0原创 2021-09-05 18:06:18 · 168 阅读 · 0 评论 -
4.5 ElasticSearch搜索之Bool Query
1.简介布尔查询由一个或者多个布尔子句组成,其类型和基本语法如下。类型功能filter只过滤符合条件的文档,不计算相关性得分must文档必须符合must中的所有条件,会影响相关性得分must_not文档必须不符合must_not中的所有条件,会影响相关性得分should文档可以符合should中的条件,会影响相关性得分POST /index_name/_search{ "query": { "bool": { "filter": [{}原创 2021-09-05 18:05:23 · 1448 阅读 · 0 评论 -
4.4 ElasticSearch搜索之Constant Score Query
1.简介该查询将其内部的查询结果文档得分都设定为固定值,默认为1,多用于结合bool查询实现自定义得分,其基本语法如下。POST /index_name/_search{ "query": { "constant_score": { "filter": { "match": { "field_name": "query_clause" } }, "boost": score } }}const_score:关键字filter:只能有一原创 2021-09-05 18:04:15 · 670 阅读 · 0 评论 -
4.3 ElasticSearch搜索之Range Query
1.简介Range Query(范围查询)主要针对的是数值和日期类型。支持的四种范围分别为gte(大于等于)、gt(大于)、lte(小于等于)以及lt(小于)。2.数值类查询年龄大于等于25且小于30岁的文档。POST /people/_search{ "query": { "range": { "age": { "gte": 25, "lt": 30 } } }}{ "took" : 215, "ti原创 2021-09-05 18:02:34 · 904 阅读 · 0 评论 -
4.2 ElasticSearch搜索之Term Query
1.term(1).query将查询语句作为整体进行查询,不对查询语句做分词处理,如elasticsearch中存储了“How are you!”文档,且待查询语句为“How are you”,那么查询结果中不会匹配到“How old are you!”或者“How are you!”。POST /people/_search{ "query": { "term": { "description": "How are you!" } }}{ "took" : 0,原创 2021-09-04 03:39:35 · 1420 阅读 · 0 评论 -
4.1 ElasticSearch搜索之Match Query
1.简介查询elasticsearch中的数据时,通常使用具有完备的查询语法query dsl进行(基于json定义的查询语言),主要包括两种类型。(1).简单类查询如match query(全文检索)、term query(词)、range query(范围)等针对某一个字段进行的查询。(2).复合类查询如constant score query、bool query等针对一个或者多个字段进行的复合查询。(3).文档准备打开kibana Dev Tools,分别添加如下文档记录。POST原创 2021-09-04 03:36:37 · 711 阅读 · 0 评论 -
3.8 ElasticSearch数据建模之Reindex
1.简介reindex指重建所有数据的过程,一般在mapping设置变更(字段类型和分词器字段更新)、index设置变更(分片和副本数更改等)以及数据迁移场景下使用。elasticsearch提供了两个现成的API用于完成该工作,一个是在现有索引上重建的_update_by_query,另一个是在其它索引上重建的_reindex。2._update_by_query将blog_comment_index的所有文档重建一遍。POST /blog_comment_index/_update_by_que原创 2021-09-04 03:36:16 · 223 阅读 · 0 评论 -
3.7 ElasticSearch数据建模之关联关系
1.简介elasticsearch不擅长处理关系型数据库中的关联关系,如文章表blog和评论表comment之间通过blog_id关联,在elasticsearch中可以通过nested object或者parent child两种方案来变相解决。parent child方式使用很繁琐并且性能较低,因此建议使用nested object来解决问题,这两种方式优缺点对比如下。Nested ObjectParent Child优点文档存储在一起,因此读取性能高父子文档可以独立更新原创 2021-09-04 03:33:48 · 476 阅读 · 0 评论 -
3.6 ElasticSearch数据建模之案例
1.需求简介以一个博客文章需求案例来演示elasticsearch数据建模的过程,博客索引包括如下字段。标题:title发布日期:publish_date作者:author摘要:abstract网络地址:url2.blog_index的MappingPUT /blog_index{ "settings": { "number_of_shards": 5, "number_of_replicas": 1 }}PUT /blog_index/_mapping{原创 2021-09-04 03:33:17 · 213 阅读 · 0 评论 -
3.5 ElasticSearch数据建模之Mapping设计
1.Mapping字段的相关配置(1).enabled值选项:true | false使用场景:默认为true,如果设置为false则该字段仅做存储,不做搜索、算分排序和聚合分析(2).index值选项:true | false使用场景:是否构建倒排索引,如果设置为false,则该字段不做搜索(3).doc_values值选项:true | false使用场景:是否启动doc_values,如果设置为false,则该字段不做算分排序和聚合分析(4).norms值选项:tr原创 2021-09-04 03:28:59 · 705 阅读 · 0 评论 -
3.4 ElasticSearch数据建模之基本概念
1.简介数据建模,英文为data modeling,为创建数据模型的过程。数据模型,英文为data model,对现实世界进行抽象描述的一种工具和方法,通过抽象的实体及实体之间联系的形式去描述业务规则,从而实现对现实世界的映射。2.过程概念模型:确定系统的核心需求和范围边界,设计实体和实体间的关系逻辑模型:进一步梳理业务需求,确定每个实体的属性、关系和约束等物理模型:结合具体的数据库产品(mysql、redis、elasticsearch),满足业务读写性能等需求的前提下确定最终的定义3.E原创 2021-09-04 03:27:06 · 202 阅读 · 0 评论 -
3.3 ElasticSearch映射之基本属性
1.dynamic(1).简介mapping中的字段类型一旦设定后,禁止直接修改,原因是lucene实现的倒排索引产生后不允许修改,要解决索引结构修改的方式是重新建立新的索引然后重新插入文档数据。mapping字段虽然不允许修改,但是却可以新增,通过dynamic字段进行配置。(2).dynamic的值及其含义true:默认值,允许新增字段,当文档中包含mapping中不存在的字段时,elasticsearch会自动新增字段,并插入内容false:不允许新增字段,但文档可以正常写入,但不会新建字原创 2021-09-04 03:26:11 · 225 阅读 · 0 评论 -
3.2 ElasticSearch映射之数据类型
1.基本类型字符串类型:text、keyword(其中text是分词的)数值型:byte、short、integer、long、float、double、half_float、scaled_float布尔型:boolean日期类型:date二进制类型:binary范围类型:integer_range、long_range、float_range、double_range、date_range2.复杂类型数组类型:array对象类型:object嵌套类型:nested object原创 2021-09-04 03:25:25 · 178 阅读 · 0 评论 -
3.1 ElasticSearch映射之基本概念
1.简介映射是用来定义索引的字段与类型以及倒排索引相关配置的,类似于关系型数据库中的表结构定义。2.自定义Mapping(1).创建新索引打开kibana Dev Tools,创建一个名为people的索引。PUT /people{ "settings": { "number_of_shards": 5, "number_of_replicas": 1 }}(2).设置索引Mapping为索引people设置mapping结构。PUT /people/_mapping原创 2021-09-03 09:39:49 · 139 阅读 · 0 评论