工作总结——Lucene使用

4 篇文章 0 订阅
0 篇文章 0 订阅
1、使用了Lucene2.4.0版本的Lucene在IBM的jdk下查询不稳定,多次相似查询后就查什么也查不出来了,我测试时的例子:
第一次查询:1,
第二次查询:12,
。。。
第四次查询:1234,
。。。
第八次查询:1
还会这样查询,保证你的索引中每次查询理论上都可以查询出结果的,在测试的过程中,我出现了中间突然就查不出结果了,只要一出现该情况,以后无论查什么都查不出来了,换回了sun的jdk又好了,我跟踪了代码,奇怪的是每次跟踪代码时它又好了,并且以后也不会出现上面的问题,我找不到原因,最后只能是怀疑Lucene本身的bug吧,没办法将版本升到了2.9也不行,又升到了3.6.2,幸好变化不是特别大,有些接口还可以用,代码改动不是很大,但是我之前用的是je的中文分词器,导致了每次创建索引的时候报错,说NoSuchMethod的异常,我看不懂到底是哪个方法缺了,后来我直接用最简单的标准的分词器进行创建索引和查询,都是ok的,我怀疑是分词器的问题,到网上搜了发现IK的分词器好像不错,我就下了最新的IK分词器,我直接替换了je的分词器的jar包就ok了,感叹接口的好处,没有动任何代码。最终测试上面的例子发现没有问题,但是多次测试发现只要多测试几次也有可能出现类似问题,但是不一样的是,可以出来结果,虽然说评分是0.0,影响的顺序不对而已,再测试又没有这个问题,这个版本貌似也不太稳定。于是我打了断点debug时,发现得分也正常了,这让我很纳闷,不debug得分为0,debug得分就正常,希望有高人指点!!!
排序:
对于排序问题我在网上搜了一下发现只要在IndexSearch对象中的search方法中调用有Sort参数的方法即可,Sort方法中需要SortField作为参数,这样就可以实现按照某个字段进行排序,也可以多个字段,项目中是对文件和数据库创建的索引,需要将文件和数据库的搜索结果分开,所以按照先对文件类型排序,然后再对评分排序,这样就可以满足需求了。
老大想用最新版本的Lucene4.3,但是4.3和2.4的包结构的变了不少,我周末回来看看4.3的一些例子,探索中。。。


2、今天老大想要将搜索做成百度文库那样,按照文档类型搜索,还可以搜索全部类型,我之前做的都没有做这个,想想没有什么头绪。想了一会,我采用新加一个索引项,但是又担心把别的索引项中的相同的内容查到,在网上看了半天发现可以使用filter实现,找了很多代码,最终发现只要几行代码就可以搞定,基本思想就是将那个用来区分文档类型的索引项作为过滤条件,只对那个索引项查询,示例代码如下:

Term term=new Term(Field,Value);//添加term 
QueryWrapperFilter filter=new QueryWrapperFilter(new TermQuery(term));//添加过滤器
IndexSearch search = new IndexSearch();
QueryParser qp=new MultiFieldQueryParser(Version.LUCENE_36, fieldArray, new IKAnalyzer()); 
Query query=qp.parse(searchStr); 
TopDocs docs = search.search(query, filter, 1000);
//解析数据 
Document doc = null; 
for(int i=0; i<docs.totalHits; i++){ 
	int  k = docs.scoreDocs[i].doc ; //文档内部编号 
	doc = search.doc(k); 
	System.out.println(doc.get("name") +"--" + doc.get("id") + "-----" + doc.get("type") + "---" + doc.get("testField")); //输出索引项
} 
search.close(); //关闭查询器


3、Lucene版本变化

Lucene2.9以前的都是每次创建完索引后需要optimize,这样效率很低,到3.0后就废弃了该方法,并且在创建IndexReader和IndexWriter时都需要穿一个当前版本号的参数,并且会讲一个配置对象传递给Reader和Writer,将所有的配置都放到这个对象里,以后不必要再去设置了。有些问题可能高版本中已经被修复,虽然你看修改记录中的bug没有你所描述的那个,但是可能已经被修复。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值