Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
晶之木
advanced-java
提交
2988af85
A
advanced-java
项目概览
晶之木
/
advanced-java
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
advanced-java
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2988af85
编写于
12月 03, 2018
作者:
Y
yanglbme
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
docs(es): update es-write-query-search.md
ElasticSearch底层的lucene以及倒排索引
上级
d8751a68
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
45 addition
and
3 deletion
+45
-3
README.md
README.md
+1
-1
docs/high-concurrency/es-write-query-search.md
docs/high-concurrency/es-write-query-search.md
+44
-2
未找到文件。
README.md
浏览文件 @
2988af85
...
...
@@ -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
)
...
...
docs/high-concurrency/es-write-query-search.md
浏览文件 @
2988af85
## 面试题
es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?
es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?
底层的 lucene 介绍一下呗?倒排索引了解吗?
## 面试官心理分析
问这个,其实面试官就是要看看你了解不了解 es 的一些基本原理,因为用 es 无非就是写入数据,搜索数据。你要是不明白你发起一个写入和搜索请求的时候,es 在干什么,那你真的是......
...
...
@@ -75,3 +75,45 @@ 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`
。
### 底层 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`
,搜索系统查找倒排索引,从中读出包含这个单词的文档,这些文档就是提供给用户的搜索结果。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录