倒排索引源于实际应用中需要根据属性的值来查找记录。这种索引表中的每一项都包括一个属性值和具有该属性值的各记录的地址。由于不是由记录来确定属性值,而是由属性值来确定记录的位置,因而称为倒排索引(inverted index)。带有倒排索引的文件我们称为倒排索引文件,简称倒排文件(inverted file)。
倒排索引
正排索引:是以文档对象的唯一 ID 作为索引,以文档内容作为记录的结构。
倒排索引:Inverted index,指的是将文档内容中的单词作为索引,将包含该词的文档 ID 作为记录的结构。
如果是根据id查询,那么直接走索引,查询速度非常快。
但如果是基于字段做模糊查询,只能是逐行扫描数据, 也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。
倒排索引中有两个非常重要的概念:
文档( Document ):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息
词条( Term ):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
创建倒排索引是对正向索引的一种特殊处理,流程如下:
- 将每一个文档的数据利用算法分词,得到一个个词条
- 创建表,每行数据包括词条、词条所在文档id、位置等信息
- 因为词条唯一性,可以给词条创建索引,例如hash表结构索引
正向和倒排
那么为什么一个叫做正向索引,一个叫做倒排索引呢?
正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判
断文档中是否包含所需要的词条,是根据文档找词条的过程。
而倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id
获取文档。是根据词条找文档的过程。
当然,让我们进一步梳理倒排索引的概念,使其更加清晰。
倒排索引:****优点:根据词条搜索、模糊搜索时,速度非常快缺点:只能给词条创建索引,而不是字段, 无法根据字段做排序正向索引:****优点:可以给多个字段创建索引根据索引字段搜索、排序速度非常快缺点:
根据非索引字段,或者索引字段中的部分词条查找时,
只能全表扫描。
倒排索引的建立过程
文档集合:首先,你需要一个文档集合,这是你要建立索引的源材料。这些文档可以是网页、书籍、邮件等任何可以搜索的内容。
分词处理:接下来,对这些文档进行分词处理,即将连续的文本分割成一系列的单词或词组。这一步通常涉及到词干提取和去除停用词等操作。
创建词项表:然后,创建一个词项表,记录所有出现过的单词及其唯一标识符。这通常通过单词的哈希值或编号来实现。
构建倒排列表:对于每个单词,创建一个倒排列表,记录包含该单词的所有文档。每个文档在列表中的条目包括文档编号、单词在文档中的出现频率以及位置信息。
流程描述如下:
1)将文档分析成单词term标记,
2)使用hash去重单词term
3)对单词生成倒排列表
倒排列表就是文档编号DocID,没有包含其他的信息(如词频,单词位置等),这就是简单的倒排索引。
倒排索引的查询过程
输入查询:用户输入一个查询,通常是一系列关键词。
解释查询:搜索引擎将查询分解为单独的词汇,并在倒排索引中查找这些词汇。
文档检索:根据倒排索引,可以快速找到包含所有查询词汇的文档,并进行相关性评分。评分通常基于关键词的出现频率、位置以及文档的相关性等因素。
返回结果:最后,搜索引擎将根据评分返回最相关的文档列表。
es的一些概念
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。
重要特性:
1、分布式的实时文件存储,每个字段都被索引并可被搜索
2、实时分析的分布式搜索引擎
3、可以扩展到上百台服务器,处理PB级结构化或非结构化数据
文档和字段
elasticsearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中,而Json文档中往往包含很多的字段(Field),类似于数据库中的列。
索引和映射
索引(Index),就是相同类型的文档的集合。因此,我们可以把索引当做是数据库中的表。
数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。
mysql与elasticsearch对比
MySQLElasticsearch说明TableIndex 索索引(index),就是文档的集合,类似数据库的表(table)RowDocument文档(Document),就是一条条的数据,类似数据库中的行
(Row),文档都是JSON格式ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列
(Column)SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类
似数据库的表结构(Schema)SQLDSLDSL是elasticsearch提供的JSON风格的请求语句,用来操作
elasticsearch,实现CRUD
IK分词器
分词器的作用是什么?
创建倒排索引时对文档分词用户搜索时,对输入的内容分词
IK分词器有几种模式?
ik_smart:智能切分,粗粒度
ik_max_word:最细切分,细粒度
安装
下载:https://github.com/medcl/elasticsearch-analysis-ik/releases
在ES安装目录下找到plugins目录创建ik文件夹
将ik分词器解压缩在此目录并重启ES即可
索引库操作
测试数据库是否正常启动
RestAPI
ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请
求发送给ES。官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html
其中的Java Rest Client又包括两种:
Java Low Level Rest Client
Java High Level Rest Client
我们学习的是Java HighLevel Rest Client客户端API
版权归原作者 apesource.芯轴 所有, 如有侵权,请联系我们删除。