lucene技能总结

1.对于不同域使用不同的分词器

	//创建不同field对应的分词器
	Map<String,Analyzer> analyzerPerField = new HashMap<String,Analyzer>();
	analyzerPerField.put("filename", new KeywordAnalyzer());
	analyzerPerField.put("path", new SimpleAnalyzer(Version.LUCENE_46));
	//默认使用StandardAnalyzer分词器
	PerFieldAnalyzerWrapper aWrapper =
		   new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_46), analyzerPerField);

2.QueryParser检索未分词的Field时注意事项:

    由于QueryParser进行索引时,会根据创建对象时用到的分词器对检索内容进行分词,所以对于那些在索引时没有进行分词的field会产生不可预估的问题(根据不同的分词器产生不同的效果),对于这样的问题,可以使用PerFieldAnalyzerWrapper 针对未进行索引的Field进行处理。(KeywordAnalyzer用来处理数字部分,将数字作为一个整体)

3.对于检索进行排序

        lucene默认对检索结果排序是根据检索的相关性进行排序,这主要是根据lucene的评分规则来进行排序,并将评分较高的显示在前边,但是对于一些需求来说,需要使用特殊的字段进行排序,lucene可以在searcher.search()中传入Sort对象,进行不同的排序操作,Sort默认有两个排序,Sort.RELEVANCE与Sort.INDEXORDER,前一个主要是lucene默认的排序操作,即相关度降序排序,(由于使用Sort对象会产生额外开销,所以在使用相关度排序,即默认排序时,尽量不要传入该参数)。Sort.INDEXORDER主要用于根据索引顺序排序,是根据文档的ID栏进行升序排列。Sort对象还可以根据不同的Field进行排序,如:
new Sort(new SortField("size", Type.LONG,true))//size:要进行排序的字段名,Type.LONG:字段保存值类型,boolean类型的参数,true表示倒序
对于传入sort对象的检索,可以使用如下方式进行检索
TopDocs tps = this.getSearcher().search(query, null, 100, sort);
        默认情况下,接受Sort对象的search方法不会对匹配文档进行任何评分操作,因为评分会消耗大量系统性能,并且很多程序在通过域排序时不需要进行评分操作。如果需要影响评分时,可以使用
//doDocScores=true:每个被搜索到的结果都进行结果操作,doMaxScore=true,对最大分值的命中结果进行评分操作-开销比较大
TopDocs tps = this.getSearcher().search(query, null, 100, sort, true, false);





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值