solr - startup

web.xml配置文件
SolrDispatchFilter一個Filter,過濾所有的PATH
<filter-mapping>
    <filter-name>SolrRequestFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
    <filter-name>SolrRequestFilter</filter-name>
    <filter-class>org.apache.solr.servlet.SolrDispatchFilter</filter-class>
</filter>
SolrDispatchFilter.init – 加載CoreContainer,開始啓動solr應用

談CoreContainer類 – CoreContainer
a.實例化CoreContainer時會去尋找solr的home目錄,尋找的方法有兩個:1.到WEB的環境變量裏面去找KEY=java:comp/env/solr/home,2.通過System.getProperty去找KEY=solr.solr.home,3.如果都找不到則使用默認的路徑solr/
b.到Filter的初始化參數裏面找KEY=solrconfig-filename,如果沒有則使用solr.xml,作爲solr裏包含core的配置文件,如果找到這個文件則加載CoreContainer,首先實例化一個SolrResourceLoader,可以參考接口ResourceLoader的定義
InputStream openResource(String resource) – 獲取文件的輸入流
List<String> getLines(String resource) – 獲取文件裏KEY-VLAUE數據
Object newInstance(String cname, String... subpackages) – 獲取指定類名和包路徑的類的實例化
讀取core配置文件solr.xml獲取如下屬性
solr/ @persistent
solr/ @sharedLib – 如果此項不是NULL則將這個所有core使用的公共JAR包目錄,將這個目錄放入SolrResourceLoader的類加載目錄的路徑中
solr/property – 獲取solr所有property裏包含的KEY-VALUE,PUT到CoreContainer.containerProperties裏去
solr/cores/core – 獲取solr下的core,迭代solr/cores/core鏈表加載core
------
solr/cores/core/ @name – core的name
solr/cores/core/ @instanceDir – core的配置文件目錄
solr/cores/core/ @config – core的配置文件名稱,默認是solrconfig.xml
solr/cores/core/ @schema – core的schema文件名,默認是schema.xml
solr/cores/core/ @properties – core的property文件名,默認是conf/solrcore.properties
solr/cores/core/ @dataDir – core的存放索引文件的目錄,默認是data/
solr/cores/core/property – core的KEY-VALUE數據,會把上面的信息都放到這個Properties中
根據以上信息對這個core實例化一個CoreDescriptor,再根據這個CoreDescriptor創建一個SolrCore
1.實例化一個SolrResourceLoader作爲這個core的資源加載器,初始類加載地址爲CoreContainer的類加載地址,同時讀取core的property文件將
讀到KEY-VALUE和core.properties合併起來給這個資源加載器以後用
2.用這個ResourceLoader&core.configName實例化一個SolrConfig,在實例化中使用ResourceLoader獲取core.configName的文件流,再將這個文
件流DOM化,再根據solrconfig.xml加載SolrConfig
------
config/lib – JAR包路徑都加到SolrResourceLoader中
config/indexDefaults config/mainIndex – 實例化兩個SolrIndexConfig對象,將這兩個Node下的屬性SolrIndexConfig bean化,裏面包含的屬性主要是lucene建索引需要用到的,比如useCompoundFile,maxBufferedDocs,mergePolicyInfo。indexDefaults作爲mainIndex的默認選項
config/mainIndex/reopenReaders – reopenReaders : updateHandler每次commit後會跟新solrCore的當前的reader,如果這個值是true則獲取當前的reader.reopen,如果是false則Index.open獲取索引的reader
config/query/maxBooleanClauses –booleanQueryMaxClauseCount : solrCore用來設置BooleanQuery子條件最多個數
config/query/boolTofilterOptimizer/ @enabled - filtOptEnabled
config/query/boolTofilterOptimizer/ @cacheSize - filtOptCacheSize
config/query/boolTofilterOptimizer/ @threshold –filtOptThreshold
config/query/useFilterForSortedQuery - useFilterForSortedQuery
config/query/queryResultWindowSize - queryResultWindowSize
config/query/queryResultMaxDocsCached - queryResultMaxDocsCached
config/query/enableLazyFieldLoading –enableLazyFieldLoading
------
core的四個cache配置加載,針對cache配置節點需要加載如下信息
1.node的名稱,比如filterCache
2. @class – 得到這個cache的類名,solr提供了兩種FastLRUCache&LRUCache
3. @regenerator – 得到在預熱新的searcher時舊的searcher的cache添加到新的searcher的行爲
4.再讓ResourceLoader根據 @class去找到cache的class,根據 @regenerator加載其實例
config/query/filterCache - filterCacheConfig
config/query/queryResultCache - queryResultCacheConfig
config/query/documentCache - documentCacheConfig
config/query/fieldValueCache – fieldValueCacheConfig
在加載完這四個cacheConfig後,如果有哪個沒有配置regenerator則會爲其設置一個默認的,具體邏輯見SolrIndexSearcher
------
config/mainIndex/unlockOnStartup – unlockOnStartup : solrCore用來首次啓動是否清空write.lock鎖
config/query/useColdSearcher – useColdSearcher : solrCore當前的searcher引用爲null的話且有其他線程在加載的話
來自搜索組件的獲取searcher的線程會阻塞等其加載好,如果這個值設置爲TRUE則其加載好searcher後這些線程就可以立即返回,否則要等到這個新建的searcher經過熱身後纔會返回
config/dataDir – dataDir : 索引存放目錄
config/query/cache – userCacheConfigs
config/HashDocSet/ @loadFactor – hashSetInverseLoadFactor
config/HashDocSet/ @maxSize – hashDocSetMaxSize
config/query/maxWarmingSearchers – maxWarmingSearchers : solrCore用來限制其正在進行warm操作的
IndexSearcher的個數,warm操作即將其前一個IndexSearcher的cache複製給自己
加載插件 – 根據PATH讀取DOM裏面所有的NODE,對於每個NODE實例化一個PluginInfo,主要是提取如下信息
a.type -> TagName,例如requestHandler
b.name ->  @name 插件名稱
c.className ->  @class 類名
d.initArgs -> 爲NamedListInitializedPlugin準備的,當實例化插件時,如果是NamedListInitializedPlugin會將這個
作爲init函數的參數傳入做初始化操作
e.attributes –> 屬性MAP化
config/requestHandler : solrCore用來配置RequestHandler,轉發給請求指明的handler去處理
config/queryParser : solrCore用來配置QueryParser
config/queryResponseWriter : solrCore用來配置QueryResponseWriter,如果查詢有指定輸出格式則到配置的QueryResponseWriter裏查,沒有則用默認的
config/searchComponent : solrCore用來配置SearchComponent給RequestHandler用的
config/listener : solrCore用來配置相關事件LISTENER
config/directoryFactory : solrCore用來配置DirectoryFactory
config/mainIndex/deletionPolicy : solrCore用來配置IndexDeletionPolicy
config/indexReaderFactory : solrCore用來配置IndexReaderFactory
config/updateRequestProcessorChain : solrCore用來配置UpdateRequest處理責任鏈
加載UpdateHandlerInfo,使用updateHandler/ @class,updateHandler/autoCommit/maxDocs
updateHandler/autoCommit/maxTime,updateHandler/commitIntervalLowerBound實例化一個UpdateHandlerInfo : 
solrCore用來配置這個core的UpdateHandler
------
3.實例化此core的IndexSchema,使用core schema配置文件schema.xml初始化IndexSchema,IndexSchema是一個組織
Document.Field類型的數據結構,裏面主要分爲兩個部分一是對類型的定義,二是Document裏面包括哪些Field,需指定這些Field的名稱,類型;同時還可以指定默認的Field,設置唯一鍵,設置BooleanQuery的默認關係AND|OR
a.schema/types/fieldtype | schema/types/fieldType - 一個Node實例化一個FieldType
根據 @type到ResourceLoader里加載FieldType,注入 @name,獲取./analyzer[ @type='query']作爲此FiledType的query
分詞器,獲取./analyzer[not( @type)] | ./analyzer[ @type='index']作爲此FieldType的index分詞器,如果有任何一方
沒有配置則index&query使用同一個分詞器。將Node的屬性除了 @name, @type的其他屬性作用到FieldType上
b.schema/fields/field | schema/fields/dynamicField - 一個Node實例化一個SchemaField
根據 @type指定的類型到a.加載對應的FieldType. @name獲取對應的FieldType,處理Index,Store,TermVector相關的屬性這些SchemaField作爲這個core下DOC的Field的定義
c.schema/similarity - 加載算分器
d.schema/defaultSearchField/text() – 默認查詢字段
e.schema/solrQueryParser/ @defaultOperator – BooleanQuery的默認關係
f.schema/uniqueKey/text() – 唯一鍵
4.根據core的SolrConfig, CoreDescriptor, IndexSchema創建SolrCore
--------
a.獲取solrConfig.maxWarmingSearchers –> maxWarmingSearchers
獲取solrConfig.booleanQueryMaxClauseCount –> BooleanQuery.setMaxClauseCount
--------
b.獲取solrConfig裏配置的SolrEventListener插件,屬性 @event=firstSearcher的放入鏈表firstSearcherListeners
屬性 @event=newSearcher的放入鏈表newSearcherListeners
--------
c.獲取solrConfig裏配置的IndexDeletionPolicy插件,使用ResourceLoader加載類,如果是NamedListInitializedPlugin
使用其initArgs初始化,如果沒配置使用SolrDeletionPolicy作爲此core的索引文件刪除決策者
--------
d.獲取solrConfig裏配置的DirectoryFactory插件,實例化->init(initArgs),如果沒有使用StandardDirectoryFactory
獲取solrConfig裏配置的IndexReaderFactory插件,實例化->init(initArgs),如果沒有使用StandardIndexReaderFactory
如果這個目錄是JVM級別第一次打開&目錄存在&solrConfig.unlockStartup則去看目錄下的write.lock有沒有因爲進程的突然死亡而沒釋放掉,如果沒有釋放掉則釋放這個鎖
如果目錄不存在則實例化一個SolrIndexWriter,再關閉它,這樣做的目的是創建這個目錄
--------
e.獲取solrConfig裏配置的QueryResponseWriter插件,這類插件是定義查詢輸出格式的,solr目前支持xml,json,python,php,javabin,raw,ruby等輸出格式,加載完solrConfig定義的ResponseWriter後將solr支持的但沒出現在solrconfig.xml裏面的ResponseWriter添加到responseWriters中,如果solrconfig.xml沒設置默認的ResponseWriter則用xml做默認格式
--------
f.獲取solrConfig裏配置的QueryParser插件,這類插件是定義query語句解析用的,solr提供的幾種解析器接下來會提到
將solrconfig.xml定義的查詢語法解析器和solr提供的解析器放入qParserPlugins中
--------
g.獲取solrConfig裏配置的SearchComponent插件,放入searchComponents中,solr提供了幾個SearchComponent:
QueryComponent FacetComponent MoreLikeThisComponent HighlightComponent StatsComponent DebugComponent
如果solrConfig沒有配置這些默認的則主動注入
--------
h.獲取solrConfig裏配置的UpdateRequestProcessorChain插件,這個插件作爲此core處理UpdateRequest的責任鏈,如果
沒有配置是默認的責任鏈是LogUpdateProcessorFactory -> RunUpdateProcessorFactory
--------
i.實例化RequestHandlers-此core的solr請求處理器SolrRequestHandler管理者,用solrcofig配置文件初始化
SolrRequestHandler的啓動分爲兩種,一種是在系統啓動階段就初始化好;另一種是lazy啓動模式,只有在第一次調用handleRequest時纔去實例化&初始化,有屬性 @startup=lazy
遍歷SolrRequestHandler節點,對於lazy型的初始化LazyRequestHandlerWrapper(core, className, initArgs)
對於非lazy型的使用ResourceLoader加載實例再調用初始化函數init(initArgs)|init(PluginInfo)-PluginInfoInitialized
將創建的name -> RequestHandler映射註冊到RequestHandlers.handlers上
SolrRequestHandler初始化主要做的事是初始化其幾個屬性: NameList-initArgs
SolrParams-defaults,appends,invariants
比較典型的兩個RequestHandlers是處理查詢請求的SearchHandler和處理更新請求的Handler
--------
j.打開一個SolrIndexSearcher,同時根據solrconfig.updateHandlerInfo實例化UpdateHandler,默認爲
DirectUpdateHandler2
--------
k.在將全部需要加載的類都加載完後,solrCore還需要通知SolrCoreAware類對象core需要的類都實例化完了,SolrCoreAware可能需要做的初始化操作可以做了,solrCore會管理一個SolrCoreAware的鏈表,在使用ResourceLoader加載對象時判斷類是否是SolrCoreAware,如果是加入到鏈表中等着回調。重點關注SearchHandler-用來處理查詢請求的Handler,其在回調函數inform裏
主要的做的事是:
SearchHandler是SolrRequestHandler的一種,用來處理搜索請求的,前面有提到過SearchComponent,之前core
已經把用戶注入的SearchComponent和它支持的SearchComponent都加載好了,這些SearchComponent是
SearchHandler在處理搜索請求時幹活的組件,如果這個Handler自己配置了組件則使用它配置的組件,如果沒有配置則使用solr默認的搜索組件
------
加載完core後將core @name -> core的映射PUT到CoreContainer.cores上,CoreContainer類加載完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章