专栏名称: ImportNew
伯乐在线旗下账号,专注Java技术分享,包括Java基础技术、进阶技能、架构设计和Java技术领域动态等。
目录
相关文章推荐
Java编程精选  ·  Java 中如何使用枚举来消除 if/else ·  8 小时前  
芋道源码  ·  Guava黑魔法:在日志脱敏场景下的奇遇 ·  昨天  
芋道源码  ·  Spring Boot + URule ... ·  2 天前  
51好读  ›  专栏  ›  ImportNew

全文检索引擎 Solr 系列(2)— 全文检索基本原理

ImportNew  · 公众号  · Java  · 2017-04-08 20:48

正文

请到「今天看啥」查看全文


坑        38

爹        90

...       ...


这样就形成了一个完整的目录(索引库),查找的时候就非常方便了。对于全文检索也是类似的原理,它可以归结为两个过程:1.索引创建(Indexing)2. 搜索索引(Search)。那么索引到底是如何创建的呢?索引里面存放的又是什么东西呢?搜索的的时候又是如何去查找索引的呢?带着这一系列问题继续往下看。



索引


Solr/Lucene采用的是一种反向索引,所谓反向索引:就是从关键字到文档的映射过程,保存这种映射这种信息的索引称为反向索引



  • 左边保存的是字符串序列

  • 右边是字符串的文档(Document)编号链表,称为倒排表(Posting List)


字段串列表和文档编号链表两者构成了一个字典。现在想搜索”lucene”,那么索引直接告诉我们,包含有”lucene”的文档有:2,3,10,35,92,而无需在整个文档库中逐个查找。如果是想搜既包含”lucene”又包含”solr”的文档,那么与之对应的两个倒排表去交集即可获得:3、10、35、92。


索引创建


假设有如下两个原始文档:


文档一:Students should be allowed to go out with their friends, but not allowed to drink beer.


文档二:My friend Jerry went to school to see his students but found them drunk which is not allowed.


创建过程大概分为如下步骤:




一:把原始文档交给分词组件(Tokenizer)


分词组件(Tokenizer)会做以下几件事情(这个过程称为:Tokenize),处理得到的结果是词汇单元(Token)


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

  2. 去除标点符号

  3. 去除停词(stop word)


所谓停词(Stop word)就是一种语言中没有具体含义,因而大多数情况下不会作为搜索的关键词,这样一来创建索引时能减少索引的大小。英语中停词(Stop word)如:”the”、”a”、”this”,中文有:”的,得”等。不同语种的分词组件(Tokenizer),都有自己的停词(stop word)集合。经过分词(Tokenizer)后得到的结果称为词汇单元(Token)。上例子中,便得到以下词汇单元(Token):


"Students","allowed","go","their","friends","allowed","drink","beer","My","friend","Jerry","went","school","see","his","students","found","them","drunk","allowed"


二:词汇单元(Token)传给语言处理组件(Linguistic Processor)


语言处理组件(linguistic processor)主要是对得到的词元(Token)做一些语言相关的处理。对于英语,语言处理组件(Linguistic Processor)一般做以下几点:







请到「今天看啥」查看全文