传智播客-关于lucene的“知识集锦”和字段优先设置问题

今天才知道,原来之前推荐的那篇关于lucene的文章的作者车东是个大牛人,虽然是2002年的文,但是大牛就是大牛,小菜鸟看了之后觉得写不出新东西很正常了。。。(咳咳。。自我安慰一下下)

 

以下的内容只是记录(既有大牛车东的,也有之前提过的那篇研究生论文--这个论文2005年写的,后面的参考目录就有车东的这篇文,当然也有汤阳光老师上课讲解的内容),最后有个关于lucene里关键词相关度排序的问题没怎么明白,就是field.setBoost()这个方法,不明白后台是怎么设计或者说算法是怎样的,反正我想要的效果没出来。

 

传智播客lucene课程的视频暂时还没有在网上公开,有兴趣的同学可以google百度自己学习,或者来传智播客亲自聆听老师讲解:)

 

1、国外的搜索引擎通常指的是基于因特网的搜索引擎,他们通过网络机器人程序收集上千万到几亿个网页,并且每一个词都被搜索引擎索引,也就是我们说的全文检索。著名的因特网搜索引擎包括First Search、Google、HotBot等。在中国,搜索引擎通常指基于网站目录的搜索服务或是特定网站的搜索服务。
(这篇论文还讲了如何结合lucene和bot使用,想看全文的自行google百度吧。只是站内检索的话,lucene就可以实现了)

 

2、对于检索系统来说核心是一个排序问题。

由于数据库索引不是为全文索引设计的,因此,使用like "%keyword%"时,数据库索引是不起作用的,在使用like查询时,搜索过程又变成类似于一页页翻书的遍历过程了,所以对于含有模糊查询的数据库服务来说,LIKE对性能的危害是极大的。如果是需要对多个关键词进行模糊匹配:like"%keyword1%" and like "%keyword2%" ...其效率也就可想而知了。

所以建立一个高效检索系统的关键是建立一个类似于科技索引一样的反向索引机制,将数据源(比如多篇文章)排序顺序存储的同时,有另外一个排好序的关键词列表(这个内容让我想到了hashcode,当然hashcode比这个复杂,可以参见《Thinking
 in Java》的第11章,有关于hashcode思想的详细说明),用于存储关键词==>文章映射关系,利用这样的映射关系索引:[关键词==>出现关键词的文章编号,出现次数(甚至包括位置:起始偏移量,结束偏移量),出现频率],检索过程就是把模糊查询变成多个可以利用索引的精确查询的逻辑组合的过程。从而大大提高了多关键词查询的效率,所以,全文检索问题归结到最后是一个排序问题。

由此可以看出模糊查询相对数据库的精确查询是一个非常不确定的问题,这也是大部分数据库对全文检索支持有限的原因。Lucene最核心的特征是通过特殊的索引结构实现了传统数据库不擅长的全文索引机制,并提供了扩展接口,以方便针对不同应用的定制。

 

3、Lucene的创新之处:
大部分的搜索(数据库)引擎都是用B树(估计是指二叉树binary tree)结构来维护索引,索引的更新会导致大量的IO操作,Lucene在实现中,对此稍微有所改进:不是维护一个索引文件,而是在扩展索引的时候不断创建新的索引文件,然后定期的把这些新的小索引文件合并到原先的大索引中(针对不同的更新策略,批次的大小可以调整:IndexWriter.optimize()/IndexWriter.optimize(int)),这样在不影响检索的效率的前提下,提高了索引的效率。

 

4、lucene中的directory:FSDirectory和RAMDrectory
顾名思义,文件系统目录和内存目录,后者效率高,但容量有限,容量到一定程度又会影响效率,一般是结合用,两者的内容可以合并或转存。
还有高亮,过滤,query等等内容就不一一写了(范围过滤时尽量采用RangeQuery,不要用RangeField了)。

 

5、lucene中的NumberTools和DateTools:lucene中要求索引对象内容的id值是long型,所以解析成string的时候要用统一的解析方法,不然更新或删除时会找不到我们想要找的对象,要注意的是,lucene提供的long型与string型数据转换的工具类NumberTools,解析和toString()等方法是不一致的,NumberTools采用的是36进制,而且数字转换成字符串后的前面会补0,一般对数字和日期,采用NumberTools和DateTools转换;类似地,建立索引(IndexWriter)和查询分析(QueryParser)也要采用同样的分词器(Analyzer)实现;再多一句,字符编码问题也是这样的。

 

6、相关度排序:
借用了第三方工具:jesoft的je分词器实现;
boost:表示属性(关键词)在索引中的重要程度,是个相对概念;例如ProductA里有属性nameA,priceA,ProductB里有属性nameB,priceB,如果ProductA的nameA属性boost=3,priceA的boost=4;ProductB的nameB属性boost=2,priceB的boost=1;如果搜索时关键字在nameA和nameB里都有,可能搜索的结果ProductB就排在ProductA前面。

 

7、注意检索库和数据库的同步。
就是注意两者的同步update,不过要控制好update的频率--指检索库。


最后的最后,扯个和技术无关的话题,源头是车东的那篇文章(右边栏)-->Meng Yan ( 孟岩 )'s Weblog(博文:素质)-->魏武挥的文章“事实 vs 真相”(让我想到了“罗生门”,如果名字没记错的话)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值