热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ES学习分享

一、ES是什么Elasticsearch是一个基于Apache Lucene的开源搜索引擎,通过简易的API来隐藏Lucene的复杂性。ES的基本结构包括,Cl

一、ES是什么


Elasticsearch是一个基于Apache Lucene的开源搜索引擎,通过简易的API来隐藏Lucene的复杂性。ES的基本结构包括,Cluster集群(由n个节点组成),Node实例节点,Index索引(一系列documents的集合),Shard分片(索引的数据是分配到各个分片的),Replica备份节点(相应有Primay Shard主分片)

ES架构


ES和RDMS的区别


二、ES不是什么


1、ES不是数据库,不是可靠的数据存储系统。
[Indexing] A network partition can cause in flight documents to be lost

2、ES不是实时系统,数据写入成功只是translog成功,类似mysql的binlog,同理删除数据也不是实时的。其实ES内部有一个后台线程,定时将内存的数据写入到存储引擎中。当然可以写入数据后refresh,但是会重新打开所有索引文件,需要解压和刷缓存等等,性能影响极大

3、ES不是一个强一致性的系统。也就是说同样的query多次查询的数据可能会不一致。由于shard的主分片和副本是由独立的节点去刷新的,刷新的频率并不同步,这样同样的query发送到不同的分片(主片和从片)上看到的数据是不同的,导致的结果是查询到的数据也不完全同步。简单说,ES是一个最终一致性系统


三、Mapping映射


mapping相当于数据库的表结构,决定了ES在建立倒排索引、进行检索时对文档采取的相关策略,如数字类型、日期类型、文件类型等。在写数据前ES不强制要求创建mapping,因为ES有动态识别和创建的机制,但是非常不建议使用ES的动态识别和创建的机制,因为很多情况下这并非你所需要。推荐的做法是在写数据之前仔细的创建mapping

mapping不能更新,存在的字段不能被更新和删除,不存在的字段可以添加

mapping冲突。同一索引不同类型同名字段的映射会冲突 https://www.elastic.co/blog/great-mapping-refactoring#conflicting-mappings


四、Template模板


模板是描述表结构(mapping)和表设置(setting)的数据结构,在ES中创建一个索引模板,其本质就是包含mapping及分片信息,模板中有个属性  template  表示该模板用来匹配什么样的索引。比如"template:timingsoa-*“,创建的所有以timingsoa开头的索引,将会应用这个模板,一般用来匹配按周期创建的索引,例如 timingsoa-20190417


{
"template": "timingsoa-*",
"settings": {
"index": {
"refresh_interval": "1s",
"number_of_shards": "4",
"number_of_replicas": "1"
}
},
"mappings": {
"timingsoa": {
"properties": {
"time": {
"format": "yyyy-MM-dd HH:mm:ss",
"type": "date"
},
"className": {
"type": "keyword"
},
"methodName": {
"type": "keyword"
},
"invokeNo": {
"type": "keyword"
},
"threadId": {
"type": "keyword"
},
"invokeIp": {
"type": "keyword"
},
"message": {
"analyzer": "ik_smart",
"type": "text"
},
"lineNumber": {
"type": "integer"
},
"invokeSerialNum": {
"type": "integer"
}
}
}
}
}


索引存在Linux服务器的文件系统上,背后是文件系统,不是类似HDFS的文件系统


五、Routing路由


rouing就是hash key,这个key决定写入和查询的分片id


六、Alia别名


PUT timingsoa
{
"mappings": {
"timingsoa": {
"properties": {
"time": {
"format": "yyyy-MM-dd HH:mm:ss",
"type": "date"
},
"className": {
"type": "keyword"
},
"methodName": {
"type": "keyword"
},
"invokeNo": {
"type": "keyword"
},
"threadId": {
"type": "keyword"
},
"invokeIp": {
"type": "keyword"
},
"message": {
"analyzer": "ik_smart",
"type": "text"
},
"lineNumber": {
"type": "integer"
},
"invokeSerialNum": {
"type": "integer"
}
}
},
"aliases": {
"admin_w": {},
"admin_r": {}
}
}


为什么需要别名https://www.elastic.co/guide/en/elasticsearch/guide/current/index-aliases.html


七、ES集群


1、节点发现


多播方式,也是ES的默认使用方式,但是无法跨网络组建集群。另外一种是单播方式,可以跨网络组建集群


2、主节点选举


所有配置有master:true的节点,根据节点id进行排序,然后取出第一个作为主节点


3、存活检测


有两种错误检测方式,一种是master节点ping集群中所有其他的节点来验证他们是否存活,另一种是每个节点ping master节点来验证它是否存活


4、容灾


ES中的index,首先会进行分片,每一个分片数据一般都会有自己的副本数据,ES分配分片的策略会保证同一个分片数据和自己的副本不会分配到同一个节点上

当集群中的某一节点宕机后,ES的master在ping该节点时通过一定的策略会发现该节点不存活;此时,ES开启恢复过程,恢复的策略如下:
恢复的目标是保证集群中分片的副本数不变


4.1 恢复的目标是保证集群中分片的副本数不变
4.2 如果宕机的节点上承载某分片的主分片,那么此时(恢复过程)会将该分片分配在其他节点上的某一副本提升为主分片(记住:同一分片和其副本总是不在同一节点上,保证有对应的副本可供提升的)
4.3 根据4.1保证副本数不变,如果宕机的节点承载某分片的副本,那么ES会在其他非宕机节点上用主分片复制一个副本
4.4 整个过程不影响集群的读写功能;但是由于多了复制分片和迁移分片的过程,集群的读写性能受影响


5、扩容和缩容


整个过程不影响集群的读写功能,但是由于多了复制分片和迁移分片的过程,集群的读写性能受影响


八、ES写入文档过程



图片来自https://zhuanlan.zhihu.com/p/34669354


另外ES没有原地update的能力,所有的update都是标记删除老文档。并发update同一条document,ES内部采用了乐观并发的处理,并发修改的操作直到最后要提交是才加锁检查版本号,如果发现修改之前获取的版本号已经改变(即已经被人修改),那么会抛出这个异常,然后由用户决定如何处理该异常


九、ES查询文档过程



图片来自 https://zhuanlan.zhihu.com/p/34674517


当然你可以指定perference,指定在主分片查询或者先主后副等等


十、ES索引创建过程



十一、ES新节点加入过程



十二、ES规范


12.1、Mapping设计规范


1、禁用mapping的dynamic

当 indices的mapping已经确定时(即不会改变时),强烈建议将 dynamic设置为false,这样可以避免非法数据被ES索引
2、避免不必要的tokenizer

ES在进行analyzer时,会经过以下三个步骤:character -> tokenizer -> token filer,当text不需要进行 tokenizer时,需要设置index:not_analyzed(5.X版本设置为type:keyword)

3、nested结构

结构化的JSON文档会平整成索引内的简单键值对,会造成交叉对象匹配,数据间的关联性就会丢失。而nested将list里的每个doc单独变成子文档进行存储,避免了这个问题
https://www.elastic.co/guide/en/elasticsearch/guide/master/nested-objects.html
4、列式存储doc_values(大部分type默认为true)

ES提供了doc_value属性,如果对某字段设置了doc_value,那么该字段被用来排序或者聚合的情况下,并不会加载到内存而是仍然从硬盘读取,防止OOM。实际上Lucene在构建索引时,会额外建立一个有序的基于document=>field value的映射列表

5、TTL的使用经验

ES2.X对TTL已经是deprecated, 在最新版本5.X里已经是remove了


12.2、索引设计规范


1、设置合理的number_of_shards

number_of_shards决定indices在ES集群中,如何均衡的分布在各个 data node,而使用ES进行搜索时,ES会并行的查询分布在各个data node的shard(而都在同一个节点的 shards,只能进行串行的操作),最后将各个data node返回的数据进行聚合,并返回给客户端

2、合理设置 routing key

可以通过合理设置routing key,可以避免在查询时查询多个shards。因为相同的routing key都在同一个shard

3、定期创建索引

有些业务需要定期创建索引,比如日志等

4、索引数据删除

建议基于索引删除数据,新版本已不推荐使用type,应考虑多建索引

5、Type

在很多数据能分为独立index的情况下,不要放到一个index里用type去分。但是type能减少index的数量,而且在父子文档和文档映射相似的情下,使用type更佳,因为搜索一个index下的多个type,和只搜索一个 type相比没有额外的开销,需要合并结果的分片数量是一样的
https://www.elastic.co/blog/index-vs-type


12.3、查询规范


1、search type不要用dfs_query_then_fetch,用query_then_fetch足够

这里再提下前面的ES默认查询流程,也就是scatter多分片-gather-sort,而dfs_query_then_fetch多了初始化发散(initial scatter),进行真正的查询之前,先把各个分片的词频率和文档频率收集一下,然后进行词搜索的时候,各分片依据全局的词频率和文档频率进行搜索和排名,查询效率慢但是精度高

2、尽可能的用filter,它快

3、使用scroll/scan,相当于数据库的游标方式代替深分页(size=10&from=10000)

4、不要使用post filter,post filter的内部实现相当于数据库的扫表,因此非常非常慢

5、非常不推荐依赖delete-by-query这个插件做删除操作

性能很差,对集群也有不良影响,推荐按日期去建索引,速度快、性能高


十三、其他


1、倒排索引

倒排索引一般表示为一个关键词,然后是它的频度,位置等,类似图书的目录

2、TF-IDF

词频(TF)表示一个给定词语t在给定文档d中出现的概率,概率越高重要程度越高

文档频率(DF)表示文档集中包含给定词语t的所有文档数目,显然TF越高同时DF越小区分度就越高。反之,就类似停止词,"你,是,的"等等




推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • ElasticSerach初探第一篇认识ES+环境搭建+简单MySQL数据同步+SpringBoot整合ES
    一、认识ElasticSearch是一个基于Lucene的开源搜索引擎,通过简单的RESTfulAPI来隐藏Lucene的复杂性。全文搜索,分析系统&# ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 2018深入java目标计划及学习内容
    本文介绍了作者在2018年的深入java目标计划,包括学习计划和工作中要用到的内容。作者计划学习的内容包括kafka、zookeeper、hbase、hdoop、spark、elasticsearch、solr、spring cloud、mysql、mybatis等。其中,作者对jvm的学习有一定了解,并计划通读《jvm》一书。此外,作者还提到了《HotSpot实战》和《高性能MySQL》等书籍。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 在IDEA中运行CAS服务器的配置方法
    本文介绍了在IDEA中运行CAS服务器的配置方法,包括下载CAS模板Overlay Template、解压并添加项目、配置tomcat、运行CAS服务器等步骤。通过本文的指导,读者可以轻松在IDEA中进行CAS服务器的运行和配置。 ... [详细]
  • 项目运行环境配置及可行性分析
    本文介绍了项目运行环境配置的要求,包括Jdk1.8、Tomcat7.0、Mysql、HBuilderX等工具的使用。同时对项目的技术可行性、操作可行性、经济可行性、时间可行性和法律可行性进行了分析。通过对数据库的设计和功能模块的设计,确保系统的完整性和安全性。在系统登录、系统功能模块、管理员功能模块等方面进行了详细的介绍和展示。最后提供了JAVA毕设帮助、指导、源码分享和调试部署的服务。 ... [详细]
  • 部署新项目报错
    问题1:Java-suorce语言版本支持不对打开file在modules中选择8版本问题2:依赖jar包不对,重新下载maven ... [详细]
  • 这篇文章给大家介绍怎么从源码启动和编译IoTSharp ,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。IoTSharp项目是 ... [详细]
author-avatar
个信2602881723
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有