前此日子在研究如何提高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为什么高效现在还不清楚内部实现原理。
分享到:
相关推荐
其中,Filter过滤器是Lucene中的一个重要组件,用于对索引进行精炼筛选,以满足特定的查询需求。本文将深入探讨Lucene5中的Filter机制,以及其在实际应用中的价值。 首先,我们来理解一下什么是Filter。在Lucene中...
4. **结果相关性**: 考虑用户行为、地理位置等因素,调整评分公式,提高搜索结果的相关性。 5. **拼音和同义词支持**: 引入拼音库和同义词库,提高对中文模糊搜索的支持。 总之,Lucene站内搜索提供了一套强大且...
为了提高性能,我们还可以考虑使用Filter或者QueryWrapperFilter来提前过滤不符合时间区间的文档,减少不必要的匹配计算。此外,优化Analyzer以适应日期格式,比如使用DateMathParser,可以支持更灵活的时间表达式。...
在第十九讲“Lucene过滤”中,我们将探讨Lucene内置的过滤器机制,这是优化搜索结果和提升用户体验的关键技术。 Lucene的核心组件之一是`org.apache.lucene.search.Filter`,它提供了一种方法来限制搜索结果,确保...
5. **过滤与排序**:除了返回最相关的搜索结果,我们还需要对结果进行过滤(例如,按日期或评分排序),这可以通过Filter和Sort类来实现。 6. ** faceted search(面式搜索)**:在大型信息集合中,提供分类浏览和...
排序是Lucene中的一项核心功能,允许我们根据文档的某个或多个字段来对搜索结果进行定制化排序。Lucene支持两种类型的排序:基于评分(Score Sorting)和基于字段(Field Sorting)。基于评分的排序默认按照相关性...
Lucene是一个高性能、全文本搜索引擎库,由Apache软件基金会开发并维护。在3.6版本中,Lucene提供了一套完整的搜索解决方案,包括索引构建、查询解析、结果排序等功能。本指南将深入探讨基于Lucene 3.6的搜索工具包...
通过Sort和Filter类,可以对搜索结果进行排序和过滤,如按相关性、日期等条件。 **4.3 多字段搜索** 可以构造复杂的Query,同时搜索多个字段。 **4.4 更新和删除索引** `IndexWriter`允许对已有索引进行更新和删除...
4. **过滤与高亮**:Lucene支持对搜索结果进行过滤,如按时间、按类型筛选。同时,还可以对匹配的查询词进行高亮显示。这部分可能讲解如何使用Filter和Highlighter类来实现这些功能。 5. **多字段搜索**:在实际...
默认情况下,Lucene根据相关性对搜索结果进行排序,这涉及到TF-IDF算法。我们可能需要定制ScoreFunction或者使用CustomScoreQuery来自定义评分规则,以满足特定业务需求。同时,我们还需要了解如何利用FieldCache...
在这个版本中,开发者可以更方便地创建索引,执行复杂的查询,并对搜索结果进行排序。以下是Lucene 2.0.0的一些核心特性: 1. **分词器(Tokenizer)与过滤器(Filter)**:Lucene 2.0.0提供了丰富的分词器和过滤器...
在Lucene中集成庖丁解牛,可以显著提高对中文关键词的识别和检索效率,从而提供更精确的搜索结果。 **2. Lucene的索引创建** 在实现企业产品检索时,我们需要先将产品信息转换为Lucene可处理的索引格式。这包括...
11. **Filter**:可以用于进一步筛选搜索结果,比如按日期、地理位置等条件过滤。 12. **Highlighter**:突出显示搜索结果中的匹配部分,有助于用户理解为何某个文档被选中。 13. **MemoryIndex**:允许在内存中...
禁词过滤器(StopFilter)是Analyzer的一部分,可以移除停用词,减少索引大小并提高搜索效率。例如,在英文中,"the"、"and"、"in"等词频繁出现但对搜索结果影响不大,可以作为禁词处理。 四、搜索操作 1. 查询...
- **Filter和QueryParser**:过滤器(Filter)可以对搜索结果进行进一步筛选,而QueryParser则帮助开发者构建复杂的查询条件。 3. **Lucene的使用流程** - **初始化**:创建Analyzer对象,选择合适的分词规则。 ...
为了提高搜索性能,Lucene 提供了倒排索引、位集合(BitSet)和缓存等技术。倒排索引允许快速定位匹配的文档;位集合用于高效地处理大量文档的筛选;缓存则可以加速频繁查询的响应速度。 **六、更新与删除** ...
9. **性能优化**:包括内存管理、磁盘I/O优化、并行处理等策略,以提高搜索性能。 **《Lucene_in_Action》书籍内容** 这本书通常会涵盖以上所有核心知识点,并且可能包括以下部分: - Lucene的历史和架构 - 安装...
8. **Filter**: 过滤器可以进一步筛选搜索结果,例如按时间、地理位置等条件过滤。 9. **Collector**: 收集器负责在搜索过程中收集匹配的文档,可以选择性地只收集前N个高分文档,以提高效率。 **2. 提高检索效率*...
7. 分数计算(Scoring):根据相关性对搜索结果进行排序。 二、Lucene 3.6.0的特性与改进 1. 性能优化:3.6.0版本在性能上进行了大量优化,包括更快的索引构建速度和更高效的搜索性能。 2. 新增查询语法:增加了...
过滤器可以快速筛选满足特定条件的文档,而排序则允许用户自定义搜索结果的排列顺序。 8. **更新与删除** Lucene允许动态更新和删除文档,确保索引与实时数据保持一致。这在内容频繁变动的环境中尤其重要。 9. **...