ElasticSearch 倒排索引简析

内容概要
- 倒排索引是什么?为什么需要倒排索引?
- 倒排索引是怎么工作的?
1. 倒排索引是什么?
假设有一个交友网站,信息表如下:

美女1:“我要找在上海做 PHP 的哥哥。”
需要匹配 性别、城市、语言列。
美女2:“我要找北京的爱旅游、爱美食的 JAVA 哥哥。”
更复杂了是吧,实际场景中,会有更复杂的排列组合。
对于这类的搜索,关系型数据库的索引就很难应付了,适合使用全文搜索的倒排索引。
倒排索引是一种数据库的索引形式,存储了 “内容 -> 文档” 映射关系,目的是快速的进行全文搜索。
2. 倒排索引是怎么工作的?
主要包括2个过程:
- 创建倒排索引
- 倒排索引搜索
2.1 创建倒排索引
举个例子,有2个文档:
- Document#1
“Recipe of pasta with sauce pesto”
- Document#2
“Recipe of delicious carbonara pasta”
先对文档进行分词,形成一个个的 token,也就是 单词,然后保存这些 token 与文档的对应关系。
结果如下:

2.2 倒排索引搜索
搜索示例:
- 搜索 “pasta recipe”
先分词,得到2个 token,( “pasta”、“recipe” )。
然后去倒排索引中进行匹配。

这2个词在2个文档中都匹配,所以2个文档都会返回,而且分数相同。
- 搜索 “carbonara pasta”

同样,2个文档都匹配,都会返回。
这次 document#2 的分数要比 document#1 高。
因为 #2 匹配了2个词(“carbonara”、“pasta”),#1 只匹配了一个(“pasta”)。
2.3 转换
有时我们可以在保存和搜索之前对 token 进行一些转换,最普遍的例如:
- 扔掉停止词
停止词是那些使用量非常大,但又没有什么意义的词。
例如英文中的 “of”, “the”, “for” ……
- 元素化
把单词处理为字典中的标准词,例如:
“running” => “run”
“walks” => “walk”
“thought” =>“think”
- 词干分析
通过切断词尾将一个词转换成词根形式的过程。
不能处理不规则动词的情况,但可以处理字典中没有的词。
推荐阅读:

ElasticSearch 倒排索引简析的更多相关文章
- ElasticSearch极简入门总结
一,目录 安装es 项目添加maven依赖 es客户端组件注入到spring容器中 es与mysql表结构对比 索引的删除创建 文档的crud es能快速搜索的核心-倒排索引 基于倒排索引的精确搜索. ...
- 简析.NET Core 以及与 .NET Framework的关系
简析.NET Core 以及与 .NET Framework的关系 一 .NET 的 Framework 们 二 .NET Core的到来 1. Runtime 2. Unified BCL 3. W ...
- 简析 .NET Core 构成体系
简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...
- RecycleView + CardView 控件简析
今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...
- Java Android 注解(Annotation) 及几个常用开源项目注解原理简析
不少开源库(ButterKnife.Retrofit.ActiveAndroid等等)都用到了注解的方式来简化代码提高开发效率. 本文简单介绍下 Annotation 示例.概念及作用.分类.自定义. ...
- PHP的错误报错级别设置原理简析
原理简析 摘录php.ini文件的默认配置(php5.4): ; Common Values: ; E_ALL (Show all errors, warnings and notices inclu ...
- Android 启动过程简析
首先我们先来看android构架图: android系统是构建在linux系统上面的. 所以android设备启动经历3个过程. Boot Loader,Linux Kernel & Andr ...
- Android RecycleView + CardView 控件简析
今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
随机推荐
- H3C FTP双TCP连接方式
- GitHub使用详细流程(多人开发)
联合项目开发GIThub使用 分支 在没有使用分支之前,git会默认有一个分支, 就是主分支(master分支,还记得 git push –u origin master这个命令吗?) 这里的mast ...
- Linux 内核SBus连接
当大部分计算机配备有 PCI 或 ISA 接口总线, 大部分老式的基于 SPARC 的工作站使用 SBus 来连接它们的外设. SBus 使一个非常先进的设计, 尽管它已出现很长时间. 它意图是处理器 ...
- Linux 内核提交和控制一个 urb
当驱动有数据发送到 USB 设备(如同在驱动的 write 函数中发生的), 一个 urb 必须被 分配来传送数据到设备. urb = usb_alloc_urb(0, GFP_KERNEL); if ...
- 【34.54%】【codeforces 675E】Trains and Statistic
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- 新书《iOS编程(第6版)》抢鲜试读
我最近翻译了Big Nerd Ranch的<iOS编程(第6版)>.我用了大半年时间,尽可能做到通顺易懂.不足之处请大家多多指正.感谢辛苦审校的丁道骏同学. 这本书得过Jolt大奖,原书在 ...
- QString 转换为 char *
一.QString 转换为 char * 将 QString 转 char *,需要用到 QByteArray 类,QByteArray 类的说明详见 Qt 帮助文档. 因为 char * 最后都有一 ...
- $NOIp$提高组做题记录
对了我在这里必须讲一个非常重要的事情,就是前天也就是$2019.8.21$的傍晚,我决定重新做人了$!!$ 其实之前没怎么做$Noip$题,那就从现在开始叭
- 1029 旧键盘 (20 分)C、Java、python
题目描述 旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现.现在给出应该输入的一段文字.以及实际被输入的文字,请你列出 肯定坏掉的那些键. 输入描述: 输入在2行中分别给出应该输入的文 ...
- docker-代理服务器
配置Docker以使用代理服务器 如果容器需要使用HTTP,HTTPS或FTP代理服务器,则可以通过不同方式对其进行配置: 在Docker 17.07及更高版本中,可以 将Docker客户端配置为自动 ...