ElasticSearch基础介绍!
ElasticSearch基础介绍!
月伴飞鱼Elasticsearch
是一个开源的搜索引擎,建立在全文搜索引擎库 Apache Lucene
基础之上。
ES用 Java 编写,内部使用 Lucene 做索引与搜索:
- 使全文检索变得简单,隐藏 Lucene 的复杂性,提供一套简单的 RESTful API。
学习资源
官网文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
中文权威指南:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
ES的限制和劣势
不适合做数据存储,不支持事务,近实时而无法保证实时性,Index建立后Mapping无法修改。
翻页查询性能较差。
作为OLAP数据库,ES可以处理复杂聚合、大规模Rollup、大规模的Key-Value查询:
- 聚合查询性能比Doris、ClickHouse、Presto等差不少
- Rollup相对于Druid来说实时性、并发能力和查询速度处于劣势
- KV并发查询能力比HBase差不少
使用规范
分片(Shard):
非日志型(搜索型、线上业务型)的 shard 容量在 20~40GB(建议在 20G)
日志型的
shard
容量在 35~100GB(建议 35G)单个
shard
的文档个数不能超过 20 亿左右(Integer.MAX_VALUE - 128
)一个节点管理的
shard
数不要超过 200 个一个索引的
shard
数一旦确定不能改变
索引(Index):
大索引需要拆分
反例:例如一个 10 多 T 的索引,按 date 查询、name 查询
正例:
index*name
拆成多个index_name*${date}
正例:
index*name
按 hash 拆分index_name*{1,2,3,...100..}
Refresh频率:
ES 的定位是准实时搜索引擎,该值默认是 1s,表示写入后 1 秒后可被搜索到,所以这里的值取决于业务对实时性的要求。
注意这里并不是越小越好,刷新频率高也意味着对 ES 的开销也大,通常业务类型在 1-5s,日志型在 30s-120s。
如果集中导入数据可将其设置为-1,ES 会自动完成数据刷新(注意完成后更改回来,否则后续会出现搜索不到数据)。
字段设计:
text
和keyword
的用途必须分清:分词和关键词(确定字段是否需要分词)确定字段是否需要独立存储
字段类型不支持修改,必须谨慎
对不需要进行聚合/排序的字段禁用
doc_values
不要在
text
做模糊搜索
text
类型:
- 适用于分词用于搜索,适用于 email 、内容、描述等需要分词的全文检索,不适用聚合。
- text 类型的字段不要使用聚合查询
- text
类型
fileddata会加大对内存的占用,如果有需求使用,建议使用
keyword
keyword
类型:
- 无需分词,整段完整精确匹配,适用于:email 、地址、状态码、分类 tags。
避免大宽表:
- ES 默认最大 1000,但建议不要超过 100
查询相关:
聚合查询避免使用过多嵌套:
- 聚合查询的中间结果和最终结果都会在内存中进行,嵌套过多,会导致内存耗尽。
基本概念
index索引
类比称mysql中的database数据库,存储数据的地方。
type类型
用于定义数据结构,类似mysql的一张表,属于index中的逻辑分类。
mapping
定义存储字段类型。
document
类比mysql中一行数据,不同之处在于es中每个文档可以有不同的字段。
field字段
类比mysql中的字段,属于es的最小单位。
正排索引
文档ID到文档内容、单词的关联关系。
倒排索引
单词到文档ID的关联关系。
倒排索引主要包含两个部分。
单词词典:
记录所有文档的单词。
记录单词到倒排列表的关联信息。
倒排列表:
- 记录了单词对应的文档集合,由倒排索引项组成。
倒排索引项包含如下信息:
- 文档ID,用于获取原始信息。
- 单词频率,记录该单词在该文档中的出现次数,用于后续相关性算分。
- 位置,记录单词在文档中的位置,用于做词语搜索。
- 偏移,记录单词在文档的开始和结束位置,用于做高亮显示。
Term和Match
Term:
- 完全匹配,精确查询,搜索前不会再对搜索词进行分词拆解。
Match:
- 搜索的时会先进行分词拆分,拆完后,再来匹配。