前此日子在研究如何提高lucene搜索速度,200多W的索引数据搜索结果有50W时大概花了10s左右,虽然已经对搜索结果进行cache,但第一次查询还是很慢的。主要是由于业务上要根据条件过滤掉一些记录,还有是对搜索结果做分组统计。所以在Filter中实现的话最要循环50W次来对每条记录判断并做过滤。最开始的时候以为是对搜索结果的分组统计的性能问题。最后经测试发现还是迭代Hits的效率低下。找了很多文档都没有很好的解决方案。只找到了使用HitCollector来做搜索结果的分组统计的高效。最后决定把它拿到Filter中替代了之前的迭代Hits结果的操作。最后发现50W结果只要2s左右效率提高了好几陪。以下为大致实现方式:
private Query query;
public BitSet bits(IndexReader reader) throws IOException {
final BitSet bits = new BitSet(reader.maxDoc());
final IndexSearcher searcher = new IndexSearcher(reader);
searcher.search(query, new HitCollector() {
public void collect(int doc, float score) {
try {
bits.set(doc);
Document document = searcher.doc(doc);
if(...){
bits.set(doc, false);
}
}catch (IOException e) {
e.printStackTrace();
}
}
});
return bits;
}
顺便提醒大家不要对Hits做迭代操作。文档上说的很清楚不要迭代超100条以上的hits因为默认只查了前100条数据。当超过100时它得再次去索引查询这样增加了频繁的I/O操作。但使用HitCollector为什么高效现在还不清楚内部实现原理。
分享到:
相关推荐
NULL 博文链接:https://iamyida.iteye.com/blog/2199368
lucene 近实时搜索 很清楚的解释了关于lucene近实时搜索的代码。很值得学习
c#下实现Lucene时间区间查询匹配。主要还是对Lucene查循对像Query的实现
Lucene实现全文搜索,支持英文、模糊和智能查询
主要是关于lucene站内搜索的技术代码,可以使用;按照需要进行代码修改。
对lucene的封装对lucene的封装 对lucene的封装 对lucene的封装
lucene3.6 搜索例子
全文检索介绍 索引 分词 Lucene介绍 Lucene应用详解 索引器 检索器 条件查询 实用工具及高亮器 Lucene综合应用——仿搜索引擎
lucene 高级搜索项目 附件搜索 附件内容搜索 全文搜索
毕业设计:基于lucene的桌面搜索引擎
lucene_heritrix 搜索引擎 很好的东西来看看吧
用LUCENE.NET开发搜索引擎,可将sercher\api文件夹中内容换成爬虫爬到的网页图片,可以直接运行的代码
19.Lucene过滤 共4页 20.Lucene分词器1 共3页 21.Lucene分词器2 共9页 22.Lucene分词器3 共4页 23.Lucene项目实战1 共6页 24.Lucene项目实战2 共6页 25.Lucene项目实战3 共6页 26.Lucene项目实战4 共6页 27.Lucene...
基于Lucene的全文搜索引擎研究与应用.pdf 详实的介绍Lucene的架构设计分析
完整的《Lucene+nutch搜索引擎开发》PDF版一共83.6M,无奈我上传的最高限是80M,所以切成两个。这一个是主文件,还需要下载一个副文件Lucene+nutch搜索引擎开发.z01。解压时直接放到一起,解压这个主文件就行了。
用lucene对数据库建立索引及搜索.doc
Lucene是一个高性能、可伸缩的信息搜索(IR)库。目前最新版本是4.3.1. 它可以为你的应用程序添加索引和搜索能力。Lucene是用java实现的、成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件...
基于Lucene的搜索策略研究
基于Lucene的搜索引擎的研究与应用基于Lucene的搜索引擎的研究与应用
Lucene nutch 搜索引擎开发 Part1