docs(es): update es-write-query-search.md

ElasticSearch底层的lucene以及倒排索引
This commit is contained in:
yanglbme 2018-12-03 19:02:41 +08:00
parent d8751a68e6
commit 2988af85b1
2 changed files with 45 additions and 3 deletions

View File

@ -19,7 +19,7 @@
### 搜索引擎
- [es 的分布式架构原理能说一下么es 是如何实现分布式的啊)?](/docs/high-concurrency/es-architecture.md)
- [es 写入数据的工作原理是什么啊es 查询数据的工作原理是什么啊?](/docs/high-concurrency/es-write-query-search.md)
- [es 写入数据的工作原理是什么啊es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?](/docs/high-concurrency/es-write-query-search.md)
- [es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?](/docs/high-concurrency/es-optimizing-query-performance.md)
- [es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?](/docs/high-concurrency/es-production-cluster.md)

View File

@ -1,5 +1,5 @@
## 面试题
es 写入数据的工作原理是什么啊es 查询数据的工作原理是什么啊?
es 写入数据的工作原理是什么啊es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
## 面试官心理分析
问这个,其实面试官就是要看看你了解不了解 es 的一些基本原理,因为用 es 无非就是写入数据搜索数据。你要是不明白你发起一个写入和搜索请求的时候es 在干什么,那你真的是......
@ -74,4 +74,46 @@ translog 其实也是先写入 os cache 的,**默认每隔5秒**刷一次到
如果是更新操作,就是将原来的 doc 标识为 `deleted` 状态,然后新写入一条数据。
buffer 每次 refresh 一次,就会产生一个 `segment file`,所以默认情况下是 1 秒钟一个 `segment file`,这样下来 `segment file` 会越来越多,此时会定期执行 merge。每次 merge 的时候,会将多个 `segment file` 合并成一个,同时这里会将标识为 `deleted` 的 doc 给**物理删除掉**,然后将新的 `segment file` 写入磁盘,这里会写一个 `commit point`,标识所有新的 `segment file`,然后打开 `segment file` 供搜索使用,同时删除旧的 `segment file`
buffer 每次 refresh 一次,就会产生一个 `segment file`,所以默认情况下是 1 秒钟一个 `segment file`,这样下来 `segment file` 会越来越多,此时会定期执行 merge。每次 merge 的时候,会将多个 `segment file` 合并成一个,同时这里会将标识为 `deleted` 的 doc 给**物理删除掉**,然后将新的 `segment file` 写入磁盘,这里会写一个 `commit point`,标识所有新的 `segment file`,然后打开 `segment file` 供搜索使用,同时删除旧的 `segment file`
### 底层 lucene
简单来说lucene 就是一个 jar 包,里面包含了封装好的各种建立倒排索引的算法代码。我们用 Java 开发的时候,引入 lucene jar然后基于 lucene 的 api 去开发就可以了。
通过 lucene我们可以将已有的数据建立索引lucene 会在本地磁盘上面,给我们组织索引的数据结构。
### 倒排索引
在搜索引擎中,每个文档都有一个对应的文档 ID文档内容被表示为一系列关键词的集合。例如文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。
那么,倒排索引就是**关键词到文档** ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。
举个栗子。
有以下文档:
| DocId | Doc |
|---|---|
| 1 | 谷歌地图之父跳槽 Facebook |
| 2 | 谷歌地图之父加盟 Facebook |
| 3 | 谷歌地图创始人拉斯离开谷歌加盟 Facebook |
| 4 | 谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关 |
| 5 | 谷歌地图之父拉斯加盟社交网站 Facebook |
对文档进行分词之后,得到以下**倒排索引**。
| WordId | Word | DocIds |
|---|---|---|
| 1 | 谷歌 | 1,2,3,4,5 |
| 2 | 地图 | 1,2,3,4,5 |
| 3 | 之父 | 1,2,4,5 |
| 4 | 跳槽 | 1,4 |
| 5 | Facebook | 1,2,3,4,5 |
| 6 | 加盟 | 2,3,5 |
| 7 | 创始人 | 3 |
| 8 | 拉斯 | 3,5 |
| 9 | 离开 | 3 |
| 10 | 与 | 4 |
| .. | .. | .. |
另外,实用的倒排索引还可以记录更多的信息,比如文档频率信息,表示在文档集合中有多少个文档包含某个单词。
那么,有了倒排索引,搜索引擎可以很方便地响应用户的查询。比如用户输入查询 `Facebook`,搜索系统查找倒排索引,从中读出包含这个单词的文档,这些文档就是提供给用户的搜索结果。