luence优化速度
Posted 走吧!走吧!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luence优化速度相关的知识,希望对你有一定的参考价值。
一. .索引优化背景
很多网站都有自己的搜索引擎,比如百度,搜狗等等,而他们每天添加的索引量可想而知多么庞大,所以为了能提升用户的搜索响应速度,好的优化方案必不可少;当然对于一些网站的站内搜索也很有必要,否则日积月累之后,索引文件也将难以维护,搜索效率越来越慢,用户好评率自然降低。
由于我所在的公司也用到Lucene做搜索,所以相应学习了下。
二. .索引优化方法
目前来说有几种比较常见的优化方法:
1. 设置IndexWriterConfig中mergeFactor的值.
mergeFactor即合并因子,当大小相当的段的数量达到此值的时候开始合并。
注意:mergeFactor应设在(2-10)之间,mergeFactor越小,创建索引的时候占用内存越小,所以创建索引速度慢,但是反向索引时速度快;
mergeFactor越大,创建索引的时候占用内存越大,所以创建索引速度快,但是反向索引时速度慢。
合并策略:比如 mergeFactor=3,开始来的段大小为 10M,当凑够 3 个 10M 的时候, 0.cfs, 1.cfs, 2.cfs则合并成一个新的段 3.cfs,大小为 30M,然后再来 4.cfs, 5.cfs, 6.cfs,合并成 7.cfs,大小为 30M,然后再来 8.cfs, 9.cfs, a.cfs 合并成 b.cfs, 大小为 30M,这时候又凑够了 3 个30M 的,合并成 90M 的 c.cfs,然后又来 d.cfs, e.cfs, f.cfs 合并成 10.cfs,大小为 30M,然后 11.cfs 大小为 10M,这时候硬盘上的段为: c.cfs(90M) 10.cfs(30M),11.cfs(10M)。
2. 排除停用词
什么是停用词?停用词就是没有实际意义不参与索引的词。比如,"这是一首简单的小情歌!"其中‘这是’、‘的’就可以当做停用词排除掉,被分词器过滤掉后,就不会建立索引,这样索引文件就会变小,搜索的时候就会变快。在庖丁分词器中,就可以自定义停用词和自己的词典。
3. 将索引数据分区存放
为什么要分区存放?假如咱们手上有海量的各种数据,比如音频,小说,新闻,游戏。。如果分区存放的话,用户只需在小范围区间搜索就行了,可以很大程度提高检索速度减少服务器压力。这在某种方式上类似于分流。
4. 将硬盘上的索引文件放入内存中提升索引速度
- //索引放在硬盘上
- Directory dir = FSDirectory.open(new File(indexPath));
- //索引放在内存中
- IOContext ioc = new IOContext();
- Directory ramDic = new RAMDirectory(dir, ioc);
- //然后将ramDic传入IndexReader
- IndexReader reader = DirectoryReader.open(ramDic);
- IndexSearcher searcher = new IndexSearcher(reader);
- //...
查询分为TermQuery(以term为单位查询)、MultiFieldQueryParser(字符串查询,将字符串分割为单个字符)、MatchAllDocsQuery(查询所有)、NumericRangeQuery(范围查询,性能较过滤器高)、WildcardQuery(通配符查询,?为占位符,*匹配所有)、FuzzyQuery(模糊查询,其中构造器第二个参数代表可缺少字符数)
以上是关于luence优化速度的主要内容,如果未能解决你的问题,请参考以下文章