Lucene原理

Lucene读音路深,是一个高效的基于java的全文检索库。
那么什么是全文检索库呢?
数据分 结构化数据以及非结构化数据。
那些具有固定格式或有限长度的数据,比如数据库,元数据等叫结构化数据。
搜索自然也分 对结构化数据的搜索以及对非结构化数据的搜索,前者类似sql或者windows里按照文件名以及类型进行搜索。后者则类似Linux下的grep以及google和百度的搜索。
 
对于非结构化数据的检索,也分两种,一种是顺序化检索,一种是非顺序检索。前者就是逐行扫描。后者是将非结构树的数据中提取出结构化信息,进行索引及检索以达到提升检索速度的目的。
 
这种先建立索引再对索引进行搜索的过程叫全文检索。
 
索引里面存什么呢?
大家都知道从已知文件,搜索字符串比较容易。而从已知字符串搜索相关的文件就比较麻烦。如果我们的索引能存储字符串到文件的映射,
则将大大提高搜索速度。而这种从字符串到索引的映射是文件到字符串映射的反向过程,于是保存这种信息的索引叫做反向索引。
 
举个例子, 假设我们词典里有 hello, world2个关键字,含有hello的文件有A B C D,而含有world的文件有C D E F。我们要既含有hello又含有world的文件,只要搜索得到2个索引既hello与world,并得到他们的交集即可,例子里,他们的交集是 C D两个文件。
 
索引不一定比顺序搜索要快,但是要清楚的是,建立了索引后,不必每次都搜索都检索一次所有文件。对于海量文件的搜索尤为重要。
 
如何创建索引?
1.读取待创建索引的文件
2.分词并去除标点即停顿词等无意义的字符
3.将得到的分词Token,传递给语言处理组件,再一次合并同意的词汇等,如car与cars,drive与drove
4.将3的结果传递给索引组件,索引组件(Indexer)主要实现1.利用得到的词创建字典。也就是字符串到文件的映射。2.将字典按字母顺序进行排序。3.合并系统的词称为文档倒排链表,链表里面可以存储些词出现的频率等信息,以实现频率高的文件排前。
 
以上索引就创建完成了。接下来我们讨论如何搜索
索引创建完了,不意味着你很快就能找到你需要的结果,比如,google总是能搜索出好几万条结果,你会发现找不到是个问题,可找到太多也是个大问题。  那么如何将最相关的结果排前呢?
 
如何对索引进行搜索:
1.用户输入查询语句
2.对查询语句进行词法分析,语法分析,及语言处理
3.搜索索引,得到符合语法树的文档
4.根据得到的文档和查询语句的相关性,对结果进行排序,排序过程需要经过权重计算,空间相关性算法计算等。
 
以上是全文检索的原理。 接下来我们来讲Lucene的原理:
 
 
和全文检索一样,lucene也分为创建索引和搜索两个过程。
 
  • 被索引的文档用Document表示。
  • IndexWriter通过addDocument将文档添加到索引中国,实现创建索引的过程。
  • Lucene的索引就是反向索引
  • 当用户有请求时,Query代表了用户的查询语句。
  • IndexSeacher通过函数search搜索Lucene index
  • IndexSeacher计算term weight和score并且将结果返回给用户
  • 返回给用户的文档集合用TopDocsCollector表示。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值