Lucene优化
2010-01-22 15:43
190 查看
由于之前的Lucene使用中存在很严重的性能问题,所以最近在对lucene的优化中有如下心的。
1、对Indexsearcher进行缓存:通过在查询中复用,可以大幅度提高搜索的速度,因为每次打开,都会进行索引的加载,影响了性能,对它进行缓存后等于对查询进行了预热。
/// <summary>
/// 从缓存中获取indexsearcher
/// </summary>
/// <param name="indexDir"></param>
/// <param name="search"></param>
/// <returns></returns>
private static IndexSearcher GetIndexSearcher(string indexDir, IndexSearcher search, bool isPaper)
{
string key = isPaper ? PaperSearcherCacheKey : QuestionSearcherCacheKey;
if (CacheHelper.Exist(key))
{
search = (IndexSearcher)CacheHelper.Get(key);
IndexReader reader = search.GetIndexReader();
if (!reader.IsCurrent())
{
search.Close();
search = new IndexSearcher(reader.Reopen());
CacheHelper.Remove(key);
CacheHelper.Insert(key, search, 1200);
}
}
else
{
global::Lucene.Net.Index.IndexReader reader = IndexReader.Open(global::Lucene.Net.Store.FSDirectory.GetDirectory(indexDir), true);
search = new IndexSearcher(reader);
CacheHelper.Remove(key);
CacheHelper.Insert(key, search, 1200);
}
return search;
}
2、降低合并参数
小的合并参数可以减少段,这样在搜索的时候要加载的文件数就能够减少,可以更快的搜索。不过,这将降低索引的速度,因为这个阀值会提高合并的频率,减少索引文件的数量,增加IO的消耗。
3、排序字段的选择
排序中用字符串作为排序对象会相当耗费性能,日期之类的排序字段可以保存为20100110这样的类型,可以在排序中提升效率。
4、用indexreader做为参数构造indexsearcher,把reader设为只读,通过避免并发检查,可以提高性能。
5、indexreader不要频繁构建,如果只是因为iscurrent()中发现索引更新,只要通过reopen()方法就可以避免加载全部索引,而是只加载更新部分的索引。
(待续)
1、对Indexsearcher进行缓存:通过在查询中复用,可以大幅度提高搜索的速度,因为每次打开,都会进行索引的加载,影响了性能,对它进行缓存后等于对查询进行了预热。
/// <summary>
/// 从缓存中获取indexsearcher
/// </summary>
/// <param name="indexDir"></param>
/// <param name="search"></param>
/// <returns></returns>
private static IndexSearcher GetIndexSearcher(string indexDir, IndexSearcher search, bool isPaper)
{
string key = isPaper ? PaperSearcherCacheKey : QuestionSearcherCacheKey;
if (CacheHelper.Exist(key))
{
search = (IndexSearcher)CacheHelper.Get(key);
IndexReader reader = search.GetIndexReader();
if (!reader.IsCurrent())
{
search.Close();
search = new IndexSearcher(reader.Reopen());
CacheHelper.Remove(key);
CacheHelper.Insert(key, search, 1200);
}
}
else
{
global::Lucene.Net.Index.IndexReader reader = IndexReader.Open(global::Lucene.Net.Store.FSDirectory.GetDirectory(indexDir), true);
search = new IndexSearcher(reader);
CacheHelper.Remove(key);
CacheHelper.Insert(key, search, 1200);
}
return search;
}
2、降低合并参数
小的合并参数可以减少段,这样在搜索的时候要加载的文件数就能够减少,可以更快的搜索。不过,这将降低索引的速度,因为这个阀值会提高合并的频率,减少索引文件的数量,增加IO的消耗。
3、排序字段的选择
排序中用字符串作为排序对象会相当耗费性能,日期之类的排序字段可以保存为20100110这样的类型,可以在排序中提升效率。
4、用indexreader做为参数构造indexsearcher,把reader设为只读,通过避免并发检查,可以提高性能。
5、indexreader不要频繁构建,如果只是因为iscurrent()中发现索引更新,只要通过reopen()方法就可以避免加载全部索引,而是只加载更新部分的索引。
(待续)
相关文章推荐
- lucene索引库优化建议
- lucene创建索引高级特性和索引创建参数优化
- lucene-内存索引、内存索引保存在硬盘、索引优化
- JAVA_WEB项目之Lucene检索框架中的IndexWriter、IndexSearch优化
- Lucene的几点索引建设优化
- lucene (2.9--- 3.6) 范围搜索优化
- lucene使用与优化
- Lucene中string docvalues使用utf-16的优化
- 如何提高和优化Lucene搜索速度
- JAVAWEB开发之Lucene详解——Lucene入门及使用场景、全文检索、索引CRUD、优化索引库、分词器、高亮、相关度排序、各种查询
- 记Lucene GEO Query的一点优化
- lucene 搜索优化,个人实战经验总结
- 第六步:Lucene查询索引(优化一)
- Lucene6.6多查询优化
- lucene、lucene.NET详细使用与优化详解
- Lucene优化措施与研究Lucene的启示
- Lucene 优化
- [转]lucene、lucene.NET详细使用与优化详解
- 基于Lucene的近实时搜索引擎优化总结
- Lucene 索引优化 参数详解