1、 solr基礎
因為 Solr 包裝並擴展了 Lucene,所以它們使用很多相同的術語。更重要的是,Solr 創建的索引與 Lucene 搜索引擎庫完全兼容。通過對 Solr 進行適當的配置,某些情況下可能需要進行編碼,Solr 可以閱讀和使用構建到其他 Lucene 應用程序中的索引。
在 Solr 和 Lucene 中,使用一個或多個 Document 來構建索引。Document 包括一個或多個 Field。Field 包括名稱、內容以及告訴 Solr 如何處理內容的元數據。例如,Field 可以包含字符串、數字、布爾值或者日期,也可以包含你想添加的任何類型,只需用在solr的配置文件中進行相應的配置即可。Field 可以使用大量的選項來描述,這些選項告訴 Solr 在索引和搜索期間如何處理內容。現在,查看一下表 1 中列出的重要屬性的子集:
屬性名稱 |
描述 |
Indexed |
Indexed Field 可以進行搜索和排序。你還可以在 indexed Field 上運行 Solr 分析過程,此過程可修改內容以改進或更改結果。 |
Stored |
stored Field 內容保存在索引中。這對於檢索和醒目顯示內容很有用,但對於實際搜索則不是必需的。例如,很多應用程序存儲指向內容位置的指針而不是存儲實際的文件內容。 |
2、 solr索引操作
在 Solr 中,通過向部署在 servlet 容器中的 Solr Web 應用程序發送 HTTP 請求來啟動索引和搜索。Solr 接受請求,確定要使用的適當 SolrRequestHandler,然后處理請求。通過 HTTP 以同樣的方式返回響應。默認配置返回 Solr 的標准 XML 響應。你也可以配置 Solr 的備用響應格式,如json、csv格式的文本。
索引就是接受輸入元數據(數據格式在schema.xml中進行配置)並將它們傳遞給 Solr,從而在 HTTP Post XML 消息中進行索引的過程。你可以向 Solr 索引 servlet 傳遞四個不同的索引請求:
2.1. add/update
允許您向 Solr 添加文檔或更新文檔。直到提交后才能搜索到這些添加和更新。
2.2. commit
告訴 Solr,應該使上次提交以來所做的所有更改都可以搜索到。
2.3. optimize
重構 Lucene 的文件以改進搜索性能。索引完成后執行一下優化通常比較好。如果更新比較頻繁,則應該在使用率較低的時候安排優化。一個索引無需優化也可以正常地運行。優化是一個耗時較多的過程。
2.4. delete
可以通過 id 或查詢來指定。按 id 刪除將刪除具有指定 id 的文檔;按查詢刪除將刪除查詢返回的所有文檔。
Lucene中操作索引也有這幾個步驟,但是沒有更新。Lucene更新是先刪除,然后添加索引。因為更新索引在一定情況下,效率沒有先刪除后添加的效率好。
3、 搜索
添加文檔后,就可以搜索這些文檔了。Solr 接受 HTTP GET 和 HTTP POST 查詢消息。收到的查詢由相應的 SolrRequestHandler 進行處理。
solr查詢參數描述:
參數 |
描述 |
示例 |
q |
Solr 中用來搜索的查詢。有關該語法的完整描述,請參閱 參考資料。可以通過追加一個分號和已索引且未進行斷詞的字段(下面會進行解釋)的名稱來包含排序信息。默認的排序是 score desc,指按記分降序排序。 |
q=myField:Java AND otherField:developerWorks; date asc 此查詢搜索指定的兩個字段,並根據一個日期字段對結果進行排序。 |
start |
將初始偏移量指定到結果集中。可用於對結果進行分頁。默認值為 0。 |
start=15 返回從第 15 個結果開始的結果。 |
rows |
返回文檔的最大數目。默認值為 10。 |
rows=25,返回25個結果集 |
fq |
提供一個可選的篩選器查詢。查詢結果被限制為僅搜索篩選器查詢返回的結果。篩選過的查詢由 Solr 進行緩存。它們對提高復雜查詢的速度非常有用。 |
任何可以用 q 參數傳遞的有效查詢,排序信息除外。 |
hl |
當 hl=true 時,在查詢響應中醒目顯示片段。默認為 false。參看醒目顯示參數(見 參考資料)。 |
hl=true |
fl |
作為逗號分隔的列表指定文檔結果中應返回的 Field 集。默認為 “*”,指所有的字段。“score” 指還應返回記分。 |
*,score |
sort |
排序,對查詢結果進行排序,參考 |
sort=date asc,price desc |
4、 solr模式
上面有提到schema.xml這個配置,這個配置可以在你下載solr包的安裝解壓目錄的apache-solr-3.4.0\example\solr\conf中找到,它就是solr模式關聯的文件。打開這個配置文件,你會發現有詳細的注釋。
模式組織主要分為三個重要配置
4.1. types 部分
是一些常見的可重用定義,定義了 Solr(和 Lucene)如何處理 Field。也就是添加到索引中的xml文件屬性中的類型,如int、text、date等
4.2. fileds
是你添加到索引文件中出現的屬性名稱,而聲明類型就需要用到上面的types
4.3. 其他配置
uniqueKey 唯一鍵,這里配置的是上面出現的fileds,一般是id、url等不重復的。在更新、刪除的時候可以用到。
defaultSearchField默認搜索屬性,如q=solr就是默認的搜索那個字段
solrQueryParser查詢轉換模式,是並且還是或者(and/or)
4.4. schema配置類型
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true"
words="stopwords.txt" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="1"
catenateNumbers="1" catenateAll="0" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"
ignoreCase="true" expand="true" />
<filter class="solr.StopFilterFactory" ignoreCase="true"
words="stopwords.txt" />
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1" catenateWords="0"
catenateNumbers="0" catenateAll="0" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory" />
</analyzer>
</fieldType>
上面就是一個type了,然后你在fields配置field的時候就可以用這個type。
首先,上面的fieldType的配置中有兩個analyzer,它是分詞器。
主要把我們的數據進行分割成一個個的詞語。詞干提取、停止詞刪除以及相似的操作都被應用於標記,然后才進行索引和搜索,導致使用相同類型的標記。
上面的應用程序的 Solr 的fieldType配置按以下步驟進行設置:
Ø 根據空白進行斷詞,然后刪除所有的公共詞(StopFilterFactory)
Ø 使用破折號處理特殊的大小寫、大小寫轉換等等。(WordDelimiterFilterFactory);將所有條目處理為小寫(LowerCaseFilterFactory)
Ø 使用 Porter Stemming 算法進行詞干提取(EnglishPorterFilterFactory)
Ø 刪除所有的副本(RemoveDuplicatesTokenFilterFactory)
4.5. schema屬性、字段
<field name="id" type="string" indexed="true" stored="true"
required="true" />
<field name="sku" type="text_en_splitting_tight" indexed="true"
stored="true" omitNorms="true" />
<field name="name" type="text_general" indexed="true" stored="true" />
<field name="alphaNameSort" type="alphaOnlySort" indexed="true"
stored="false" />
<field name="manu" type="text_general" indexed="true" stored="true"
omitNorms="true" />
<field name="cat" type="string" indexed="true" stored="true"
multiValued="true" />
<field name="features" type="text_general" indexed="true" stored="true"
multiValued="true" />
<field name="includes" type="text_general" indexed="true" stored="true"
termVectors="true" termPositions="true" termOffsets="true" />
屬性是在添加索引、查詢的時候必須的配置,如果你不加這些配置。是無法完成索引的創建的。
4.5.1. id屬性
首先id屬性是未經分析的字符串類型,是可以索引、存儲的,並且是唯一的。
4.5.2. sku屬性
sku是一個經過分詞器分析出來的英文切割的類型字符,可以索引、存儲、不要存儲規范
4.5.3. multiValued 屬性
multiValued 屬性是一個特殊的例子,指 Document 可以擁有一個相同名稱添加了多次的 Field。
4.5.4. omitNorms屬性
omitNorms 屬性告訴 Solr(和 Lucene)不要存儲規范。
4.5.6. 動態字段dynamicField
介紹一下字段聲明下方的 <dynamicField> 聲明。
動態字段是一些特殊類型的字段,可以在任何時候將這些字段添加到任何文檔中,由字段聲明定義它們的屬性。
動態字段和普通字段之間的關鍵區別在於前者不需要在 schema.xml 中提前聲明名稱。
Solr 將名稱聲明中的 glob-like 模式應用到所有尚未聲明的引入的字段名稱,並根據其 <dynamicField> 聲明定義的語義來處理字段。
例如,<dynamicField name="*_i" type="sint" indexed="true" stored="true"/> 指一個 myRating_i 字段被 Solr 處理為 sint,盡管並未將其聲明為字段。
這種處理比較方便,例如,當需要用戶定義待搜索內容的時候。
5、 索引配置solrconfig.xml
Solr 性能因素,來了解與各種更改相關的性能權衡。
表 1 概括了可控制 Solr 索引處理的各種因素:
因素 |
描述 |
useCompoundFile |
通過將很多 Lucene 內部文件整合到單一一個文件來減少使用中的文件的數量。這可有助於減少 Solr 使用的文件句柄數目,代價是降低了性能。除非是應用程序用完了文件句柄,否則 false 的默認值應該就已經足夠。 |
mergeFactor |
決定低水平的 Lucene 段被合並的頻率。較小的值(最小為 2)使用的內存較少但導致的索引時間也更慢。較大的值可使索引時間變快但會犧牲較多的內存。 |
maxBufferedDocs |
在合並內存中文檔和創建新段之前,定義所需索引的最小文檔數。段 是用來存儲索引信息的 Lucene 文件。較大的值可使索引時間變快但會犧牲較多的內存。 |
maxMergeDocs |
控制可由 Solr 合並的 Document 的最大數。較小的值 (< 10,000) 最適合於具有大量更新的應用程序。 |
maxFieldLength |
對於給定的 Document,控制可添加到 Field 的最大條目數,進而截斷該文檔。如果文檔可能會很大,就需要增加這個數值。然而,若將這個值設置得過高會導致內存不足錯誤。 |
unlockOnStartup |
unlockOnStartup 告知 Solr 忽略在多線程環境中用來保護索引的鎖定機制。在某些情況下,索引可能會由於不正確的關機或其他錯誤而一直處於鎖定,這就妨礙了添加和更新。將其設置為 true 可以禁用啟動鎖定,進而允許進行添加和更新。 |
6、 查詢處理配置solrconfig.xml
6.1. <maxBooleanClauses> 標記
定義了可組合在一起形成一個查詢的子句數量的上限。對於大多數應用程序而言,默認的 1024 就應該已經足夠;
然而,如果應用程序大量使用了通配符或范圍查詢,增加這個限值將能避免當值超出時,拋出 TooManyClausesException。
6.2. <enableLazyFieldLoading>標記
若應用程序預期只會檢索 Document 上少數幾個 Field,那么可以將 <enableLazyFieldLoading> 屬性設置為 true。
懶散加載的一個常見場景大都發生在應用程序返回和顯示一系列搜索結果的時候,用戶常常會單擊其中的一個來查看存儲在此索引中的原始文檔。
初始的顯示常常只需要顯示很短的一段信息。若考慮到檢索大型 Document 的代價,除非必需,否則就應該避免加載整個文檔。
6.3. <query>部分
<query> 部分負責定義與在 Solr 中發生的事件相關的幾個選項。
Searcher 的 Java 類來處理 Query 實例。要改進這一設計和顯著提高性能,把這些新的 Searcher 聯機以便為現場用戶提供查詢服務之前,先對它們進行 “熱身”。
<query> 部分中的 <listener> 選項定義 newSearcher 和 firstSearcher 事件,您可以使用這些事件來指定實例化新搜索程序或第一個搜索程序時應該執行哪些查詢。
如果應用程序期望請求某些特定的查詢,那么在創建新搜索程序或第一個搜索程序時就應該反注釋這些部分並執行適當的查詢。
6.4. 其它配置
solrconfig.xml 文件的剩余部分,除 <admin> 之外,涵蓋了與 緩存、復制 和 擴展或定制 Solr 有關的項目。
admin 部分讓您可以定制管理界面。有關配置 admin 節的更多信息,請參看solrconfig.xml 文件中的注釋。
7、 監視、記錄和統計數據
用於監視、記錄和統計數據的 Solr 管理選項
菜單名 |
URL |
描述 |
Statistics |
Statistics 管理頁提供了與 Solr 性能相關的很多有用的統計數據。這些數據包括: 關於何時加載索引以及索引中有多少文檔的信息。 關於用來服務查詢的 SolrRequestHandler 的有用信息。 涵蓋索引過程的數據,包括添加、刪除、提交等的數量。 緩存實現和 hit/miss/eviction 信息 |
|
Info |
有關正在運行的 Solr 的版本以及在當前實現中進行查詢、更新和緩存所使用的類的詳細信息。此外,還包括文件存於 Solr subversion 存儲庫的何處的信息以及對該文件功能的一個簡要描述。 |
|
Distribution |
顯示與索引發布和復制有關的信息。更多信息,請參見 “發布和復制” 一節。 |
|
Ping |
向服務器發出 ping 請求,包括在 solrconfig.xml 文件的 admin 部分定義的請求。 |
|
Logging |
讓您可以動態更改當前應用程序的日志記錄等級。更改日志記錄等級對於調試在執行過程中可能出現的問題非常有用。 |
|
properties |
http: //localhost:8080/solr/admin/get-properties.jsp |
顯示當前系統正在使用的所有 Java 系統屬性。Solr 支持通過命令行的系統屬性替換。有關實現此特性的更多信息,請參見 solrconfig.xml 文件。 |
Thread dump |
http://localhost:8080/solr/admin/threaddump.jsp |
thread dump 選項顯示了在 JVM 中運行的所有線程的堆棧跟蹤信息。 |
8、 智能緩存
智能緩存是讓 Solr 得以成為引人矚目的搜索服務器的一個關鍵性能特征。
Solr 提供了四種不同的緩存類型,所有四種類型都可在 solrconfig.xml 的 <query> 部分中配置。
solrconfig.xml 文件中所用的標記名列出了這些緩存類型:
緩存標記名 |
描述 |
能否自熱 |
filterCache |
通過存儲一個匹配給定查詢的文檔 id 的無序集,過濾器讓 Solr 能夠有效提高查詢的性能。緩存這些過濾器意味着對 Solr 的重復調用可以導致結果集的快速查找。更常見的場景是緩存一個過濾器,然后再發起后續的精煉查詢,這種查詢能使用過濾器來限制要搜索的文檔數。 |
可以 |
queryResultCache |
為查詢、排序條件和所請求文檔的數量緩存文檔 id 的有序 集合。 |
可以 |
documentCache |
緩存 Lucene Document,使用內部 Lucene 文檔 id(以便不與 Solr 惟一 id 相混淆)。由於 Lucene 的內部 Document id 可以因索引操作而更改,這種緩存不能自熱。 |
不可以 |
Named caches |
命名緩存是用戶定義的緩存,可被 Solr 定制插件 所使用。 |
可以, 如果實現了 org.apache.solr.search.CacheRegenerator 的話。 |
每個緩存聲明都接受最多四個屬性:
class 是緩存實現的 Java 名。
size 是最大的條目數。
initialSize 是緩存的初始大小。
autoWarmCount 是取自舊緩存以預熱新緩存的條目數。如果條目很多,就意味着緩存的 hit 會更多,只不過需要花更長的預熱時間。