Solr手冊(4.0Beta版)


概述

  這篇文檔涵蓋了使用示例schema和一些示例數據運行Solr的基礎。

必備

  為更好follow這個手冊,您需要...

    1. Java1.6或更高版本。您可以從OracleOpen JDK, 或者 IBM獲取.

      在命令行運行java -version以確認java版本號大於等於1.6.

      不支持Gnu的GCJ,因此它不對Solr起作用。

    2. Solr版本Solr release .

開始

在運行Solr服務的同一台機器的顯示手冊的瀏覽器上的示例鏈接會正確的指向您的Solr服務器。

解壓縮Solr版本,將目錄切換到“example”.(注意基准目錄會隨着下載版本不同而不同),如下例,在UNIX、Cygwin或MacOS:

user:~solr$ ls
solr-nightly.zip
user:~solr$ unzip -q solr-nightly.zip
user:~solr$ cd solr-nightly/example/

Solr可以運行在任何你選擇的Java Servlet容器內,為簡單起見,本手冊的實例索引包含一個小的Jetty安裝。

使用Solr WAR和示例配置啟動Jetty,運行start.jar...

user:~/solr/example$ java -jar start.jar
2012-06-06 15:25:59.815:INFO:oejs.Server:jetty-8.1.2.v20120308
2012-06-06 15:25:59.834:INFO:oejdp.ScanningAppProvider:Deployment monitor .../solr/example/webapps at interval 0
2012-06-06 15:25:59.839:INFO:oejd.DeploymentManager:Deployable added: .../solr/example/webapps/solr.war
...
Jun 6, 2012 3:26:03 PM org.apache.solr.core.SolrCore registerSearcher
INFO: [collection1] Registered new searcher Searcher@7527e2ee main{StandardDirectoryReader(segments_1:1)}

這將在端口8983啟動Jetty應用服務器,並在您的終端上顯示Solr的log信息。
您可以在瀏覽器通過加載頁面http://localhost:8983/solr/ 看到Solr已經啟動,這是Solr管理的開始界面。

 索引數據

您的Solr服務器已經啟動運行,但是它沒有任何數據。通過Posting命令,您可以修改Solr的索引:添加(或修改)文檔,刪除文檔,並且提交添加或刪除。這些命令支持多種格式(variety of formats)。

目錄 exampledocs 包含了一些展示多種Solr可以接受的命令的示例文件,以及一個在終端提交這些命令的java工具(還有一個shell腳本post.sh,在本手冊中,我們使用跨平台的Java客戶端)。

打開一個新的終端窗口,輸入exampledocs目錄,然后在同目錄下的一些XML文件運行“java -jar post.jar

user:~/solr/example/exampledocs$ java -jar post.jar solr.xml monitor.xml
SimplePostTool: version 1.4
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file monitor.xml
SimplePostTool: COMMITting Solr index changes..

現在,您已經在Solr中索引了兩個文檔,提交這些變化。在管理界面 "Query" tab,您可以搜索“Solr”,在文本框“q”里輸入“solr”.點擊按鈕“Execute Query”后應該顯示包含一個結果的如下URL...

http://localhost:8983/solr/collection1/select?q=solr&wt=xml

使用以下的命令(假設您的命令行sheel支持*.xml)您可以索引所有的示例數據。

user:~/solr/example/exampledocs$ java -jar post.jar *.xml
SimplePostTool: version 1.4
SimplePostTool: POSTing files to http://localhost:8983/solr/update..
SimplePostTool: POSTing file gb18030-example.xml
SimplePostTool: POSTing file hd.xml
SimplePostTool: POSTing file ipod_other.xml
SimplePostTool: POSTing file ipod_video.xml
...
SimplePostTool: POSTing file solr.xml
SimplePostTool: POSTing file utf8-example.xml
SimplePostTool: POSTing file vidcard.xml
SimplePostTool: COMMITting Solr index changes..

...現在您可以使用默認的Solr Query Syntax(Lucene的查詢語法的一個超集)搜索各種各樣的數據...

有多種不同的方法導入數據至Solr(索引數據)...您可以

更新數據

您可能已經注意到了,即使文件 solr.xml兩次提交到了服務器,當您搜索"solr"時仍然只得到了一個結果。這是因為示例 schema.xml指定了一個名為"id"的"uniqueKey"字段.無論何時您POST添加在uniqueKey字段上具有相同值的文檔時,它將自動替換已存在的文檔。通過在統計頁面的“CORE”/searcher段查看numDocs和maxDocs的值,您發現已經被替換了。

http://localhost:8983/solr/#/collection1/plugins/core?entry=searcher

numDocs表示在當前索引下可搜索的文檔數目(由於一些文件可能包含多於一個的<doc>而超過XML文件的數量)。maxDoc或許會更大,因為它包括了邏輯上被刪除而沒有從索引中移除的文檔。您可以任意多次重復提交這些示例XML文檔,但是numDocs永遠不會增加,因為新文檔總是會替換舊的。

編輯這些XML文件,改變一些數據,然后重新執行 java -jar post.jar命令,您可以看到后續的檢索反映出了這些變化。

刪除數據

您可以通過POSTing刪除命令至更新URL,指定文檔的uniqueKey字段,或者是一個多個文檔的查詢(那樣的話應該謹慎)以刪除數據。因為那些命令比較小,我們在命令行里指定他們而不是引用一個XML文件。

執行如下命令刪除指定的文檔。

java -Ddata=args -Dcommit=false -jar post.jar "<delete><id>SP2514N</id></delete>"

由於我們指定了“commit=false”,一個指定id:SP2514N 的檢索仍然可以檢索到我們已經刪除的文檔。因為示例配置實用了Solr的"autoCommit"特性,Solr會自動保存這個索引,但是直到一個“openSearcher”顯式執行,它不會影響檢索結果.

使用可以統計updateHandler的statistics page,您可以通過查看deletesById的值下降到0,而cumulative_deletesById 和autocommit的值增加的事實觀察到此次刪除寫入到了磁盤。

這里有一個使用delete-by-query刪除一些名字里包含DDR的示例。

java -Dcommit=false -Ddata=args -jar post.jar "<delete><query>name:DDR</query></delete>"

通過往Solr發送一個commit命令您可以強制打開一個新的searcher以反映出那些變化(這是post.jar的默認作法).

java -jar post.jar

現在重新執行前面的檢索去驗證那些未匹配的文檔被檢索到了。您可以重新訪問統計頁面並觀察在updateHandler 提交的數量和在searcher的numDocs。

通過打開一個新的搜索器(searcher)以提交是一個代價昂貴的操作,因此最好是批量更新同一個索引,最后再發送commit命令。還有一個optimize 命令可以完成同樣工作,並且會強制所有的索引segment合並成一個segment--這樣會使得資源密集,但是如果您的索引變化頻率不高的話,為提高搜索速度是值得的。

所有的更新命令可以指定為XML 或 JSON.

為繼續本手冊,到exampledocs目錄執行如下命令重新添加哪些被刪除的文檔。

java -jar post.jar *.xml

查詢數據

檢索是通過發送HTTP GET請求至 select URL,需要檢索的關鍵詞由參數q指定。您可以傳遞一些可選的request parameters 至請求處理器以控制所需返回信息。例如您可以使用參數"fl"控制返回哪些存儲的字段和是否要返回相關評分:

q=video&fl=name,id (僅返回字段name和id)

q=video&fl=name,id,score (同時也返回相關評分)

q=video&fl=*,score (返回所有的字段和相關評分)

q=video&sort=price desc&fl=name,id,price (添加排序指令,按照價格降序)

q=video&wt=json (以json方式返回)

在管理界面提供的查詢表單 允許設置各種查詢參數,這對測試或調試查詢時大有用處。

 

排序

Solr提供一種簡單的方法用來在一個或多個索引字段上進行排序。使用參數"sort"指定“ 字段和方向”,如果有多個字段則用逗號分隔:

score”也可以用來作為一個排序的字段:

復雜的函數也可以用來排序查詢結果:

q=video&sort=div(popularity,add(price,1)) desc

如果未指定排序字段,默認為評分降序(score desc)返回那些相關性最高的匹配結果。

高亮

命中高亮返回每個文檔相關的片段,並且高亮顯示那個上下文片段的詞元。

如下示例搜索“video card”並請求高亮字段name,features.這將用<em>標簽包裹那些需要高亮的詞元生成一個高亮節,並將它添加到響應中。

...&q=video card&fl=name,id&hl=true&hl.fl=name,features

更多與高亮相關的請求參數在這里.

 

切面搜索

切面搜索按照各種屬性或分類匯總匹配結果。一般會提供一些可供用戶鑽取的鏈接或者基於返回的分類完善搜索結果。

以下示例搜索所有的文檔(*:*) ,並按照分類字段“cat”進行匯總。

...&q=*:*&facet=true&facet.field=cat

注意盡管只有前10個文檔從結果列表中返回,切面匯總卻是以整個匹配查詢的結果集產生的.

我們可以一次按照多種方式切面。如下示例添加了一個按照是否有庫存(inStock)的布爾值的切面。

...&q=*:*&facet=true&facet.field=cat&facet.field=inStock

Solr可以為任意查詢產生匯總.以下示例查詢"ipod",並且通過使用在價格字段上的區間查詢(range queries)來展示低於和高於100的價格.

...&q=ipod&facet=true&facet.query=price:[0 TO 100]&facet.query=price:[100 TO *]

Solr甚至可以按照數值區間(包括日期)進行切面。這個示例請求按照制造日期(manufacturedate_dt字段),從2004年到2010年進行逐年匯總。

...&q=*:*&facet=true&facet.rage=manufacturedate_dt&facet.rage.start=2004-01-01T00:00:00Z&facet.rage.end=2010-01-01T00:00:00Z&facet.range.gap=+1YEAR

更多關於切面搜索的信息可以查看切面概述切面參數頁面。

搜索界面

Solr包含一個用velocity模板創建的示例搜索界面,演示了許多特性,包括搜索、切面、高亮、自動填充和地理搜索(原文是“geospatial searching”).

可以在http://localhost:8983/solr/collection1/browse實踐下。

文本分析

文本字段是一種典型的,通過將文本分解成符號(Tokens),使用各種諸如轉為小寫、去除復數詞尾(s,es等),去除分詞詞尾(d,ed,ing等,這兩種處理都是針對英文進行的處理)以提高相關性的典型索引。

Schema定義了索引中的字段以及在其上使用的分析器類型.您的collection現在使用的schema可以直接通過管理界面的Schema tab 查看,或者使用Schema Browser tab動態瀏覽.

適合您文本內容最好的分析組件(tokenization and filtering)嚴重依賴語言。正如你在Schema Browser中所見,許多在示例schema中的字段使用了一種叫做text_general的字段類型(fieldType),默認情況下它適合大多數的語言.

如果您的文本內容是英語,就像本手冊的示例文檔一樣,您可以使用面向英語的分詞和停用詞表,分隔復合詞,您可以使用字段類型text_en_splitting來代替.繼續編輯目錄"solr/example/solr/conf"下的文件"schema.xml".在字段textfeatures上使用字段類型text_en_splitting:

   <field name="features" type="text_en_splitting" indexed="true" stored="true" multiValued="true"/>
   ...
   <field name="text" type="text_en_splitting" indexed="true" stored="false" multiValued="true"/>

做完這些改變后重啟Solr,然后使用“java -jar post.jar *.xml”重新提交所有的示例文檔。現在下面列出來的搜索會演示面向英語(English-specific)的轉換:

  • 搜索“power-shot”能夠匹配"PowerShot",並且通過使用WordDelimiterFilter 和LowerCaseFilter,adata 能匹配 A-DATA
  • 通過使用PorterStemFilter的分詞特性,搜索“features:recharging”可以匹配Rechargeable 。
  • 使用SynonymFilter,搜索""能夠匹配"1GB",一般性錯誤拼寫"pixima"能匹配Pixma 

可供使用的關於分析組件、Analyzers、Tokenizers和TokenFilters的完整描述請查看這里.

分析調試

有一個非常便捷的Analysis tab ,在這里您可以看到一個文本值在索引和檢索時如何被分解成單詞符號。這個頁面展示了它們經過一系列的過濾器鏈處理后的符號(tokens)結果。

這個URL顯示了從“Canon Power-Shot SD500”使用text_en_splitting創建的符號。表格的每一段顯示了經過索引分析器的下一個符號過濾器(TokenFilter)的符號結果.注意“powershot”、“power”和"shot"是如何被索引的,使用具有相同"位置(postion)"的符號.(同使用通用字段類型處理產生的符號比較.)

鼠標移動到小節左側的標簽上將會顯示出位於整個鏈上的那個階段的分析器組件的全名稱。選擇或反選復選框"Verbose Output"將會顯示或隱藏詳細的符號屬性.

索引和查詢值同時提供時,兩個表將並排顯示每個鏈條上的結果.最終等於查詢鏈上的詞干的索引鏈上的詞干將會高亮顯示。

其他值得關注的示例:

English stemming and stop-words 使用 text_en 字段類型

Half-width katakana normalization with bi-graming 使用 text_cjk 字段類型

Japanese morphological decomposition with part-of-speech filtering 使用text_ja 字段類型

Arabic stop-words, normalization, and stemming 使用 text_ar 字段類型

結論

恭喜您!您已經成功運行了一個小的Solr實例,並且添加了一些文檔,同時對索引和schema做了修改。您了解了查詢、文本分析已經Solr管理界面。您已經做好了在您項目中使用Solr的准備!請繼續以下步驟:

  • 訂閱Solr郵件列表!
  • 將Solr的示例目錄做一份備份,可以作為您自己項目的一個模板.
  • 定制schema和其他位於 solr/collection1/conf/ 下的配置以滿足您的需求.

Solr擁有太多的在這里我們沒有提及的特性,包括處理海量文檔集合的分布式搜索函數查詢數值類型字段統計以及搜索結果聚集。瀏覽Solr Wiki以更詳細的了解Solr的特性

玩得開心,我們將在Solr的郵件列表里看到您!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM