zoukankan      html  css  js  c++  java
  • Lucene优化

    由于之前的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()方法就可以避免加载全部索引,而是只加载更新部分的索引。

    (待续)

  • 相关阅读:
    JavaScript数组去重(12种方法,史上最全转载)
    数组从大到小排序的两种方式
    jquery.inArray()和splice()使用小记
    HbuilderX 线上打包Android9.0版本无法更新
    常见的移动端H5页面开发遇到的坑和解决办法
    监听点击物理返回键及mui.fire父子页面传参
    深入理解DOM事件类型系列第三篇——变动事件
    jquery监听div等元素的内容变化
    寒假进度3
    寒假进度2
  • 原文地址:https://www.cnblogs.com/brightwang/p/1654244.html
Copyright © 2011-2022 走看看