倒排索引,它也是索引。索引,初衷都是为了快速检索到你要的数据。html
我相信你必定知道mysql的索引,若是对某一个字段加了索引,通常来讲查询该字段速度是能够有显著的提高。 每种数据库都有本身要解决的问题(或者说擅长的领域),对应的就有本身的数据结构,而不一样的使用场景和数据结构,须要用不一样的索引,才能起到最大化加快查询的目的。 对 Mysql 来讲,是 B+ 树,对 Elasticsearch/Lucene 来讲,是倒排索引。mysql
刚刚胖滚猪说到图书的例子,目录和索引页,其实就很形象的能够比喻为正排索引和倒排索引。为了进一步加深理解,再看看熟悉的搜索引擎。没有搜索引擎时,咱们只能直接输入一个网址,而后获取网站内容,这时咱们的行为是document -> words。此谓「正向索引」。后来,咱们但愿可以输入一个单词,找到含有这个单词,或者和这个单词有关系的文章,即word -> documents。因而咱们把这种索引,叫「反向索引」,或者「倒排索引」。 好了,咱们来总结一下:git
假如一篇文章当中,有这么一段话"胖滚猪编程让你收获快乐",我要经过"胖滚猪"这个词来搜索到这篇文章,那么应该如何实现呢。es6
咱们是很容易想到,能够将这篇文章的词都拆开,拆分为"胖滚猪"、"编程"、"收获"、"快乐"。注意咱们把没用的词,好比"让"去掉了。这个拆分短语的过程涉及到ES的分词,另外中文分词仍是比较复杂的,不像英文分词通常用空格分隔就能够。等会咱们再来讲分词吧,如今你只要知道,咱们是会按必定规则把文章单词拆分的。 那么拆开了,怎么去找呢?天然会维护一个单词和文档的对应关系,如图:github
倒排索引的核心组成正则表达式
一、单词词典:记录全部文档的单词,通常都比较大。还会记录单词到倒排列表的关联信息。 二、倒排列表:记录了单词对应的文档集合,由倒排索引项组成。倒排索引项包含以下信息:sql
下图是 Elasticsearch 中数据索引过程的流程。ES由 Analyzer 组件对文档执行一些操做并将具体子句拆分为 token/term,简单说就是分词,而后将这些术语做为倒排索引存储在磁盘中。 数据库
ES的JSON文档中的每个字段,都有本身的倒排索引,固然你能够指定某些字段不作索引,优势是这样能够节省磁盘空间。可是不作索引的话字段没法被搜索到。 注意两个关键词:分词和倒排索引。倒排索引我相信你已经懂了!分词咱们立刻就来聊聊!编程
仍是回到咱们开头的那个查询例子,毕竟胖滚猪心心念念为何会搜出两个文档!首先咱们用_analyze来分析一下ES会如何对它进行分词及倒排索引: json
如今你是否是一目了然了呢!先无论_analyze是何方神圣,反正你看到结果了,ES将它分红了一个个字,这是ES中默认的中文分词。掌握分词要先懂两个名词:analysis与analyzer
** analysis:**
文本分析,是将全文本转换为一系列单词的过程,也叫分词。analysis是经过analyzer(分词器)来实现的,可使用Elasticearch内置的分词器,也能够本身去定制一些分词器。
** analyzer(分词器): **
由三部分组成:
注意:除了在数据写入时将词条进行转换,查询的时候也须要使用相同的分析器对语句进行分析。即咱们写入苹果的时候分词成了苹和果,查询苹果的时候一样也是分词成苹和果去查。
ES内置分词器
看概念太虚了!必定要动手实操才有用!咱们能够用_analyze进行分析,会输出分词后的结果,举两个例子吧!其余的你也要本身课后动手试试哦!
#默认分词器 按词切分 小写处理
GET _analyze
{
"analyzer": "standard",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
#能够发现停用词被去掉了
GET _analyze
{
"analyzer": "stop",
"text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}
复制代码
中文扩展分词器
如今来解决胖滚猪的问题,苹果明明一个词,不想让它分为两个呀!中文分词在全部搜索引擎中都是一个很大的难点,中文的句子应该是切分红一个个的词,可是一句中文,在不一样的上下文,实际上是不一样的理解,例如: 这个苹果,不大好吃/这个苹果,不大,好吃。
有一些比较不错的中文分词插件:IK、THULAC等。咱们能够试试用IK进行中文分词。
#安装插件
https://github.com/medcl/elasticsearch-analysis-ik/releases
在plugins目录下建立analysis-ik目录 解压zip包到当前目录 重启ES
#查看插件
bin/elasticsearch-plugin list
#查看安装的插件
GET http://localhost:9200/_cat/plugins?v
复制代码
** IK分词器:支持自定义词库、支持热更新分词字典 **
curl -X GET "localhost:9200/_analyze?pretty" -H 'Content-Type: application/json' -d'
{
"analyzer" : "ik_max_word",
"text" : "这个苹果不大好吃"
}
'
复制代码
** 如何使用分词器 **
列举了不少的分词器,那么在实际中该如何使用呢?看看下面这个代码演示就懂啦!
# 建立索引时候指定某个字段的分词器
PUT iktest
{
"mappings": {
"properties": {
"content": {
"type": "text",
"analyzer": "ik_smart"
}
}
}
}
# 插入一条文档
PUT iktest/_doc/1
{
"content":"这个苹果不大好吃"
}
# 测试分词效果
GET /iktest/_analyze
{
"field": "content",
"text": "这个苹果不大好吃"
}
复制代码
注:本文来源于公众号[胖滚猪学编程],其中卡通形象来源于微信表情包"胖滚家族",且已获做者的许可。
本文转载自公众号【胖滚猪学编程】 用漫画让编程so easy and interesting!欢迎关注
形象来源于微信表情包【胖滚家族】喜欢能够下载哦