<solr in action>indexing個(gè)人筆記 solr的索引過程可概括為三個(gè)關(guān)鍵的任務(wù): 1.轉(zhuǎn)換一份文件從它的原始格式到支持的格式,如XML或者JSON 2.使用已定義好的其中一種接口的來添加此份文檔,典型是HTTP POST 3.索引期間,配置Solr來應(yīng)用轉(zhuǎn)換到文檔中的文本 見圖15102701.jpg 設(shè)計(jì)方案 關(guān)于你的搜索應(yīng)用,你要學(xué)會(huì)回答以下關(guān)鍵問題: 1.在你的索引中,文檔是什么 2.每份文檔的唯一鍵是如何被標(biāo)識(shí) 3.在你的文檔里,那些字段可以被用戶搜索 4.在搜索結(jié)果,那幾個(gè)字段應(yīng)該顯示給用戶 問題一就是要討論文檔粒度. 問題二,找一個(gè)唯一字段標(biāo)識(shí)每份文檔,solr用來查找這份文檔,如果帶有同一唯一鍵的文檔要添加到索引,solr會(huì)使用這份最后的文檔覆蓋已存在的記錄. 問題三,那些字段是索引字段.除了用于搜索的字段外,還有用于排序,分面(facet),分組(group by),用于提供搜索建議或執(zhí)行函數(shù)查詢的字段都應(yīng)該標(biāo)記為索引字段 問題四,那些字段是存儲(chǔ)字段.一般從搜索角度來看是沒有用的,但用于顯示搜索結(jié)果的字段,都可稱為存儲(chǔ)字段. schema.xml就是solr用于理解如何索引你的文檔的主要配置文檔.schema.xml文檔主要有三部分. 1.<fields>元素包含<field>和<dynamicField>用于定義你的文檔的基本結(jié)構(gòu). 2.其他元素.例如<uniqueKey>和<copyField>,它們列于<fields>元素之后. 3.<types>下的字段類型決定了日期,數(shù)字,文本在solr是如何被處理的 必須字段屬性. <field name="screen_name" type="string" indexed="true" stored="true" /> 每個(gè)字段都要有一個(gè)唯一name屬性,還有一個(gè)type屬性.當(dāng)一個(gè)字段是存儲(chǔ)字段,solr存儲(chǔ)原始值而不是分析后的值.如上面,此文本字段是可搜索的,也可以在搜索結(jié)果返回原始文本.當(dāng)然,如果在搜索結(jié)果不返回這個(gè)字段,那么就必要存儲(chǔ)這個(gè)字段 多值字段 如果用一個(gè)字段保存多個(gè)值來建立索引,就可以將這個(gè)字段設(shè)置multiValued="true" 動(dòng)態(tài)字段 使用glob風(fēng)格表達(dá)式匹配字段,以下情況可以使用動(dòng)態(tài)字段: 1.使用多個(gè)字段建模文檔<dynamicField name="*_s" type="string" indexed="true" stored="true" /> 2.從不同來源支持文檔 3.添加新文檔來源 復(fù)制字段 以下兩種情況使用復(fù)制字體 1.將多個(gè)字段內(nèi)容放入單個(gè)字段(multiValued="true"的來源的name都是一樣的,而此情況的name是不一樣的) 2.應(yīng)用不同的文本分析同一個(gè)字段內(nèi)容來創(chuàng)建一個(gè)新的搜索字段 結(jié)構(gòu)化非文本字段類型 1.字符串字段.<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> solr.對(duì)應(yīng)org.apache.solr.schema.包的縮寫. 2.日期字段.<fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/> 3.數(shù)字字段.<fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> sortMissingFirst="true"排序結(jié)果中,solr將對(duì)于此字段沒有值的文檔列在結(jié)果的頂部. sortMissingLast="true"排序結(jié)果中,solr將對(duì)于此字段沒有值的文檔列在結(jié)果的底部. precisionStep="數(shù)字"在索引,決定創(chuàng)建詞語的數(shù)目來代表數(shù)值做快速排序查詢在那些基于Trie的字段.如TrieDate和TrieLong 數(shù)字越小,索引占空間越大,性能越好.所以在占空間越大和性能之間衡量取一個(gè)合適值. 使用xml或json索引文檔. 對(duì)于動(dòng)態(tài)字段,schema.xml有默認(rèn)配置,使用以下使命令就OK cd $SOLR_IN_ACTION/example-docs/ java -jar post.jar ch5/tweets.xml 使用SolrJ客戶端庫添加文檔 SolrServer solr = new HttpSolrServer(serverUrl); SolrInputDocument doc1 = new SolrInputDocument(); doc1.setField("id", "1"); doc1.setField("screen_name_s", "@thelabdude"); solr.add(doc1); SolrInputDocument doc2 = new SolrInputDocument(); doc2.setField("id", "2"); doc2.setField("screen_name_s", "@thelabdude"); solr.add(doc2); solr.commit(true, true); 其它工具導(dǎo)入文檔到solr Data Import Handler (DIH)(外部源為網(wǎng)站或關(guān)系型數(shù)據(jù)庫) ExtractingRequestHandler, aka Solr Cell(從二進(jìn)制文件如PDf,MS Office,OpenOffice文檔抽取文本建索引) Nutch(可以使用out of the box(開箱即用)的爬蟲) 更新handler 請求類型 描述 xml例子 Add 添加一個(gè)或多個(gè)文檔到索引<add><doc><field name="id">1</field>...</doc></add> Delete 根據(jù)ID刪除文檔<delete><id>1</id></delete> Delete by query 根據(jù)lucence查詢刪除文檔<delete><query>screen_name:@thelabdude</query></delete> Atomic update 使用樂觀鎖更新已存在文檔的一個(gè)或多個(gè)字段<add><doc><field name="id">1</field><field update="set"name="favorites_count">12</field></doc></add> Commit 提交文檔到索引<commit waitSearcher="true" softCommit="false" /> Optimize 通過混合多個(gè)段和移除已刪除優(yōu)化索引<optimize waitSearcher="false"/> 正常提交也叫硬提交.solr刷新所以未提交文檔到硬盤并且刷新內(nèi)部叫搜索器的組件,以便最近提交的文檔可被搜索.提交成功后,最近提交的文檔安全地被持久化到長期存儲(chǔ). 軟件提交.支持近實(shí)時(shí)搜索.你可以認(rèn)為軟提交作為一種機(jī)制使文檔能近實(shí)時(shí)搜索,通過跳過硬提交耗資源多的方面,如刷新到長期存儲(chǔ). 你仍然需要在某個(gè)時(shí)間點(diǎn)做一個(gè)硬提交來確保未提交的文檔最終被刷新到長期存儲(chǔ). 兩者的區(qū)別就是有沒有刷新到長期存儲(chǔ). AUTOCOMMIT(自動(dòng)硬提交) 1.在一個(gè)指定的時(shí)間內(nèi)提交每一份文檔. 2.一旦到達(dá)用戶指定未提交文檔的閾值,提交所有文檔. 3.在一個(gè)常規(guī)時(shí)間間隔,提交所有文檔.如每十分鐘. <autoCommit> <maxTime>600000</maxTime> <maxDocs>50000</maxDocs> <openSearcher>true</openSearcher> </autoCommit> autoSoftCommit(自動(dòng)軟提交) <autoSoftCommit> <maxTime>1000</maxTime> </autoSoftCommit> 事務(wù)日志的三個(gè)關(guān)鍵目的: 1.用于支持實(shí)時(shí)取和原子性更新. 2.從提交過程分離連續(xù)寫 3.在SolrCloud支持同步復(fù)制到shard leaders update="值" 值可為set,inc,add set在我看來理解為覆蓋,inc用于數(shù)值在原基礎(chǔ)上遞增,add用于添加多值(Multivalued) 使用_version_實(shí)現(xiàn)樂觀鎖控制之前必須要知道_version_值, 此值可通過get請求http://localhost:8983/solr/collection1/get?id=1&fl=id,_version_獲取 (如果了解過JPA帶有@Version字段的實(shí)體,使用樂觀鎖解決并發(fā)問題.上面的這種機(jī)制是一樣的) 索引管理 索引存儲(chǔ).提交文檔到索引時(shí),是使用一個(gè)叫directory的組件寫到長期存儲(chǔ).這個(gè)組件的四個(gè)好處: 1.從長期存儲(chǔ)讀和寫到長期存儲(chǔ),隱藏細(xì)節(jié). 2.實(shí)現(xiàn)一個(gè)特定存儲(chǔ)鎖機(jī)制來阻止索引中斷 3.隔離Solr來自于從JVM和操作系統(tǒng)的特點(diǎn)。 4.啟用擴(kuò)展一個(gè)基于directory實(shí)現(xiàn)的行為來支持特定使用情況,如近實(shí)時(shí)搜索 默認(rèn)存儲(chǔ)配置solr.NRTCachingDirectoryFactory 它是StandardDirectoryFactory的封裝,可以根據(jù)操作系統(tǒng)和jvm的具體情況,替換為MMapDirectory,SimpleFSDirectory,NIOFSDirectory三者之一. 段混合.這是一個(gè)很耗CPU,硬盤IO的操作.所以solr社區(qū)當(dāng)前建議微調(diào)solr段混合策略,而不是混合成一個(gè)大文件.有需要再去看看專家級(jí)混合設(shè)置 處理已刪除的文檔.刪除不會(huì)從已存在段刪除文檔.刪除的文檔并沒有從索引中移除,而是直到包含刪除文檔的段被合并那時(shí)才是真的刪除. |
|