1、ES基础概念

  • 搜索引擎 search engine

  • 近实时 (Near) Real Time Search

  • RESTful API

  • 分布式、高可用

  • 面向文档存储,json格式

  • 基于Apache Lucene

2、核心概念

  • Cluster 集群

  • Node 构成集群的单机节点

  • Index 索引

  • Shard 分片

  • Replica 副本

  • Segment 分段

  • Document 文档

  • Field 字段

  • Inverted Index 倒排索引

  • Text / Keyword 类型

3、使用全流程

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更改指向,可以实现无缝的切换。

数据写入

分布式写入流程

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

Shard 写入流程

比较重要的三个概念

  • refresh

  • flush

  • fsync todo:是否会丢数据

写入优化

  • 使用bulk api批量操作

  • 调整refresh_interval的间隔,es在每一次refresh时都会创建lucene的segment,并尝试进行segment的合并,开销较大,若对搜索的实时性要求不高,可以适当的调大refresh_interval的大小

  • 不需要索引的字段指定index属性为not_analyzed

  • SSD(经典性能不行,硬件来凑)

读取

Search

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

  • term index 使用FST(Finite State Machines) -> 定位倒排链

  • SkipList -> 合并倒排链

Aggregation

  • Metrics 将query命中的数据集进行count,max等操作,是一个单一的数值

  • Bucket 将query命中的数据集再按条件分为更小的数据集合,再在这些小集合上执行Metrics,可以类比于sql中的group by

Sort

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

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

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

  • 词频:检索词在该字段出现的频率。出现频率越高,相关性也越高。字段中出现过5次要比只出现过1次的相关性高。

  • 逆文档频率:每个检索词在索引中出现的频率。频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低, 即检验一个检索词在文档中的普遍重要性。

  • 字段长度准则 : 字段的长度是多少?长度越长,相关性越低。检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段相关性更高。

Page

1.基于offset的分页

  • from + size,from指定偏移量,size指定要取的数据条数

  • 执行原理:

  1. client发起请求,收到请求的shard成为协调节点,负责后续请求数据的合并

  2. 执行query,取到from+size大小的结果集,协调节点本地构建构建大小为from+size的priority queue ,协调节点将请求分发到其他shard

  3. 其他shard 同样执行query,取到from+size大小的结果集,将集合返给协调节点

  4. 协调节点合并结果集,最后得到from+size大小的priority queue,将后size个数据返给client

  • 特点:支持随机分页访问 不适合用在feed无限下拉场景,在分页的边界可能存在数据重复的可能性 随着from的增大,开销也逐渐增大,不适合深度分页的场景

2.基于cursor的分页 scroll

  • 针对这次请求将符合条件的所有结果汇集到协调节点缓存起来,后续直接从协调节点的缓存中取出

  • 由于缓存的存在,文档后续的变更并不会同步到缓存中,并不适合实时请求

  • 同样因为缓存的数据量为query命中的所有doc,所以scroll的堆内存开销是非常大的

  • 适用于索引的重建/数据的迁移等非实时、低频的场景

3.search_after

  • 使用上一页的检索结果来帮助检索下一页,排序字段里要包括doc的唯一标识,以保证search_after的一致性

  • 每一个shard请求的数据集大小为size

  • 不支持随机分页访问

  • 实时处理,若doc有变更且影响到了排序因子,有可能出现重复数据

读取优化

  • 没有范围查找需求的number类型字段,类型定义为keyword

  • 慎用wildcard query,尽量使用分词后的结果使用match query,有使用wildcard query的需求,注意字符转义

  • 搜索词的长度要做限制

  • feed流场景使用search_after

  • 不需要得分的字段用filter context替换query content,query和filter区别

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

ElasticSearch知识点整理,值得收藏!相关推荐

  1. ElasticSearch 知识点整理(深入)

    Elasticsearch是如何实现Master选举的? Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单 ...

  2. ElasticSearch 知识点整理(入门)

    1:es介绍 Elasticsearch是一个基于Lucene的实时的分布式搜索和分析引擎.设计用于云计算中, 能够达到实时搜索,稳定,可靠,快速,安装使用方便.基于RESTful接口. 普通请求是. ...

  3. 简单分享一个jq知识点,值得收藏

    has_filter_not filter 过滤 对已经获取到的元素进行过滤not filter反义词has 拥有 直接判断子节点是否拥有符合条件的元素eg:$("div").ha ...

  4. 用心整理值得收藏的30道Python练手题(附详细答案)

    1.已知一个字符串为"hello_world_yoyo",如何得到一个队列["hello" ,"world","yoyo" ...

  5. 最值得收藏的 数字图像处理 全部知识点思维导图整理(武汉大学慕课课程)(持续更新中)

    本文的思维导图根据慕课上的武汉大学数字图像处理国家精品课程整理而来并标记出重点内容 思维导图就整理了这么多,之后应该也不会更新此内容了, 有需要的可以去 我的主页 了解更多学科的精品思维导图整理 本文 ...

  6. 最值得收藏的 C++ 清华大学郑莉版全部知识点思维导图整理, 东南大学软件工程初试906科目

    本文的思维导图根据清华大学郑莉出版的C++书籍整理而来并标记出重点内容,适用于想考东南大学软件工程906的同学 思维导图源文件已经发布在我的资源当中, 点击获取全部导图和配套OneNote笔记, 有需 ...

  7. 最值得收藏的 数据结构 全部知识点思维导图整理(王道考研), 附带经典题型整理

    本文的思维导图根据王道的数据结构书本整理而来并标记出重点内容,包括了知识点和部分课后习题 思维导图源文件已经发布在我的资源当中, 点击获取全部导图和配套OneNote笔记, 有需要的可以去 我的主页 ...

  8. Windows常用必备软件整理,太全了,值得收藏

    目录 1.Office系列 2.杀毒软件 3.视频播放和视频处理 4.音乐播放 5.压缩解压 6.输入法 7.PDF阅读软件 8.文件加密 9.网盘 10.社交聊天 11.日常办公软件 ‍12.图片/ ...

  9. 不仅有史上最详细Docker 安装Minio Client,还附带解决如何设置永久访问和永久下载链接!!(详图)绝对值得收藏的哈!!!!

    背景: 这两天在整理知识点,然后在学习Minio,一开始遇到更新,整了我不少时间,之前用的太久了,改了不少东西.用了之后发现不知道怎么设置成永久访问,就出了这篇文章. 史上最详细Docker安装最新版 ...

最新文章

  1. 对互联网用户分类的思考
  2. php kuozhan
  3. vc 获取月份的天数_「青少年编程」课程:输入年份与月份,得到该月有多少天...
  4. 华为12月份鸿蒙适配mate40,华为:Mate40系列在12月可优先升级鸿蒙系统
  5. 最大子序和—leetcode53
  6. Merge Two Sorted Lists LeetCode
  7. node服务成长之路
  8. 03、动态代理--CGLib引入增强
  9. Ubuntu根目录下各文件的功能介绍
  10. Java中3DES加密解密示例
  11. redis zset转set 反序列化失败_7000字 Redis 超详细总结、笔记!建议收藏
  12. hdoj_1421搬寝室
  13. Linux mint 14下的powerDNS+mysql+powerAdmin搭建个性DNS域名解析服务器
  14. 盘点OLCF的超级计算机
  15. 蓝宝石rx470d原版bios_AMD又能开核?刷完BIOS后性能白给,这次血赚了
  16. 实用win7桌面小工具
  17. php获取alexa世界排名值的函数
  18. unity 将 .prefab 转换为 txt 格式
  19. webrtc 搭建直播平台
  20. V模型,W模型,H模型介绍

热门文章

  1. MemCache 分布式缓存
  2. 这就是搜索引擎:核心技术详解
  3. halcon 圆环类缺陷检测的一种方法(极坐标变换法)
  4. java web项目_[适合初中级Java程序员修炼手册从0搭建整个Web项目](二)
  5. 熟悉linux系统内核,[科普] Linux 的内核与 Linux 系统之间的关系
  6. java axmlprinter_安卓xml配置文件解析工具-AXMLPrinter2.jar(androidmanifest.xml 反编译)下载官方最新版-西西软件下载...
  7. js映射 nginx_浅析nginx刚刚发布的JavaScript能力nginScript
  8. gitlab备份及恢复
  9. 使用python的openpyxl模块操作excel
  10. 学号20145220《信息安全系统设计基础》第12周学习总结