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 会自动完成数据刷新(注意完成后更改回来,否则后续会出现搜索不到数据)。

字段设计:

textkeyword 的用途必须分清:分词和关键词(确定字段是否需要分词)

确定字段是否需要独立存储

字段类型不支持修改,必须谨慎

对不需要进行聚合/排序的字段禁用 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:

  • 搜索的时会先进行分词拆分,拆完后,再来匹配。