Solr倒排

solr是采用Java开发的 基于Lucence的全文搜索服务器·,采用反向索引,即从关键字到文档的映射过程 Solr以Document为对象进行存储,每个文档由一系列的field构成,每个field表示文档的一个属性。文档的Field可以被索引,以提高性能的工作效率,一般情况下文档都包含一个能唯一表示该文档的id字段。

 

Solr倒排索引

倒排索引就是文档内容到文档序号的过程,将文档内容用Solr自带分词器进行分词,然后作为索引,用二分法将关键字与排序号的索引进行匹配,进而查找到相应的文档。

倒排索引的原理:

      假设文档集合包含五个文档,每个文档内容如图所示,在图中最左端一栏是每个文档对应的文档编号。我们的任务就是对这个文档集合建立倒排索引。                     

   

    中文和英文等语言不同,单词之间没有明确分隔符号,所以首先要用分词系统将文档自动切分成单词序列。这样每个文档就转换为由单词序列构成的数据流,为了系统后续处理方便,需要对每个不同的单词赋予唯一的单词编号,同时记录下哪些文档包含这个单词,在如此处理结束后,我们可以得到最简单的倒排索引。在图中,“单词ID”一栏记录了每个单词的单词编号,第二栏是对应的单词,第三栏即每个单词对应的倒排列表。比如单词“谷歌”,其单词编号为1,倒排列表为{1,2,3,4,5},说明文档集合中每个文档都包含了这个单词。

                                       

                                       

      之所以说上图所示倒排索引是最简单的,是因为这个索引系统只记载了哪些文档包含某个单词,而事实上,索引系统还可以记录除此之外的更多信息。下面这张图是一个相对复杂些的倒排索引,与上图的基本索引系统比,在单词对应的倒排列表中不仅记录了文档编号,还记载了单词频率信息(TF),即这个单词在某个文档中的出现次数,之所以要记录这个信息,是因为词频信息在搜索结果排序时,计算查询和文档相似度是很重要的一个计算因子,所以将其记录在倒排列表中,以方便后续排序时进行分值计算。下图中,词“创始人”的单词编号为7,对应的倒排列表内容为:(3:1),其中的3代表文档编号为3的文档包含这个单词,数字1代表词频信息,即这个单词在3号文档中只出现过1次,其它单词对应的倒排列表所代表含义与此相同。

                                                

     实用的倒排索引还可以记载更多的信息,索引系统除了记录文档编号和单词频率信息外,额外记载了两类信息,即每个单词对应的“文档频率信息”以及在倒排列表中记录单词在某个文档出现的位置信息。

                                                                                                                      

 

     “文档频率信息”代表了在文档集合中有多少个文档包含某个单词,之所以要记录这个信息,其原因与单词频率信息一样,这个信息在搜索结果排序计算中是非常重要的一个因子。而单词在某个文档中出现的位置信息并非索引系统一定要记录的,在实际的索引系统里可以包含,也可以选择不包含这个信息,之所以如此,因为这个信息对于搜索系统来说并非必需的,位置信息只有在支持“短语查询”的时候才能够派上用场。

     以单词“拉斯”为例,其单词编号为8,文档频率为2,代表整个文档集合中有两个文档包含这个单词,对应的倒排列表为:{(3;1;<4>),(5;1;<4>)},其含义为在文档3和文档5出现过这个单词,单词频率都为1,单词“拉斯”在两个文档中的出现位置都是4,即文档中第四个单词是“拉斯”。

                 

  简单总结:倒排索引它记录的是词,和词所存在的文档id。的所有列表。通过这种索引结构的存储方式,其查询速率可想而知。

 

3:Lucene创建索引的过程是什么?

1 收集待索引的原文档

从数据库、web等获取原文档。

 

2 将原文档交给分词组件(Tokenizer)

此过程叫做Tokenize,得到的结果称为Token。

会做如下几件事:

1.将文档分成一个个独立的单词

2.去除标点

3.去除停词(stopword)

 

3 将得到的Token交给语言处理组件(LinguisticProcessor)

此过程处理的结果是Term

会做如下几件事:

1.转为小写

2.将单词缩减为词根,如cars-->car

3.将单词转变为词根,如drove-->drive

 

step4 将得到的Term交给索引组件(Indexer)

会做如下几件事:

1.将得到的Term创建字典

2.对字典按字母排序

3.合并相同的Term为倒排索引表

Solr和elasticSearch的区别?

共同的: 都是基于Lucene实现的

不同点:

A  solr利用zookeeper进行分布式管理  而elasticSearch自身带有分布式协调管理

B Solr比elastic Search实现更加全面,solr官方提供更多功能,而elasticSearch更注重于核心功能,高级功能由第三方插件提供。

C solr在传统的搜索应用中表现好于elastic Search,而elasticSearch在实时搜索应用方面比solr好

posted @ 2020-09-22 19:03  于格  阅读(208)  评论(0)    收藏  举报