Solr 是一個開源的企業級搜索服務器,底層使用易於擴展和修改的Java 來實現。服務器通訊使用標準的HTTP 和XML,因此若是使用Solr 瞭解Java 技術會有用卻不是必須的要求。 html
Solr 主要特性有:強大的全文檢索功能,高亮顯示檢索結果,動態集羣,數據庫接口和電子文檔(Word ,PDF 等)的處理。並且Solr 具備高度的可擴展,支持分佈搜索和索引的複製。 java
Lucene 是一個基於 Java 的全文信息檢索工具包,它不是一個完整的搜索應用程序,而是爲你的應用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一個開源項目。也是目前最爲流行的基於 Java 開源全文檢索工具包。 web
目前已經有不少應用程序的搜索功能是基於 Lucene ,好比 Eclipse 幫助系統的搜索功能。Lucene 可以爲文本類型的數據創建索引,因此你只要把你要索引的數據格式轉化的文本格式,Lucene 就能對你的文檔進行索引和搜索。 算法
Solr 與Lucene 並非競爭對立關係,偏偏相反Solr 依存於Lucene ,由於Solr 底層的核心技術是使用Apache Lucene 來實現的,簡單的說Solr 是Lucene 的服務器化。須要注意的是Solr 並非簡單的對Lucene 進行封裝,它所提供的大部分功能都區別於Lucene 。 shell
Solr 必須運行在Java1.5 或更高版本的Java 虛擬機中,運行標準Solr 服務只須要安裝JRE 便可,但若是須要擴展功能或編譯源碼則須要下載JDK 來完成。能夠經過下面的地址下載所需JDK 或JRE : 數據庫
Solr 能夠運行在任何Java 中間件中,下面將以開源Apache Tomcat 爲例講解Solr 的安裝、配置與基本使用。本文使用Tomcat5.5 解壓版進行演示,可在下面地址下載最新版本http://tomcat.apache.org/download-55.cgi apache
本文發佈時Solr1.4 爲最新的版本,下文介紹內容均針對該版本,如與Solr 最新版本有出入請以官方網站內容爲準。Solr官方網站下載地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/ api
Solr 程序包 的目錄結構Solr 的源碼沒有放在同一個目錄下,src/java 存放大多數文件,src/common 是服務器端與客戶端公用的代碼,src/test 放置solr 的測試程序,serlvet 的代碼放在src/webapp/src 中。 tomcat
Solr 主目錄結構一個運行的Solr 服務其主目錄包含了Solr 的配置文件和數據(Lucene 的索引文件) 安全
Solr 的主目錄展開後爲以下結構:
經過Java system property ,屬性的名稱是:solr.solr.home 。
經過JNDI 將主目錄的路徑綁定到java:comp/env/solr/home 。
經過修改web.xml 位置在:src/web-app/web/WEB-INF ,
<env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>solr/</env-entry-value> <env-entry-type>java.lang.String</env-entry-type></env-entry>
若是Solr 主目錄沒有指定則默認設置爲solr/
將apache-solr-1.4.0/dist/apache-solr-1.4.0.war 從安裝包中解壓到<tomcat home>/webapps 下。WAR 是一個完整的web 應用程序,包括了Solr 的Jar 文件和全部運行Solr 所依賴的Jar 文件,Jsp 和不少的配置文件與資源文件,這裏須要注意的是:WAR 文件中不包括Solr 主目錄,所以在啓動tomcat 以前咱們要先指定Solr 的主目錄。
將安裝程序中的apache-solr-1.4.0/example/solr 文件夾解壓到<tomcat homt>/ 下,而後在<tomcat home>/bin/catalina.bat 第一行添加以下內容:
set JAVA_OPTS=%JAVA_OPTS% -Dsolr.solr.home=<tomcat home>/solr注:Windows 之外操做系統需修改 catalina.sh 文件。
啓動tomcat ,apache-solr-1.4.0.war 自動發佈爲web 應用。
點擊連接訪問Solr 控制檯界面,http://localhost:8080/apache-solr-1.4.0/ ,顯示以下界面表示啓動成功。
SolrJ 是Solr 服務器的一個Java 接口,使用該接口不再同爲慮客戶端與服務器端交互時格式解析和轉換的問題煩惱了,取而代之的是用你熟悉的對象來進行相關的操做,並且隨着Solr 的不斷升級SolrJ 也會一樣提供這些新加入的功能。
SolrJ 中有2 種SolrServer 對象,CommonsHttpSolrServer 與EmbeddedSolrServer ,他們都是線程安全的並建議使用單例模式來使用他們,由於動態建立會形成鏈接泄露。
Create CommonsHttpSolrServer
String url = "http://localhost:8983/solr";SolrServer server = new CommonsHttpSolrServer( url );
Create EmbeddedSolrServer
// solr.solr.home 屬性也能夠經過 JVM 參數設置System.setProperty("solr.solr.home", "/home/shalinsmangar/work/oss/branch-1.3/example/solr");CoreContainer.Initializer initializer = new CoreContainer.Initializer();CoreContainer coreContainer = initializer.initialize();EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, "");添加
public SolrServer getSolrServer(){ // 對象實例能夠重複使用 return new CommonsHttpSolrServer();}SolrServer server = getSolrServer();// 清空以前創建的索引數據server.deleteByQuery( "*:*" );// 建立一個文檔SolrInputDocument doc1 = new SolrInputDocument();doc1.addField( "id", "id1", 1.0f );doc1.addField( "name", "doc1", 1.0f );doc1.addField( "price", 10 );// 建立另一個文檔SolrInputDocument doc2 = new SolrInputDocument();doc2.addField( "id", "id2", 1.0f );doc2.addField( "name", "doc2", 1.0f );doc2.addField( "price", 20 );// 建立文檔集合Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();docs.add( doc1 );docs.add( doc2 );// 將文檔添加到 Solr 中server.add( docs );// 提交server.commit();查詢
// 獲得一個 SolrServer 實例(經過上面介紹的方法建立)SolrServer server = getSolrServer();// 構造一個查詢對象SolrQuery query = new SolrQuery();query.setQuery( "*:*" );query.addSortField( "price", SolrQuery.ORDER.asc );// 查詢結果SolrDocumentList docs = rsp.getResults();
分詞產品 目前Lucene 的中文分詞主要有:
分詞效率
下面是各個分詞產品官方提供的數據:
自定義詞庫
以上產品中只有 ik 提供了 Solr ( 1.3 , 1.4 )的分詞接口程序,只需修改配置文件便可實現中文分詞,配置方法以下;
使用 IKAnalyzer 的配置
<schema name="example" version="1.1">……<fieldType name="text" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType>……</schema>
使用 IKTokenizerFactory 的配置
<fieldType name="text" class="solr.TextField" ><analyzer type="index"><tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false"/>……</analyzer><analyzer type="query"><tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="true"/>……</analyzer></fieldType>