| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -19,7 +19,7 @@ | |||
| 19 | 19 | ||
| 20 | 20 | ### 搜索引擎 | |
| 21 | 21 | - [es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?](/docs/high-concurrency/es-architecture.md) | |
| 22 | - - [es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?](/docs/high-concurrency/es-write-query-search.md) | ||
| 22 | + - [es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?](/docs/high-concurrency/es-write-query-search.md) | ||
| 23 | 23 | - [es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?](/docs/high-concurrency/es-optimizing-query-performance.md) | |
| 24 | 24 | - [es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片?](/docs/high-concurrency/es-production-cluster.md) | |
| 25 | 25 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,5 +1,5 @@ | |||
| 1 | 1 | ## 面试题 | |
| 2 | - es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊? | ||
| 2 | + es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗? | ||
| 3 | 3 | ||
| 4 | 4 | ## 面试官心理分析 | |
| 5 | 5 | 问这个,其实面试官就是要看看你了解不了解 es 的一些基本原理,因为用 es 无非就是写入数据,搜索数据。你要是不明白你发起一个写入和搜索请求的时候,es 在干什么,那你真的是...... | |
@@ -74,4 +74,46 @@ translog 其实也是先写入 os cache 的,**默认每隔5秒**刷一次到 | |||
| 74 | 74 | ||
| 75 | 75 | 如果是更新操作,就是将原来的 doc 标识为 `deleted` 状态,然后新写入一条数据。 | |
| 76 | 76 | ||
| 77 | - 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`。 | ||
| 77 | + 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`。 | ||
| 78 | + | ||
| 79 | + ### 底层 lucene | ||
| 80 | + 简单来说,lucene 就是一个 jar 包,里面包含了封装好的各种建立倒排索引的算法代码。我们用 Java 开发的时候,引入 lucene jar,然后基于 lucene 的 api 去开发就可以了。 | ||
| 81 | + | ||
| 82 | + 通过 lucene,我们可以将已有的数据建立索引,lucene 会在本地磁盘上面,给我们组织索引的数据结构。 | ||
| 83 | + | ||
| 84 | + ### 倒排索引 | ||
| 85 | + 在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。 | ||
| 86 | + | ||
| 87 | + 那么,倒排索引就是**关键词到文档** ID 的映射,每个关键词都对应着一系列的文件,这些文件中都出现了关键词。 | ||
| 88 | + | ||
| 89 | + 举个栗子。 | ||
| 90 | + | ||
| 91 | + 有以下文档: | ||
| 92 | + | ||
| 93 | + | DocId | Doc | | ||
| 94 | + |---|---| | ||
| 95 | + | 1 | 谷歌地图之父跳槽 Facebook | | ||
| 96 | + | 2 | 谷歌地图之父加盟 Facebook | | ||
| 97 | + | 3 | 谷歌地图创始人拉斯离开谷歌加盟 Facebook | | ||
| 98 | + | 4 | 谷歌地图之父跳槽 Facebook 与 Wave 项目取消有关 | | ||
| 99 | + | 5 | 谷歌地图之父拉斯加盟社交网站 Facebook | | ||
| 100 | + | ||
| 101 | + 对文档进行分词之后,得到以下**倒排索引**。 | ||
| 102 | + | ||
| 103 | + | WordId | Word | DocIds | | ||
| 104 | + |---|---|---| | ||
| 105 | + | 1 | 谷歌 | 1,2,3,4,5 | | ||
| 106 | + | 2 | 地图 | 1,2,3,4,5 | | ||
| 107 | + | 3 | 之父 | 1,2,4,5 | | ||
| 108 | + | 4 | 跳槽 | 1,4 | | ||
| 109 | + | 5 | Facebook | 1,2,3,4,5 | | ||
| 110 | + | 6 | 加盟 | 2,3,5 | | ||
| 111 | + | 7 | 创始人 | 3 | | ||
| 112 | + | 8 | 拉斯 | 3,5 | | ||
| 113 | + | 9 | 离开 | 3 | | ||
| 114 | + | 10 | 与 | 4 | | ||
| 115 | + | .. | .. | .. | | ||
| 116 | + | ||
| 117 | + 另外,实用的倒排索引还可以记录更多的信息,比如文档频率信息,表示在文档集合中有多少个文档包含某个单词。 | ||
| 118 | + | ||
| 119 | + 那么,有了倒排索引,搜索引擎可以很方便地响应用户的查询。比如用户输入查询 `Facebook`,搜索系统查找倒排索引,从中读出包含这个单词的文档,这些文档就是提供给用户的搜索结果。 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments