<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    CONAN ZONE

    你越掙扎我就越興奮

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      0 Posts :: 282 Stories :: 0 Comments :: 0 Trackbacks
    每一個搜索請求都會持有一個searcher的引用,而不是創建一個新的searcher,處理完后會釋放掉這個引用

    Solr在初始化化時,通過SolrCore核心類要做很多的初始化工作,包過讀取solrconfig.xml配置文件里的內容,代碼如下:
      
     booleanQueryMaxClauseCount(); //設置布爾查詢最多個數。
        initListeners();  //讀取配置文件的search實例的監聽器。
        initDeletionPolicy();
        initIndex();
        initWriters();
        initQParsers();
        initValueSourceParsers();
        this.searchComponents = loadSearchComponents();
        // Processors initialized before the handlers
        updateProcessorChains = loadUpdateProcessorChains();
        reqHandlers = new RequestHandlers(this);
        reqHandlers.initHandlersFromConfig( solrConfig );
        highlighter = initHighLighter();
        // Handle things that should eventually go away
        initDeprecatedSupport();

    loadSearchComponents方法就是初始化indexSearch實例。詳細說明如下:
    getSearcher – (forceNew, returnSearcher, waitSearcher-Futures)
    關注solr全局三個點調用getSearcher函數 : solrCore初始化時(false, false, null),QueryComponent處理查詢
    請求時(false, true, null),UpdateHandler在處理commit請求時(true, false, new Future[1])
    ---------
    1.solrCore初始化時
    根據solrconfig配置的IndexReaderFactory&DirectoryFactory獲取索引的IndexReader,再使用這個reader
    封裝一個SolrIndexReader,再使用這個SolrIndexReader封裝一個RefCounted(searcher的引用計數器,當搜索
    組件獲取一個組件后引用++,用完后調用close引用--,當引用數為0時將這個引用從core管理的一個當前被使用的
    searcher的鏈表移除,同時調用searcher.close回收資源),將這個引用添加到core管理的一個當前被使用的searcher
    的鏈表里如果firstSearcherListeners不為空則回調這些監聽器,這個回調是交給core的一個newSingleThreadExecutor去
    做的,再往這個線程池里添加一個任務:將這個RefCounted設置為core當前最新的searcher的引用計數器
    最后返回null,因為returnSearcher=false
    在solrCore初始化時這樣做的主要目的是在初始化時就加載好IndexSearcher,搜索請求來了之后能立即返回,
    而不必等待加載IndexSearcher
    ---------
    2.QueryComponent處理查詢請求時
    由于core當前最新的searcher的引用計數器不為null且這個獲取IndexSearcher的請求不是強制要求獲取最新的,且
    returnSearcher=true故直接返回core當前最新的searcher的引用計數器,且這個引用計數器做++
    這里面還有段當前searcher的引用計數器為null的邏輯,但是沒有發現有什么情況會導致這種情況發生故不累述了
    ---------
    3.UpdateHandler在處理commit請求時
    首先到core管理的一個當前被使用的searcher的鏈表里獲取目前最新的searcher;同時會加載索引目錄下的
    index.properties文件(如果存在的話),拿到KEY=’index’的值,其指明目前索引的存放地方;如果獲取的目錄和當前
    最新的searcher使用的目錄一致且solrConfig.reopenReaders為true則獲取通過searher.reader.reopen獲取
    最新的reader -> 封裝成searcher,否則直接IndexReader.open獲取reader。
    獲取到searcher后的一段邏輯[RefCount封裝,添加到searchers鏈表]和core初始化時是一樣的,接下來的邏輯是
    如果solrConfig.useColdSearcher為TRUE其當前searcher的引用為null-導致來自QueryComponent的請求阻塞
    [現在還沒發現什么情況會導致searcher的引用為null]
    立即將這個新的searcher的引用設置為core當前最新的searcher的引用計數器,這樣來自QueryComponent的請求
    拿到這個引用后返回,當時這時這個新建的searcher是沒有經過其前一個searcher的cache熱身的,同時這樣會導致這個
    新建的searcher不會進行熱身活動
    如果solrConfig.useColdSearcher為FALSE則會往線程池里添加一個熱身的任務
    如果newSearcherListeners不為空則回調這些監聽器,也是給線程池的任務
    最后如果先前沒有做將新的searcher的引用設置為core當前最新的searcher的引用計數器的行為的話,則往線程池添加
    一個任務 – 將新的searcher的引用設置為core當前最新的searcher的引用計數器
    最后返回null,因為returnSearcher=false

    from:http://blog.sina.com.cn/s/blog_56fd58ab0100v3tp.html
    posted on 2012-06-13 14:17 CONAN 閱讀(1492) 評論(0)  編輯  收藏 所屬分類: Solr
    主站蜘蛛池模板: 男人扒开添女人下部免费视频| 亚洲一区精彩视频| 特级av毛片免费观看| 国产精品酒店视频免费看| 亚洲人成网站免费播放| 狼友av永久网站免费观看| 亚洲熟妇av午夜无码不卡| 成年女人色毛片免费看| 亚洲大尺度无码无码专线一区| 日本特黄特色aa大片免费| 国产成人亚洲精品91专区高清| 亚洲高清免费视频| 99久久免费国产精精品| 亚洲国产精品线在线观看| 57pao一国产成永久免费| 亚洲深深色噜噜狠狠网站| 国产色婷婷精品免费视频| 人妻巨大乳hd免费看| 亚洲综合成人网在线观看| 免费看成人AA片无码视频羞羞网| 亚洲精品中文字幕| 亚洲欧洲久久av| 免费无码中文字幕A级毛片| 国产成人精品日本亚洲专| 免费观看亚洲人成网站| 三级网站在线免费观看| 亚洲国产成人无码av在线播放| 国产精品视频永久免费播放| 国产偷国产偷亚洲高清在线| 亚洲精品国偷自产在线| 国产精品免费精品自在线观看| 日韩亚洲人成在线综合| 亚洲久本草在线中文字幕| 啦啦啦手机完整免费高清观看| 一级毛片a免费播放王色电影 | 亚洲国产另类久久久精品小说 | 蜜桃精品免费久久久久影院| h在线看免费视频网站男男| 亚洲第一二三四区| 亚洲精品国产高清嫩草影院| 无码中文字幕av免费放dvd|