Elasticsearch是实时的分布式搜索分析引擎,内部使用 Lucene 做索引与搜索。
主要功能
分布式搜索引擎
大数据近实时分析引擎
产品特性高性能易用易扩展 Lucene
是基于Java语言开发的类库具有高性能、易扩展的特点具有局限性
只能基于Java语言开发类库的接口学习曲线陡峭原生并不支持水平扩展 与Lucene关系
ES是基于Lucene开发的,主要扩展点在于
支持分布式可水平扩展降低了全文检索的学习曲线可以被其他编程语言调用 生态圈 与数据库集成
单独使用ES存储与数据库并存,集成
与现有系统的集成需要考虑事务性数据更新频繁 日志分析 本地部署与水平扩展 基本概念 Index索引 介绍
索引是文档的容器,是一类文档的结合
index体现了逻辑空间的概念,每个索引都有自己的mapping定义,由于定义包含的文档的字段名和字段类型shard体现了物理空间的概念,索引中的数据分散在Shard上 索引的Mapping和Settings
Mapping定义文档字段的类型Setting定义不同的数据分布 索引的不同语义 Type 类型
7.0之前一个Index可以设置多个Types
6.0之后Type被废弃,7.0之后索引只可以设置一个Type
document 文档 介绍
ES是面向文档的,文档是所有可搜索数据的最小单位
日志中的文件项一部电影中的具体信息
文档会被序列化成JSON格式保存在ES中
每个文档都有一个Unique ID
可以自己指定也可以由ES生成
JSON文档一篇文档包含了一系列的字段。类似数据库的一条记录格式灵活不需要预先定义格式
字段的类型可以指定或者通过ES自动推算支持数组、支持嵌套 元数据
用于标注文档的相关信息
_index :文档所属的索引名_type :文档所属的类型名_id :文档唯一id_score :相关性得分_source :文档的原始JSON数据_all :整合所有字段内容到该字段,已被废除_version :文档的版本信息 分片 主分片
用来解决数据水平扩展的问题。通过主分片,可以将数据分布到集群内的所有节点之上
副本用来解决数据高可用的问题。副本分片是主分片的拷贝
副本分片数可以动态调整增加副本数可以一定程度提高服务可用性 分片的设定 分片数设定过小
后续无法增加节点实现水平扩展单个分片的数据量太大,导致数据重新分配耗时 分片数设定过大
7.0开始默认主分片设置为1,解决了over-sharding的问题
影响搜索结果的相关性打分,影响统计结果的准确性单个节点过多分片,资源浪费,牺牲性能 倒排索引 介绍 正排和倒排的区别 正排 倒排 图书和搜索引擎的类比
图书
正排索引-目录页倒排索引-英文首字母索引页
搜索引擎
正排索引-文档id到文档内容和单词的关联倒排索引-单词到文档id的关系 图片举例 核心组成 单词词典
记录所有文档的单词,记录单词和倒排列表的关联关系。
单词词典一般比较大,通过B+树或哈希拉链法实现,以满足高性能的插入与查询。
倒排列表记录了单词对应的文档结合,由倒排索引项组成
倒排索引项
文档ID
词频TF
该单词在文档中出现的次数,用于相关性评分
位置
单词在文档中分词的位置。用于语句搜索
偏移
记录单词的开始结束位置,实现高亮显示
图片举例 ES的倒排索引ES的JSON文档中每个字段都有自己的倒排索引可以指定对某些字段不做索引
优点:节省存储空间缺点:字段无法被搜索 ES和RDBMS的类比 ES分布式特性 ES分布式架构好处
存储的水平扩容提高系统可用性,部分节点停止服务整个集群的服务不受影响 ES的分布式架构
不同集群通过不同名字区分,默认名字elasticsearch通过配置文件修改一个集群多个节点 Master-eligible nodes 和Master Node
每个节点启动后默认是Master eligible节点
可以设置node.maser:false 来禁止 Master-eligible节点可以参加选主流程,成为Master节点当第一个节点启动时候,它会将自己选举为Master节点每个节点上都保存了集群的状态,只有Master节点才能修改集群状态信息
集群状态,维护了一个集群中必要的信息
所有节点信息所有索引和相关的Mapping和Setting信息分片的路由信息 任意节点都能修改信息会导致数据的不一致性 Data Node & Coordinating Node Data Node
可以保存数据的节点,叫做 DataNode。
负责保存分片的数据。
数据扩展中它是很重要的角色
Coordinating Node负责接收Client的请求,将请求分发到合适的节点,最终把结果汇集到一起。
集群的健康情况 Green主分片和副本都能正常分配
Yellow主分片全部正常分配
有副本分片未能正常分配
Red有主分片未能正常分配
文档的基本CRUD与批量操作 Create Get Index Update Bulk API每行需要指定index信息,也可以在URI中指定
mget批量读取,可以减少网络连接产生的开销
msearch批量查询
常见错误返回 Analyzer Analysis与AnalyzerAnalysis的意思是文本分析。把全文本转换为一系列单词的过程,也叫分词。
Analysis是通过Analyzer实现的,Analyzer叫分词器。
可以使用ES内置的分词器,也可以按照需求自制分词器。
除了在写入数据的时候转换词条,匹配Query语句时候也需要用相同的分析器对查询语句进行分析。
组成分词器是专门处理分词的软件,Analyzer有三部分组成
Character Filters针对原始文本进行处理,例如去除HTML
Tokenizer按照规则切分单词
Token Filter将切分的单词进行加工,小写,删除stopwords,增加同义词
步骤举例 ES内置的分词器 Standard Analyzer默认分词器按词切分小写处理 Simple Analyzer
按照非字母切分,非字母的都去除小写处理 While Space
按照空格切分
Stop Analyzer相比于Simple Analyzer多了Stop Filter 会把 the ,a,is 等修饰语去除
Keyword Analyzer不分词直接将整个当一个term输出
Pattern Analyzer通过正则分词默认是 W+ 非字符的符号进行分隔 Language Analyzer
按照语言
中文分词的难点中文句子切分成一个一个词而不是一个一个字英文中有天然的空格作为间隔一句中文,在不同的上下文中可能有不同的意思
中文分词器:ICU Analyzer
Search API URI Search 在URL中使用查询参数 通过URI Query实现搜索 Query String Syntax(语法) Request Body SearchES提供的基于JSON格式的 Query Domain Specific Language(DSL)
分页 排序 _source filtering 脚本字段 使用查询表达式 短语搜索 指定查询的索引 搜索Response Query String & Simple Query String Query String Query Simple Query String Query 搜索的相关性 Relevance Web搜索 电商搜索 衡量相关性 Precision & Recall Dynamic Mapping 和常见字段类型 Mapping 字段的数据类型 什么是Dynamic Mapping 类型的自动识别 能否更改Mapping的字段类型 控制Dynamic Mappings 显示Mapping设置与常见参数介绍 如何显示地定义一个Mapping 自定义Mapping的建议 控制当前字段是否被索引 Index Options Null Value Copy_to设置 数组类型 多字段特性及配置自定义分词器 多字段类型 Exact Values VS Full Text 自定义分词 Index Template 和 Dynamic Template 管理很多的索引 Index Template 工作方式 Dynamic Template 匹配规则参数写在最后
学习资料:极客时间课程->《ElasticSearch核心技术与实战》
课程课件地址:https://gitee.com/geektime-geekbang/geektime-ELK
学习感受:目前学了30%,感觉视频如果想连贯学习下来还是会容易分心的,必须学完几节课,然后看着课件自己整理笔记,像我这样,不然就容易忘记看过的视频都主要讲了什么。
还有就是ES的学习资源不多,这也是为数不多的课程了,ES我觉得还是先知道怎么用再来看这些吧,不然感觉底层的东西太多了,而且这个很大一部分都在介绍API的使用,实际场景可能用不到这么多。