一、正排索引与倒排索引

1、什么是正排索引呢?

  以一本书为例,一般在书的开始都会有书的目录,目录里面列举了一本书有哪些章节,大概有哪些内容,以及所对应的页码数。这样,我们在查找一些内容时,就可以通过目录来定位到这些内容大概在哪页。因此,书的目录就可以称之为正排索引(目录页)。

2、什么时倒排索引呢?

  还是以一本书为例,在有些书的最后,会有以词为单位的列表,指明了相应的词分别出现在了哪些页中,而这样的列表就称之为倒排索引(索引页)。

3、两者在搜索引擎中的对比

  正排索引:文档ID到文档内容和单词的关联;

  倒排索引:单词到文档ID的关联;

如下表所示:

文档ID 文档内容
1 mastering elasticsearch
2 elasticsearch server
3 elasticsearch stack
单词 出现次数 文档ID:出现位置
mastering 1 1:0
elasticsearch 3 1:1,2:0,3:0
server 1 2:1
stack 1 3:1

上述两表就是正排索引与倒排索引的简单结构说明。

4、倒排索引的组成

倒排索引由两部分组成:

  1)单词词典:它记录了所有文档的单词,同时记录了单词到倒排列表的关联关系。单词词典一般比较大,可以通过B+树或哈希拉链法实现,以满足高性能的插入与查询。

  2)倒排列表:它记录单词所对应的文档组合体,主要是由倒排索引项组成的。

    倒排索引项的内容包括:

      a)文档ID;

      b)词频(Term Frequency),代表单词在文档中出现的次数,用于相关性打分;

      c)位置(Position),表示单词在文档中分词的位置,用于语句搜索;

      d)偏移(Offset),记录单词开始和结束位置,用于实现高亮显示;

二、分词与分词器

1、分词:文本分析就是把全文转换成一系列单词(term/token)的过程,也叫做分词。

2、分词器:分词是通过分词器来实现的,它是专门处理分词的组件。可以使用ElasticSearch内置的分词器,也可以按需定制化分词器。

  因此,除了在数据写入时用分词器转换词条,在匹配查询语句时,也需要用相同的分词器对查询语句进行分析。

  分词器由三部分组成:

  1)Character Filters:它的主要作用是对原始文本进行处理,例如去除HTML标签;

  2)Tokenizer:主要作用是按照规则来切分单词;

  3)Token Filter:将切分好的单词进行加工,例如:小写转换、删除停用词、增加同义词;

  ElasticSearch内置了如下分词器:

  1)Standard Analyzer:默认分词器,按词切分,转小写处理;

  

  2)Simple Analyzer:按照非字母切分(符号被过滤),转小写处理;

  

  3)Stop Analyzer:停用词过滤(is/a/the),转小写处理;

  

  4)WhiteSpace Analyzer:按照空格切分,转小写处理;

  

  5)Keyword Analyzer:直接将输入当作输出,不分词;

  

  6)Pattern Analyzer:正则表达式分词,默认\W+(非字符分隔);

  

  7)Language:提供了30多种常见语言的分词器;

  

  8)Custom Analyzer:自定义分词器;

3、中文分词

  1)我们采用analysis-icu插件进行中文分词,可通过命令行:ElasticSearch-plugin install analysis-icu来安装此插件。该插件提供了Unicode支持,可以更好的支持亚洲语言。如下图所示:

  

  2)社区中还有其他很好的分词器,如下:

    a)IK:支持自定义词库,支持热更新分词字典;下载地址:https://github.com/medcl/elasticsearch-analysis-ik

    b)THULAC:THU Lexucal Analyzer for Chinese,由清华大学自然语言处理和社会人文计算实验器出的一套中文分词器;下载地址:https://github.com/microbun/elasticsearch-thulac-plugin

    大家可关注我的公众号

    

    知识学习来源:《Elasticsearch核心技术与实战》

ElasticStack学习(五):ElasticSearch索引与分词的更多相关文章

  1. ES3:ElasticSearch 索引

    ElasticSearch是文档型数据库,索引(Index)定义了文档的逻辑存储和字段类型,每个索引可以包含多个文档类型,文档类型是文档的集合,文档以索引定义的逻辑存储模型,比如,指定分片和副本的数量 ...

  2. 沉淀再出发:ElasticSearch的中文分词器ik

    沉淀再出发:ElasticSearch的中文分词器ik 一.前言   为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了 ...

  3. elasticsearch索引和映射

    目录 1. elasticsearch如何实现搜索 1.1 搜索实例 1.2 es中数据的类型 1.3 倒排索引 1.4 分析与分析器 1.4.1 什么是分析器 1.4.2 内置分析器种类 1.4.3 ...

  4. 为 Elasticsearch 添加中文分词,对比分词器效果

    转自:http://keenwon.com/1404.html 为 Elasticsearch 添加中文分词,对比分词器效果 Posted in 后端 By KeenWon On 2014年12月12 ...

  5. Elasticsearch之中文分词器插件es-ik的自定义热更新词库

    不多说,直接上干货! 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑         Java全栈大联盟       ...

  6. Elasticsearch索引(company)_Centos下CURL增删改

    目录 返回目录:http://www.cnblogs.com/hanyinglong/p/5464604.html 1.Elasticsearch索引说明 a. 通过上面几篇博客已经将Elastics ...

  7. 为Elasticsearch添加中文分词,对比分词器效果

    http://keenwon.com/1404.html Elasticsearch中,内置了很多分词器(analyzers),例如standard (标准分词器).english(英文分词)和chi ...

  8. 为Elasticsearch添加中文分词

    Elasticsearch的中文分词很烂,所以我们需要安装ik.首先从github上下载项目,解压: cd /tmp wget https://github.com/medcl/elasticsear ...

  9. elasticsearch 索引优化

    ES索引优化篇主要从两个方面解决问题,一是索引数据过程:二是检索过程.  索引数据过程我在上面几篇文章中有提到怎么创建索引和导入数据,但是大家可能会遇到索引数据比较慢的过程.其实明白索引的原理就可以有 ...

随机推荐

  1. 精装友好联络算法实现借壳和RI

    精装友好联络会 注册算法分析: 1.  许可证由三部分组成. 2. 的登记号的第一部分是顺序编号0x6d模 3. 登记代码的第二部分: 先将订单号与0XB25F1异或,将异或后的结果转换成十进制字符串 ...

  2. WPF 打印实例

    原文:WPF 打印实例      在WPF 中可以通过PrintDialog 类方便的实现应用程序打印功能,本文将使用一个简单实例进行演示.首先在VS中编辑一个图形(如下图所示).      将需要打 ...

  3. Keil5生成bin文件

    进入“Options for Target”设置界面如下: 如图所示方框中输入: fromelf.exe --bin -o "$L@L.bin" "#L" 生成 ...

  4. 不能继承于QObject的类就一定不能使用信号槽?(用一个代理类进行发射就行了)

    首先不能继承QObject的情况在开发中遇到得并不多,笔者在一年多的Qt项目开发中只遇到两三次.而且都是因为引进了第三方库导致编译过程中报错. 要想解决这个问题其实不难,因为笔者遇到的问题都是想定义一 ...

  5. Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测

    原文:Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测  [函数名称] Hough 变换直线检测         HoughLineDetect(WriteableBit ...

  6. 图像处理中的跨度(stride)

    原文:图像处理中的跨度(stride) 使用C#的BitmapData 最近要转开发平台,正研究C#.C#好是好,不过处理图片时一个像素一个像素的操作像素不是一般的慢.其实Delphi也一样,但好在D ...

  7. Unity 3d新手上路

    作为一位unity新手,初学遇到了不少坑,而且不知道怎么找,发觉网上关于unity的文档好少,还是我暂时没找到. 现在说说void OnTriggerEnter(Collider e),这个函数是我加 ...

  8. 可以用GetObjectProp来获取对象的属性

    原来可以用GetObjectProp来获取对象的属性,还有这用法,哈哈哈哈…… var SL: TStrings; UseDBTools: Boolean;begin SL := nil; if Me ...

  9. 从Qt5开始只剩下setCodecForLocale这一个了,只是影响Qt对toLocal8Bit相关函数的编码方式(在源码里写非英文,官方推荐“\xE4\xBD...”这种)good

    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecFo ...

  10. 高性能JSON解析器及生成器RapidJSON

    RapidJSON是腾讯公司开源的一个C++的高性能的JSON解析器及生成器,同时支持SAX/DOM风格的API. 直击现场 RapidJSON是腾讯公司开源的一个C++的高性能的JSON解析器及生成 ...