Elasticsearch 心得

Elasticsearch 简介

Elasticsearch 是一个实时的分布式搜索和分析引擎,它和 solr 相似,都是基于 Lucene 实现,它们使用 Lucene 作为内部引擎,在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理,它们和 Lucene 的关系大概类似于 Spring Boot 和 Spring Framework 的关系。 对 solr 不是很了解,二者在使用上没有太大差异,solr 在实现分布式搜索的时候需要引入 Zookeeper ,而 Elasticsearch 自身就可以通过配置实现分布式搜索。在一般情况下,sorl 的搜索表现更好,但是在对于数据实时性要求较高或者数据量较大的时候,Elasticsearch 的表现会更佳。

基本操作

  • 创造一个索引
curl -X PUT \
  'http://sandog1:9200/es_learn?pretty=' \
  -H 'Content-Type: application/json' \
  -d '{
    "settings":{
        "number_of_shards":3,
        "number_of_replicas":1
    }
}'

  • 插入一条数据

curl -X POST \
  http://sandog1:9200/es_learn/_doc \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "Daenerys",
    "weapon": "dragon",
    "movement": "dragon-fire beautiful"
}'
  • 获取一条数据
curl -X GET http://sandog1:9200/es_learn/_doc/id2
  • 搜索数据

curl -X POST \
  http://sandog1:9200/es_learn/_search \
  -H 'Content-Type: application/json' \
  -d '{
    "query": {
        "match" : {
            "movement": "dragon-fire-beautiful"
        }
    }
}'

基本概念

  • Term

索引里最小的存储和查询单元,对于英文来说一般指一个单词,对于中文来说一般指一个分词后的词。

  • 词典

Term的集合,词典的数据结构可以有很多种,每一种都有自己的优缺点。默认使用 FST ,其有更好的数据压缩率和查询效率。

  • 倒序表

一篇文章通常由多个词组成,倒序表记录的是某个词在哪些文章中出现过

  • 正向信息

原始的文档信息,可以用来做排序、聚合、展示

索引中最小的独立存储单元,一个索引文件由一个或者多个段组成,在Lucene 中段有不变性,也就是段一旦生成,在其上只能有读操作,不能有写操作。

查询流程

Elasticsearch 为了能快速找到某个 Term ,将所有的 Term 排个序形成词典,二分法查找term,logN的查找效率,就像通过字典查找一样。现在再看起来,似乎和传统数据库通过B-Tree的方式类似啊,为什么说比B-Tree的查询快呢?

B-Tree通过减少磁盘读取次数来提高查询性能,Elasticsearch也是采用同样的思路,直接通过内存查找Term,不读磁盘,但是如果 Term 太多,词典 也会很大,放内存不现实,于是有了Term Index,就像字典里的索引页一样,A开头的有哪些term,分别在哪页,可以理解term index是一颗树

这棵树不会包含所有的 Term ,它包含的是 Term 的一些前缀。通过Term Index 可以快速地定位到词典的某个offset,然后从这个位置再往后顺序查找。

定位到 Term 后,再根据 倒序表 找到相关文档。

词典及倒叙索引的例子

原始文档:

ID Name Age Sex
1 Kate 24 Female
2 John 24 Male
3 Bill 29 Male

Field Name 的词典 及倒序表

Term Posting List
Kate 1
John 2
Bill 3

Field Age 的词典及倒序表

Term Posting List
24 [1,2]
29 3

Field Sex 的词典及倒序表

Term Posting List
Female 1
Male [2,3]

分段存储

Es 在搜索中引入了段的概念,每个段都是一个独立的可被搜索的数据集,并且段具有不变性,一旦索引的数据被写入硬盘,就不可再修改。
由于每次新增数据都会新增一个段,所以长时间的积累,会导致在索引中存在大量的段,当索引中段的数量太多时,不仅严重损耗服务器资源,还会影响检索性能。所以会定期进行段合并操作。

数据的删除是在 .del 文件中存储被删除的数据id,数据的更新则是删除和新增操作的组合。

索引写入流程

  1. 数据被写入时候,并没有直接写到硬盘中,而是被暂时被写到内存中,Lucene 默认是一秒钟,或者当内存中的数据达到一定的阶段时,再批量提交到硬盘中,通过延迟写的策略,可以减少往硬盘上写的次数,从而提高整体写入性能
  2. 达到触发条件后,会将内存中缓存的数据一次性写入硬盘,并形成提交点。提交点就是用来记录所有提交后的段信息的文件,一个段一旦拥有提交点,这说明这个段只有读的权限,失去了写的权限;相反,当段在内存中时,就只有写数据的权限,不具备读数据的权限,也就无法被检索到。
  3. 清空内存,等待新的数据写入

修改写入内存周期


curl -X PUT \
  http://sandog1:9200/es_learn/_settings \
  -H 'Content-Type: application/json' \
  -d '{
"index" : {
"refresh_interval" : "1s"
}
}'

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355