赞
踩
我们举几个例子就可以说明
假设商品表中有商品详情,商品名称,商品规格等一些列的字段,我们假设在想要查询的字段上都有最合适的索引。
1.搜索商品名中包含苹果或者香蕉或者橙子的
2.搜索商品名称和详情中包含苹果的
3.搜索商品名称和详情中包含苹果或者香蕉或者橙子的
4.搜索商品名称和详情中包含苹果或者香蕉或者橙子的,并按照出现的次数多少进行倒叙排序
可以发现一个问题,当mysql应对多个字段上的模糊查询的时候,是只可以使用一个索引的,并且还要求必须是后置模糊查询。如果是涉及到多个字段上的模糊查询,mysql就更显得无能为力了。若还要在这个基础上对结果进行相似度排序,那mysql如果是个人,应该会立马罢工给你看。
1.多字段多关键字搜索
2.对结果进行相似度排序
3.对结果中关键词进行高亮处理
4.在保证上面的功能前提下,效率尽可能的高
Elasticsearch 是最受欢迎的企业搜索引擎,其次是 Apache Solr,也是基于 Lucene。
其功能的核心是分词和倒排索引
分词器工作的位置有两个,一个是在把文档入库的时候,要把文档需要索引的字段进行分词,维护一个文档的倒排索引单词词典。另一个是在进行搜索的时候,把搜索关键字进行分词,然后去倒排索引中查找。
假设我们的搜索条件是“华为手机平板电脑”,要求是只要满足了其中任意一个词语组合的数据都要查询出来。
Elasticseach 提供了三种分词方法:
单字分词:
二分法分词:
词库分词:按某种算法构造词,然后去匹配已建好的词库集合,如果匹配到就切分出来成为词语。
通常词库分词被认为是最理想的中文分词算法。而词库分词最常用的就是 IK 分词。
IK 分词器提供两种分词模式:
对于搜索引擎来讲:
正排索引也称为"前向索引"。它是创建倒排索引的基础,通过文档标识到关键字(doc->word)的映射,具有以下字段
(1)LocalId字段(表中简称"Lid"):表示一个文档的局部编号。
(2)WordId字段:表示文档分词后的编号,也可称为"索引词编号"。
(3)NHits字段:表示某个索引词在文档中出现的次数。
(4)HitList变长字段:表示某个索引词在文档中出现的位置,即相对于正文的偏移量。
基本结构可以理解为:
docID1 -> word1:出现次数,出现的位置List;word2:出现次数,出现的位置List;
docID2-> word1:出现次数,出现的位置List;word2:出现次数,出现的位置List;word3:出现次数,出现的位置List;
但是往往在网页检索或者其他搜索情况下是通过关键字来找文档,因此需要把正排索引转换为倒排索引,才能满足实际的需求。
倒排索引是单词到文档 ID 的关联关系。也就是说通过单词搜索到文档标识。
倒排索引的查询流程是:首先根据关键字搜索到对应的文档 ID和其正排索引,然后根据正排索引查询文档完整内容,最后返回给用户想要的结果。
倒排索引是ES搜索引擎的核心,主要包含两个部分:
倒排索引项(Posting)主要包含如下的信息:
可以看出,倒排索引项其实就是存储了正排索引信息。下面我们根据几个案例来说明其存储方式。
假设文档集合包含五个文档,每个文档内容如下图所示。在图中最左端一栏是每个文档对应的文档编号。我们的任务就是对这个文档集合建立倒排索引。
首先用分词系统将文档自动切分成单词序列。为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录哪些文档中包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引,如下图所示。
在图中,“单词 ID”一栏记录了每个单词的单词编号,第二栏是对应的单词,第三栏即每个单词对应的倒排列表。比如单词 谷歌,其单词编号为 1,倒排列表为 1,2,3,4,5,说明文档集合中每个文档都包含了这个单词。
为了方便大家理解,上图只是一个简单的倒排索引,只记录了哪些文档包含哪些单词。而事实上,索引系统还可以记录除此之外的更多信息。
下图则是一个相对复杂的倒排索引,在单词对应的倒排列表中不仅记录了文档编号,还记录了单词频率信息(TF),即这个单词在某个文档中出现的次数。
之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。
图中单词 创始人 的单词编号为 7,对应的倒排列表内容为 (3;1),其中 3 代表文档编号为 3 的文档包含这个单词,数字 1 代表词频信息,即这个单词在 3 号文档中只出现过 1 次。
实用的倒排索引还可以记录更多的信息,如下图所示索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的“文档频率信息”以及在倒排列表中记录单词在某个文档出现的位置信息(POS)。
有了这个索引系统,搜索引擎可以很方便地响应用户的查询,比如用户输入查询词“Facebook”,搜索系统查找倒排索引,从中读取包含这个单词的文档,利用单词频率信息、文档频率信息可以对这些候选搜索结果进行排序,计算文档和查询的相似性,按照相似性的得分由高到低排序输出,这些文档就是提供给用户的搜索结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。