其他分享
首页 > 其他分享> > ElasticSearch全流程是啥,看这篇我也懂了

ElasticSearch全流程是啥,看这篇我也懂了

作者:互联网

ES是什么

核心概念

使用全流程

schema(mapping)

es不需要前置的schema定义,在索引doc时确定schema

因为es数据的交互形式是json,所以doc可以开箱即用,在写入doc时如果没有预先定义的mapping,doc的每一个field会根据传过来的json数据确定类型,默认规则(dynamic field mapping)如下:

json类型

es类型

null

不会增加field

boolean

boolean

string

date(通过Date detection)double/long(通过Numeric detection)text(带keyword的sub field)

number

float/long

object

Object

array

array(array的item类型取决于第一个非null元素的类型)

同时es还支持定义模板 dynamic_template,来对默认的规则进行扩充、修改,例如下例就是修改了默认的string映射:

{

  "mappings": {

    "dynamic_templates": [

      {

        "strings_as_keywords": {

          "match_mapping_type": "string",

          "mapping": {

            "type": "text"

          }

        }

      }

    ]

}

不过如果没有动态字段的需求,个人不建议使用es的dynamic mapping,使用不当的话会污染mapping,所以可以指定 dynamic为false来关闭动态mapping。

当然可以使用put mapping api来预定义index的mapping结构,包括字段类型、使用的分析器(text类型)、是否索引等等。

es官方也非常推荐将相同的字段以不同的方式索引到es中,例如一个字符串类型的值可以使用索引成text类型来进行全文检索,也可以索引成keyword类型进行排序、聚合。

建议使用别名(alias),es对mapping的拓展是开放的,但对mapping的修改是禁止的。例如,可以为mapping增加一个字段,但是不能删除/修改字段。所以使用alias指向真正的index,这样,在有field需要修改的场景可以使用reindex api重建索引、再使用alias api更改指向,可以实现无缝的切换。

数据写入

分布式写入流程

ElasticSearch全流程,看这篇我也懂了

可以看到,es写入的总延时等于写入主节点的时间+max(写入从节点的时间)。

Shard 写入流程

ElasticSearch全流程,看这篇我也懂了

比较重要的三个概念

写入优化

读取

Search

使用search api可以很方便的实现数据的检索。es提供了很多search api,例如match_query,term_query等等,可以很方便的组装query DSL(Domain Specific Language),且开发人员不需要考虑DSL中query的顺序,dsl中query的顺序不会影响最后的执行效率,真正的执行顺序会在CBO(Cost Based Optimizer)后进行重排。

ElasticSearch全流程,看这篇我也懂了

Aggregation

Sort

不要使用text字段作为排序字段,text字段一般用分析器进行分词,对text字段做排序往往得不到预期的结果

ES返回的doc默认会按照_score(文档相关性)降序排列,即算分后的分数值,如果指定了其他的Sort字段,就会按照指定的字段排序。同样支持script,来构造比较复杂的排序规则。

_score,评分的计算依赖于不同的query方式,例如对于fuzzy查询会计算与检索词拼写的相关程度,term查询会计算内容和关键词间的百分比等等。但是一般意义上我们说的全文搜索是指计算内容与关键词的相关程度,ElasticSearch的相似度算法使用 TF/IDF,即词频/逆文档频率,包括以下内容:

Page

1.基于offset的分页

ElasticSearch全流程,看这篇我也懂了

  1. client发起请求,收到请求的shard成为协调节点,负责后续请求数据的合并
  2. 执行query,取到from+size大小的结果集,协调节点本地构建构建大小为from+size的priority queue ,协调节点将请求分发到其他shard
  3. 其他shard 同样执行query,取到from+size大小的结果集,将集合返给协调节点
  4. 协调节点合并结果集,最后得到from+size大小的priority queue,将后size个数据返给client

2.基于cursor的分页 scroll

3.search_after

读取优化

标签:流程,mapping,这篇,索引,字段,ElasticSearch,query,es,size
来源: https://blog.csdn.net/Socesoft888/article/details/121478468