Solr 是壹個可供企業使用的 基於 Lucene 的開箱即用的搜索服務器 對Lucene不熟?那麽建議先看看下面兩篇文檔
實戰Lucene 第 部分 初識 Lucene lo lucene /
用Lucene加速Web搜索應用程序的開發 lucene /
壹 solr介紹
solr是基於Lucene Java搜索庫的企業級全文搜索引擎 目前是apache的壹個項目 它的官方網址在 solr需要運行在壹個servlet 容器裏 例如tomcat solr在lucene的上層提供了壹個基於HTTP/XML的Web Services 我們的應用需要通過這個服務與solr進行交互
二 solr安裝和配置
關於solr的安裝和配置 這裏也有兩篇非常好的文檔 作者同時也是 Lucene Java 項目的提交人和發言人
使用Apache Solr實現更加靈巧的搜索 solr /l
solr /l
下面主要說說需要註意的地方
Solr的安裝非常簡單 下載solr的zip包後解壓縮將dist目錄下的war文件改名為solr war直接復制到tomcat 的webapps目錄即可 註意壹定要設置solr的主位置 有三種方法 我采用的是在tomcat裏配置java p/env/solr/home的壹個JNDI指向solr的主目錄(example目錄下) 建立/tomcat /conf/Catalina/localhost/solr xml文件
<Context docBase= D:/solr war debug= crossContext= true ><Environment name= solr/home type= java lang String value= D:/solr/solr override= true /></Context>
觀察這個指定的solr主位置 裏面存在兩個文件夾 conf和data 其中conf裏存放了對solr而言最為重要的兩個配置文件schema xml和solrconfig xml data則用於存放索引文件
schema xml主要包括types fields和其他的壹些缺省設置
solrconfig xml用來配置Solr的壹些系統屬性 例如與索引和查詢處理有關的壹些常見的配置選項 以及緩存 擴展等等
上面的文檔對這兩個文件有比較詳細的說明 非常容易上手 註意到schema xml裏有壹個
<uniqueKey>url</uniqueKey>
的配置 這裏將url字段作為索引文檔的唯壹標識符 非常重要
三 加入中文分詞
對全文檢索而言 中文分詞非常的重要 這裏采用了qieqie庖丁分詞(非常不錯 )) 集成非常的容易 我下載的是 alpha 版本 其中它支持最多切分和按最大切分 創建自己的壹個中文TokenizerFactory繼承自solr的BaseTokenizerFactory
/** * Created by IntelliJ IDEA * User: ronghao * Date: * Time: : : * 中文切詞 對庖丁切詞的封裝 */ public class ChineseTokenizerFactory extends BaseTokenizerFactory { /** * 最多切分 默認模式 */ public static final String MOST_WORDS_MODE = most words ; /** * 按最大切分 */ public static final String MAX_WORD_LENGTH_MODE = max word length ; private String mode = null; public void setMode(String mode) { if (mode==null||MOST_WORDS_MODE equalsIgnoreCase(mode) || default equalsIgnoreCase(mode)) { this mode=MOST_WORDS_MODE; } else if (MAX_WORD_LENGTH_MODE equalsIgnoreCase(mode)) { this mode=MAX_WORD_LENGTH_MODE; } else { throw new IllegalArgumentException( 不合法的分析器Mode 參數設置: + mode); } } @Override public void init(Map args) { super init(args); setMode(args get( mode )); } public TokenStream create(Reader input) { return new PaodingTokenizer(input PaodingMaker make() createTokenCollector()); } private TokenCollector createTokenCollector() { if( MOST_WORDS_MODE equals(mode)) return new MostWordsTokenCollector(); if( MAX_WORD_LENGTH_MODE equals(mode)) return new MaxWordLengthTokenCollector(); throw new Error( never happened ); } }
在schema xml的字段text配置裏加入該分詞器
<fieldtype name= text class= solr TextField positionIncrementGap= >
< *** yzer type= index >
<tokenizer class= ronghao fulltextsearch *** yzer ChineseTokenizerFactory mode= most words /><filter class= solr StopFilterFactory ignoreCase= true words= stopwords txt />
<filter class= solr WordDelimiterFilterFactory generateWordParts= generateNumberParts= catenateWords= catenateNumbers= catenateAll= />
<filter class= solr LowerCaseFilterFactory />
<filter class= solr RemoveDuplicatesTokenFilterFactory />
</ *** yzer>
< *** yzer type= query >
<tokenizer class= ronghao fulltextsearch *** yzer ChineseTokenizerFactory mode= most words />
<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= generateNumberParts= catenateWords= catenateNumbers= catenateAll= />
<filter class= solr LowerCaseFilterFactory />
<filter class= solr RemoveDuplicatesTokenFilterFactory />
</ *** yzer>
</fieldtype>
完成後重啟tomcat 即可在
體驗到庖丁的中文分詞 註意要將paoding *** ysis jar復制到solr的lib下 註意修改jar包裏字典的home
四 與自己應用進行集成
Solr安裝完畢 現在可以將自己的應用與solr集成 其實過程非常的簡單 應用增加數據——>根據配置的字段構建add的xml文檔——>post至solr/update
應用刪除數據à根據配置的索引文檔唯壹標識符構建delete的xml文檔——>post至solr/update
檢索數據à構建查詢xml—>get至/solr/select/——>對solr返回的xml進行處理——>頁面展現
具體的xml格式可以在solr網站找到 另外就是solr支持高亮顯示 非常方便
關於中文 solr內核支持UTF 編碼 所以在tomcat裏的server xml需要進行配置
<Connector port= maxHttpHeaderSize= URIEncoding= UTF …/>
另外 向solr Post請求的時候需要轉為utf 編碼 對solr 返回的查詢結果也需要進行壹次utf 的轉碼 檢索數據時對查詢的關鍵字也需要轉碼 然後用 + 連接
String[] array = StringUtils split(query null ); for (String str : array) { result = result + URLEncoder encode(str UTF ) + + ; }
lishixinzhi/Article/program/Java/hx/201311/25984