solr教程,值得剛接觸搜索開發人員一看

在一般系統中維護的都是增刪改,在Solr中的維護功能是增刪和優化功能,在Solr中的修改操作就是先刪掉再添加.在做索引維護之前,首先要做的是配置schema.xml主要是按上面章節中的說明設置好字段信息(名稱,類型,索引,存儲,分詞等信息),大概就像在數據庫中新建一個表一樣.設置好schema.xml就可以進行索引相關操作了.

本文介紹solr的功能使用及相關注意事項;主要包括以下內容:環境搭建及調試;兩個核心配置文件介紹;維護索引;查詢索引,和在查詢中可以應用的高亮顯示、拼寫檢查、搜索建議、分組統計、拼音檢索等功能的。

1. Solr 是什麼?

Solr它是一種開放源碼的、基於 Lucene Java 的搜索服務器,易於加入到 Web 應用程序中。Solr 提供了層面搜索(就是統計)、命中醒目顯示並且支持多種輸出格式(包括XML/XSLT 和JSON等格式)。它易於安裝和配置,而且附帶了一個基於HTTP 的管理界面。可以使用 Solr 的表現優異的基本搜索功能,也可以對它進行擴展從而滿足企業的需要。Solr的特性包括:

  • 高級的全文搜索功能
  • 專為高通量的網絡流量進行的優化
  • 基於開放接口(XML和HTTP)的標準
  • 綜合的HTML管理界面
  • 可伸縮性-能夠有效地複製到另外一個Solr搜索服務器
  • 使用XML配置達到靈活性和適配性
  • 可擴展的插件體系

2. Lucene 是什麼?

Lucene是一個基於Java的全文信息檢索工具包,它不是一個完整的搜索應用程序,而是為你的應用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta(雅加達) 家族中的一個開源項目。也是目前最為流行的基於Java開源全文檢索工具包。目前已經有很多應用程序的搜索功能是基於 Lucene ,比如Eclipse 幫助系統的搜索功能。Lucene能夠為文本類型的數據建立索引,所以你只要把你要索引的數據格式轉化的文本格式,Lucene 就能對你的文檔進行索引和搜索。

3. Solr vs Lucene

Solr與Lucene 並不是競爭對立關係,恰恰相反Solr 依存於Lucene,因為Solr底層的核心技術是使用Lucene 來實現的,Solr和Lucene的本質區別有以下三點:搜索服務器,企業級和管理。Lucene本質上是搜索庫,不是獨立的應用程序,而Solr是。Lucene專注於搜索底層的建設,而Solr專注於企業應用。Lucene不負責支撐搜索服務所必須的管理,而Solr負責。所以說,一句話概括 Solr: Solr是Lucene面向企業搜索應用的擴展。

Solr與Lucene架構圖:

Solr使用Lucene並且擴展了它!

  • 一個真正的擁有動態字段(Dynamic Field)和唯一鍵(Unique Key)的數據模式(Data Schema)
  • 對Lucene查詢語言的強大擴展!
  • 支持對結果進行動態的分組和過濾
  • 高級的,可配置的文本分析
  • 高度可配置和可擴展的緩存機制
  • 性能優化
  • 支持通過XML進行外部配置
  • 擁有一個管理界面
  • 可監控的日誌
  • 支持高速增量式更新(Fast incremental Updates)和快照發布(Snapshot Distribution)

4.搭建並調試Solr

4.1 安裝虛擬機

Solr 必須運行在Java1.6 或更高版本的Java 虛擬機中,運行標準Solr 服務只需要安裝JRE 即可,但如果需要擴展功能或編譯源碼則需要下載JDK 來完成。可以通過下面的地址下載所需JDK 或JRE :

  • OpenJDK ( http://java.sun.com/j2se/downloads.html )
  • Sun (http://java.sun.com/j2se/downloads.html )
  • IBM (http://www.ibm.com/developerworks/java/jdk/ )
  • Oracle (http://www.oracle.com/technology/products/jrockit/index.html )

安裝 步驟請參考相應的幫助文檔。

4.2下載Solr

本文針對Solr4.2版本進行調研的,下文介紹內容均針對Solr4.2版本,如與Solr 最新版本有出入請以官方網站內容為準。Solr官方網站下載地址:http://lucene.apache.org/solr/

4.3下載並設置Apache Ant

Solr是使用Ant進行管理的源碼, Ant是一種基於Java的build工具。理論上來說,它有些類似於Maven 或者是 C中的make。下載後解壓出來後,進行環境變量設置。

ANT_HOME:E:\Work\apache-ant\1.9.1 (這裡為你自己解壓縮的目錄) PATH:%ANT_HOME%\bin (這個設置是為了方便在dos環境下操作)

查看是否安裝成功,在命令行窗口中輸入命令ant,若出現結果:

說明ant安裝成功!因為ant默認運行build.xml文件,這個文件需要我們建立。現在就可以進行build Solr源碼了。在命令行窗口中進入到你的Solr源碼目錄,輸入ant會出現當前build.xml使用提示信息。

其它的先不用管它,我們只要針對我們使用的IDE進行build就行了,如果使用eclipse就在命令行輸入:ant eclipse.如果使用IntelliJ IDEA 就在命令行輸入:ant idea。這樣就能進行build了。

黑窗口裡提示這個。。。

失敗。。。為什麼呢,最後我發現是因為下載的ant中少了一個jar就是這apache-ivy(下載地址:http://ant.apache.org/ivy/)這東東名子真怪 ivy是ant管理jar依賴關係的。當第一次bulid時ivy會自動把build中的缺少的依賴進行下載。網速慢的第一次build要好久的。。。

下載一個jar就行把jar放到ant的lib下(E:\Work\apache-ant\1.9.1\lib)這樣再次運行ant 就會成功了。到現在才可以進行Solr的代碼調試。

4.4配置並運行Solr代碼

不管用什麼IDE首選都要設置Solr Home在IDE的JVM參數設置VM arguments寫入 -Dsolr.solr.home=solr/example/solr一般就行了.不行也可以使用絕對路徑.

solr使用StartSolrJetty文件作為入口文件進行調試代碼,在這裡可以設置服務器使用的端口和solr的webapps目錄.一般都不用設置,默認的就可以進行調試.Solr Home也能可在代碼中設置一樣好用. System.setProperty("solr.solr.home", "E:\\Work\\solr-4.2.0-src-idea\\solr\\example\\solr");

目前是使用自帶的一個example作為solr配置的根目錄,如果你有其他的solr配置目錄,設置之即可。點擊run即可,debug也是一樣可以用了。沒有別的問題就應該能運行了.注意servlet 容器使用的端口,如查提示:

FAILED [email protected]:8983: java.net.BindException: Address already in use: JVM_Bind 就說明當前端口占用中.改一下就可以了.如果沒有報錯啟動成功後就可以在瀏覽器中輸入地址: http://localhost:8983/solr/ 就可以看到如下界面

到這裡Solr就成功配置並運行了.要是想跟代碼調試在啟動時在這個方法裡點斷點就可以Initializer的initialize()方法如果想從瀏覽器中找斷點調試就要到SolrDispatchFilter的doFilter方法中點斷點了.

注:IE9在兼容模式下有bug,必須設置為非兼容模式。

5.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 內容保存在索引中。這對於檢索和醒目顯示內容很有用,但對於實際搜索則不是必需的。例如,很多應用程序存儲指向內容位置的指針而不是存儲實際的文件內容。

5.1模式配置Schema.xml

schema.xml這個配置文件可以在你下載solr包的安裝解壓目錄的\solr\example\solr\collection1\conf中找到,它就是solr模式關聯的文件。打開這個配置文件,你會發現有詳細的註釋。模式組織主要分為三個重要配置

5.1.1. types 部分

是一些常見的可重用定義,定義了 Solr(和 Lucene)如何處理 Field。也就是添加到索引中的xml文件屬性中的類型,如int、text、date等.

<fieldtype>

<fieldtype>

<fieldtype>

<fieldtype>

<analyzer>

<tokenizer>

<filter>

<filter>

<analyzer>

<tokenizer>

<filter>

<filter>

<filter>

參數說明:

屬性

描述

name

標識而已

class

和其他屬性決定了這個fieldType的實際行為。

sortMissingLast

設置成true沒有該field的數據排在有該field的數據之後,而不管請求時的排序規則, 默認是設置成false。

sortMissingFirst

跟上面倒過來唄。 默認是設置成false

analyzer

字段類型指定的分詞器

type

當前分詞用用於的操作.index代表生成索引時使用的分詞器query代碼在查詢時使用的分詞器

tokenizer

分詞器類

filter

分詞後應用的過濾器 過濾器調用順序和配置相同.

5.1.2. fileds

是你添加到索引文件中出現的屬性名稱,而聲明類型就需要用到上面的types

<field>

<field>

<field>

<field>

<field>

<field>

<dynamicfield>

<dynamicfield>

<dynamicfield>

  • field: 固定的字段設置
  • dynamicField: 動態的字段設置,用於後期自定義字段,*號通配符.例如: test_i就是int類型的動態字段.

還有一個特殊的字段copyField,一般用於檢索時用的字段這樣就只對這一個字段進行索引分詞就行了copyField的dest字段如果有多個source一定要設置multiValued=true,否則會報錯的

<copyfield>

<copyfield>

<copyfield>

字段屬性說明:

屬性

描述

name

字段類型名

class

java類名

indexed

缺省true。 說明這個數據應被搜索和排序,如果數據沒有indexed,則stored應是true。

stored

缺省true。說明這個字段被包含在搜索結果中是合適的。如果數據沒有stored,則indexed應是true。

omitNorms

字段的長度不影響得分和在索引時不做boost時,設置它為true。

一般文本字段不設置為true。

termVectors

如果字段被用來做more like this 和highlight的特性時應設置為true。

compressed

字段是壓縮的。這可能導致索引和搜索變慢,但會減少存儲空間,只有StrField和TextField是可以壓縮,這通常適合字段的長度超過200個字符。

multiValued

字段多於一個值的時候,可設置為true。

positionIncrementGap

和multiValued一起使用,設置多個值之間的虛擬空白的數量

注意:_version_ 是一個特殊字段,不能刪除,是記錄當前索引版本號的.

5.1.3. 其他配置

uniqueKey: 唯一鍵,這裡配置的是上面出現的fileds,一般是id、url等不重複的。在更新、刪除的時候可以用到。

defaultSearchField:默認搜索屬性,如q=solr就是默認的搜索那個字段

solrQueryParser:查詢轉換模式,是並且還是或者(AND/OR必須大寫)

5.2. solr配置solrconfig.xml

solrconfig.xml這個配置文件可以在你下載solr包的安裝解壓目錄的E:\Work\solr-4.2.0-src-idea\solr\example\solr\collection1\conf中找到,這個配置文件內容有點多,主要內容有:使用的lib配置,包含依賴的jar和Solr的一些插件;組件信息配置;索引配置和查詢配置,下面詳細說一下索引配置和查詢配置.

5.2.1索引indexConfig

Solr 性能因素,來了解與各種更改相關的性能權衡。 表 1 概括了可控制 Solr 索引處理的各種因素:

屬性

描述

useCompoundFile

通過將很多 Lucene 內部文件整合到一個文件來減少使用中的文件的數量。這可有助於減少 Solr 使用的文件句柄數目,代價是降低了性能。除非是應用程序用完了文件句柄,否則 false 的默認值應該就已經足夠。

ramBufferSizeMB

在添加或刪除文檔時,為了減少頻繁的更些索引,Solr會選緩存在內存中,當內存中的文件大於設置的值,才會更新到索引庫。較大的值可使索引時間變快但會犧牲較多的內存。如兩個值同時設置,滿足一個就會進行刷新索引.

maxBufferedDocs

mergeFactor

決定低水平的 Lucene 段被合併的頻率。較小的值(最小為 2)使用的內存較少但導致的索引時間也更慢。較大的值可使索引時間變快但會犧牲較多的內存。

maxIndexingThreads

indexWriter生成索引時使用的最大線程數

unlockOnStartup

unlockOnStartup 告知 Solr 忽略在多線程環境中用來保護索引的鎖定機制。在某些情況下,索引可能會由於不正確的關機或其他錯誤而一直處於鎖定,這就妨礙了添加和更新。將其設置為 true 可以禁用啟動鎖定,進而允許進行添加和更新。

lockType

single: 在只讀索引或是沒有其它進程修改索引時使用.

native: 使用操作系統本地文件鎖,不能使用多個Solr在同一個JVM中共享一個索引.

simple :使用一個文本文件鎖定索引.

5.2.2 查詢配置query

屬性

描述

maxBooleanClauses

最大的BooleanQuery數量. 當值超出時,拋出 TooManyClausesException.注意這個是全局的,如果是多個SolrCore都會使用一個值,每個Core裡設置不一樣的化,會使用最後一個的.

filterCache

filterCache存儲了無序的lucene document id集合,1.存儲了filter queries(“fq”參數)得到的document id集合結果。2還可用於facet查詢3. 3)如果配置了useFilterForSortedQuery,那麼如果查詢有filter,則使用filterCache。

queryResultCache

緩存搜索結果,一個文檔ID列表

documentCache

緩存Lucene的Document對象,不會自熱

fieldValueCache

字段緩存使用文檔ID進行快速訪問。默認情況下創建fieldValueCache即使這裡沒有配置。

enableLazyFieldLoading

若應用程序預期只會檢索 Document 上少數幾個 Field,那麼可以將屬性設置為 true。延遲加載的一個常見場景大都發生在應用程序返回和顯示一系列搜索結果的時候,用戶常常會單擊其中的一個來查看存儲在此索引中的原始文檔。初始的顯示常常只需要顯示很短的一段信息。若考慮到檢索大型 Document 的代價,除非必需,否則就應該避免加載整個文檔。

queryResultWindowSize

一次查詢中存儲最多的doc的id數目.

queryResultMaxDocsCached

查詢結果doc的最大緩存數量, 例如要求每頁顯示10條,這裡設置是20條,也就是說緩存裡總會給你多出10條的數據.讓你點示下一頁時很快拿到數據.

listener

選項定義 newSearcher 和 firstSearcher 事件,您可以使用這些事件來指定實例化新搜索程序或第一個搜索程序時應該執行哪些查詢。如果應用程序期望請求某些特定的查詢,那麼在創建新搜索程序或第一個搜索程序時就應該反註釋這些部分並執行適當的查詢。

useColdSearcher

是否使用冷搜索,為false時使用自熱後的searcher

maxWarmingSearchers

最大自熱searcher數量

5.3Solr加入中文分詞器

中文分詞在solr裡面是沒有默認開啟的,需要我們自己配置一箇中文分詞器。目前可用的分詞器有smartcn,IK,Jeasy,庖丁。其實主要是兩種,一種是基於中科院ICTCLAS的隱式馬爾科夫HMM算法的中文分詞器,如smartcn,ictclas4j,優點是分詞準確度高,缺點是不能使用用戶自定義詞庫;另一種是基於最大匹配的分詞器,如IK ,Jeasy,庖丁,優點是可以自定義詞庫,增加新詞,缺點是分出來的垃圾詞較多。各有優缺點看應用場合自己衡量選擇吧。

下面給出兩種分詞器的安裝方法,任選其一即可,推薦第一種,因為smartcn就在solr發行包的contrib/analysis-extras/lucene-libs/下,就是lucene-analyzers-smartcn-4.2.0.jar,首選在solrconfig.xml中加一句引用analysis-extras的配置,這樣我們自己加入的分詞器才會引到的solr中.

5.3.1. smartcn 分詞器的安裝

首選將發行包的contrib/analysis-extras/lucene-libs/ lucene-analyzers-smartcn-4.2.0.jar複製到\solr\contrib\analysis-extras\lib下,在solr本地應用文件夾下,打開/solr/conf/scheme.xml,編輯text字段類型如下,添加以下代碼到scheme.xml中的相應位置,就是找到fieldType定義的那一段,在下面多添加這一段就好啦

<fieldtype>

<analyzer>

<tokenizer>

<filter>

<analyzer>

<tokenizer>

<filter>

如果需要檢索某個字段,還需要在scheme.xml下面的field中,添加指定的字段,用text_ smartcn作為type的名字,來完成中文分詞。如 text要實現中文檢索的話,就要做如下的配置:

<field>

5.3.2. IK 分詞器的安裝

首選要去下載IKAnalyzer的發行包.下載地址: http://ik-analyzer.googlecode.com/files/IK%20Analyzer%202012FF_hf1.zip.

下載後解壓出來文件中的三個複製到\solr\contrib\analysis-extras\lib目錄中.

IKAnalyzer2012FF_u1.jar 分詞器jar包

IKAnalyzer.cfg.xml 分詞器配置文件

Stopword.dic 分詞器停詞字典,可自定義添加內容

複製後就可以像smartcn一樣的進行配置scheme.xml了.

<fieldtype>

<analyzer>

<field>

現在來驗證下是否添加成功,首先使用StartSolrJetty來啟動solr服務,啟動過程中如果配置出錯,一般有兩個原因:一是配置的分詞器jar找不到,也就是你沒有複製jar包到\solr\contrib\analysis-extras\lib目前下;二是分詞器版本不對導致的分詞器接口API不一樣出的錯,要是這個錯的話就在檢查分詞器的相關文檔,看一下支持的版本是否一樣.

如果在啟動過程中沒有報錯的話說明配置成功了.我們可以進入到http://localhost:8983/solr地址進行測試一下剛加入的中文分詞器.在首頁的Core Selector中選擇你配置的Croe後點擊下面的Analysis,在Analyse Fieldname / FieldType裡選擇你剛才設置的字段名稱或是分詞器類型,在Field Value(index)中輸入:中國人,點擊右面的分詞就行了.

6.Solr功能應用

我這裡主要使用SolrJ進行介紹一下Solr的一些基本應用,使用SolrJ加上EmbeddedSolrServer(嵌入式服務器),方便進行代碼跟蹤調試.在功能上和其它服務器都是一樣的,它們都是繼承的SolrServer來提供服務API的. EmbeddedSolrServer優點是不用起http協議,直接加載SolrCore進行操作,性能上應該是最快的,方便用於把Solr單結點服務嵌入到項目中使用.下面開始介紹Solr的功能的應用.EmbeddedSolrServer初始化:

System.setProperty("solr.solr.home", "E:\\Work\\solr-4.2.0-src\\solr\\example\\solr");

CoreContainer.Initializer initializer = new CoreContainer.Initializer();

CoreContainer coreContainer = initializer.initialize();

SolrServer server = new EmbeddedSolrServer(coreContainer, "");

6.1維護索引

在一般系統中維護的都是增刪改,在Solr中的維護功能是增刪和優化功能,在Solr中的修改操作就是先刪掉再添加.在做索引維護之前,首先要做的是配置schema.xml主要是按上面章節中的說明設置好字段信息(名稱,類型,索引,存儲,分詞等信息),大概就像在數據庫中新建一個表一樣.設置好schema.xml就可以進行索引相關操作了.

6.1.1增加索引

在增加索引之前先可構建好SolrInputDocument對象.主要操作就是給文檔添加字段和值.代碼如下:

SolrInputDocument doc = new SolrInputDocument();

doc.setField("id", "ABC");

doc.setField("content", "中華人民共和國");

構建好文檔後添加的上面初始化好的server裡就行了.

server.add(doc);

server.commit();//這句一般不用加因為我們可以通過在配置文件中的

//autoCommit來提高性能

Solr在add文檔時.如果文檔不存在就直接添加,如果文檔存在就刪除後添加,這也就是修改功能了.判斷文檔是否存在的依據是定義好的uniqueKey字段.

6.1.2刪除索引

刪除索引可以通過兩種方式操作,一種是通過文檔ID進行刪除,別一種是通過查詢到的結果進行刪除.

通過ID刪除方式代碼:

server.deleteById(id);

//或是使用批量刪除

server.deleteById(ids);

通過查詢刪除方式代碼:

server.deleteByQuery("*.*");//這樣就刪除了所有文檔索引

//”*.*”就查詢所有內容的,介紹查詢時會詳細說明.

6.1.2優化索引

優化Lucene 的索引文件以改進搜索性能。索引完成後執行一下優化通常比較好。如果更新比較頻繁,則應該在使用率較低的時候安排優化。一個索引無需優化也可以正常地運行。優化是一個耗時較多的過程。

server.optimize();//不要頻繁的調用..儘量在無人使用時調用.

6.2查詢索引

Solr在不修改任務配置的情況下就可以使用查詢功能,在web項目中應用可以直接URL進行訪問Solr服務器例如 :

http://localhost:8983/solr/ collection1/select?q=*%3A*&wt=xml&indent=true

上面的意思就是查詢名為collection1的SolrCore的所有內容用xml格式返回並且有縮進。

solr教程,值得剛接觸搜索開發人員一看


分享到:


相關文章: