ElasticSearch
E:EalsticSearch 搜索和分析的功能
L:Logstach 搜集数据的功能,类似于flume(使用方法几乎跟flume一模一样),是日志收集系统
K:Kibana 数据可视化(分析),可以用图表的方式来去展示,文不如表,表不如图,是数据可视化平台
1.索引
通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。
1.1.正向索引
- 这种组织方法在建立索引的时候结构比较简单,建立比较方便且易于维护
若是有新的文档加入,直接为该文档建立一个新的索引块,挂接在原来索引文件的后面。若是有文档删除,则直接找到该文档号文档对应的索引信息,将其直接删除
1.2.反向索引
倒排索引
1.3.倒排索引的组成
单词词典、倒排列表
- ·倒排表以字或词为关键字进行索引,表中关键字所对应的记录表项记录了出现这个字或词的所有文档。一个表项就是一个字段,它记录该文档的ID和字符在该文档中出现的位置情况
1.4.索引的更新策略
常用的索引更新策略主要有四种:完全重建策略、再合并策略、原地更新策略及混合策略。
2.分词器
2.1.定义
- 文本分析是把全文本转换一系列单词(term/token)的过程,也叫分词。Analysis是通过Analyzer来实现的。
- 分词器的作用就是把整篇文档,按一定的语义切分成一个一个的词条,目标是提升文档的召回率 并降低无效数据的噪音。
- recall召回率,也叫可搜索性,指搜索的时候,增加能够搜索到的结果的数量。
- 降噪:指降低文档中一些低相关性词条对整体搜索排序结果的干扰。
2.2.组成
- 分析器(analyzer)都由三种构件块组成的: character filters,tokenizers,token filters
- character filters字符过滤器
在一段文本进行分词之前,先进行预处理
比如说最常见的就是,过滤html标签(hello --> hello),& --> and (l&you -->l and you) - tokenizers分词器
英文分词可以根据空格将单词分开,中文分词比较复杂,可以采用机器学习算法来分词。
token filters Token过滤器
将切分的单词进行加工。
大小写转换(例将“Quick"转为小写),去掉词(例如停用词像"a"、“and"、 “the"等等),或者增加词(例如同义词像"jump"和"leap”)
- character filters字符过滤器
- analyzer = CharFilters (0个或多个) +Tokenizer(恰好一个)+TokenFilters(0个或多个)
2.3.内置分词器
2.4.中文分词器
3.ES数据存储结构
3.1.索引Index
索引是文档(Document)的容器,是一类文档的集合
索引(名词)
- 类比传统的关系型数据库领域来说,索引相当于SQL中的一个数据库(Database)
- 索引由其名称(必须为全小写字符)进行标识。
索引(动词) - 保存一个文档到索引(名词)的过程。
- 这非常类似于SQL语句中的INSERT关键词。如果该文档已存在时那就相当于数据库的UPDATE。
索引(倒排索引) - 关系型数据库通过增加一个B+树索引到指定的列上,以便提升数据检索速度。
- 索引ElasticSearch 使用了一个叫做倒排索引的结构来达到相同的目的。
3.2.类型Type
从6.0.0开始单个索引中只能有一个类型,7.0.0以后将将不建议使用,8.0.0以后完全不支持。
索引和文档中间还有个类型的概念,每个索引下可以建立多个类型,文档存储时需要指定index和type
3.3.文档Document
3.4.字段Field
- 先了解下restful中GET/PUT/POST/DELETE格式
POST /uri #创建
DELETE/uri/xxx #删除
PUT /uri/xxx #更新或创建
GET /uri/xxx #查看 - 在ES中,如果不确定文档的ID,那么就需要用POST,它可以自己生成唯一的文档ID。如果确定文档的ID,那么就可以用PUT,当然也可以用POST,它们都可以创建或修改文档PUT、GET、DELETE是幂等的,而POST并不一定是幂等。
4.ES的基本命令
4.1.集群相关命令
4.2.索引CRUD命令
创建是命名全部小写,不能使用_开头,中间不能使用,
- 创建lndex
curl -XPUT http://192.168.58.161:9200/shsxt?pretty - 获取索引
curl -XGET http://192.168.58.161:9200/shsxt?pretty - 删除索引
curl -XDELETE http://192.168.58.161:9200/shsxt?pretty
4.3.映射Mapping
详细可查官方文档
4.4. head安装head使用
Elasticsearch插件推荐:cerebro
5.ES分片与备份
分片分为两种,主分片和副本:
- 主分片用于解决数据水平扩展的问题,通过分片,可以将数据分布到集群内的所有节点之上
一个分片是一个运行的ES实例
分片数在索引创建时指定,后续不允许修改,除非Reindex。副本用以解决数据高可用的问题,副本是主分片的拷贝 - 副本分片数,可以动态调整
增加副本数,还可以在一定程度上提高服务的可用性(读取的吞吐)
分片的设定工
- 分片设置过大,数量少
导致后续无法增加节点实现水平扩展
单个分片数据量过大,导致数据重新分片耗时 - 分片设置过小,数量多
影响搜索结果的相关性打分,影峒统计结果的准确性-单个节点上过多分片,会导致资源浪费,同时会影响性能- 7.0之后,默认主分片是1,解决了over-sharding的问题
shard也是一种资源,shard过多会影响集群的稳定性。因为shard过多,元信息会变多,这些元信息会占用堆内存。
shard过多也会影响读写性能,因为每个读写请求都需要一个线程。
6.ES数据架构
名词类比HBaseo
Shard – Region
Lucene – buffer --系统缓存
Segment – MemStore
写出Segment file --stroefile
Translog --Hlog
7.Docker,Windows,Linux下安装Elasticsearch
可以参考这篇:
https://blog.csdn.net/weixin_44991304/article/details/120578494
8.ES对外接口
集成Springboot
及项目实战:推荐狂神
1)JAVA API接口
http://www.ibm.com/developerworks/library/j-use-elasticsearch-java-apps/index.html
2)RESTful API接口
常见的增、删、改、查操作实现:
http://blog.csdn.net/laoyang360/article/details/51931981