mirror of
https://github.com/doocs/advanced-java.git
synced 2024-12-26 04:00:08 +08:00
docs(es): update es-write-query-search.md
ElasticSearch底层的lucene以及倒排索引
This commit is contained in:
parent
d8751a68e6
commit
2988af85b1
@ -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)
|
||||
|
||||
|
@ -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`,搜索系统查找倒排索引,从中读出包含这个单词的文档,这些文档就是提供给用户的搜索结果。
|
||||
|
Loading…
Reference in New Issue
Block a user