熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

教你使用solr搭建你的全文檢索

2022-06-13   來源: Java核心技術 

  Solr 是一個可供企業使用的基於 Lucene 的開箱即用的搜索服務器對Lucene不熟?那麼建議先看看下面兩篇文檔

  實戰Lucene 部分 初識 Lucenelolucene/

  用Lucene加速Web搜索應用程序的開發lucene/

   solr介紹

  solr是基於Lucene Java搜索庫的企業級全文搜索引擎目前是apache的一個項目它的官方網址在 solr需要運行在一個servlet 容器裡例如tomcatsolr在lucene的上層提供了一個基於HTTP/XML的Web Services我們的應用需要通過這個服務與solr進行交互

   solr安裝和配置

  關於solr的安裝和配置這裡也有兩篇非常好的文檔作者同時也是 Lucene Java 項目的提交人和發言人

  使用Apache Solr實現更加靈巧的搜索solr/l

  solr/l

  下面主要說說需要注意的地方

  Solr的安裝非常簡單下載solr的zip包後解壓縮將dist目錄下的war文件改名為solrwar直接復制到tomcat的webapps目錄即可注意一定要設置solr的主位置有三種方法我采用的是在tomcat裡配置javacomp/env/solr/home的一個JNDI指向solr的主目錄(example目錄下)建立/tomcat/conf/Catalina/localhost/solrxml文件

  

  <Context docBase=D:/solrwar debug= crossContext=true >
<Environment name=solr/home type=javalangString
value=D:/solr/solr override=true />
</Context>

  觀察這個指定的solr主位置裡面存在兩個文件夾conf和data其中conf裡存放了對solr而言最為重要的兩個配置文件schemaxml和solrconfigxmldata則用於存放索引文件

  schemaxml主要包括typesfields和其他的一些缺省設置

  solrconfigxml用來配置Solr的一些系統屬性例如與索引和查詢處理有關的一些常見的配置選項以及緩存擴展等等

  上面的文檔對這兩個文件有比較詳細的說明非常容易上手注意到schemaxml裡有一個

  

  <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 = mostwords; /** * 按最大切分 */ public static final String MAX_WORD_LENGTH_MODE = maxwordlength; private String mode = null; public void setMode(String mode) { if (mode==null||MOST_WORDS_MODEequalsIgnoreCase(mode) || defaultequalsIgnoreCase(mode)) { thismode=MOST_WORDS_MODE; } else if (MAX_WORD_LENGTH_MODEequalsIgnoreCase(mode)) { thismode=MAX_WORD_LENGTH_MODE; } else { throw new IllegalArgumentException(不合法的分析器Mode
參數設置: + mode); } } @Override public void init(Map args) { superinit(args); setMode(argsget(mode)); } public TokenStream create(Reader input) { return new PaodingTokenizer(input PaodingMakermake() createTokenCollector()); } private TokenCollector createTokenCollector() { if( MOST_WORDS_MODEequals(mode)) return new MostWordsTokenCollector(); if( MAX_WORD_LENGTH_MODEequals(mode)) return new MaxWordLengthTokenCollector(); throw new Error(never happened); } }

  在schemaxml的字段text配置裡加入該分詞器

  

  <fieldtype name=text class=solrTextField positionIncrementGap=>

  <analyzer type=index>

  <tokenizer class=comronghaofulltextsearchanalyzer
ChineseTokenizerFactory mode=mostwords/>

          <filter class=solrStopFilterFactory ignoreCase=true
words=stopwordstxt/>

  <filter class=solrWordDelimiterFilterFactory generateWordParts=
generateNumberParts= catenateWords= catenateNumbers=
catenateAll=/>

  <filter class=solrLowerCaseFilterFactory/>

  <filter class=solrRemoveDuplicatesTokenFilterFactory/>

  </analyzer>

  <analyzer type=query>

  <tokenizer class=comronghaofulltextsearchanalyzer
ChineseTokenizerFactory mode=mostwords/>  

  <filter class=solrSynonymFilterFactory synonyms=synonymstxt
ignoreCase=true expand=true/>

  <filter class=solrStopFilterFactory ignoreCase=true words=
stopwordstxt/>

  <filter class=solrWordDelimiterFilterFactory generateWordParts=
generateNumberParts= catenateWords= catenateNumbers=
catenateAll=/>

  <filter class=solrLowerCaseFilterFactory/>

  <filter class=solrRemoveDuplicatesTokenFilterFactory/>

  </analyzer>

  </fieldtype>

  完成後重啟tomcat即可在

  體驗到庖丁的中文分詞注意要將paodinganalysisjar復制到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裡的serverxml需要進行配置

  

  <Connector port= maxHttpHeaderSize= URIEncoding=UTF …/>

  另外向solr Post請求的時候需要轉為utf編碼對solr 返回的查詢結果也需要進行一次utf的轉碼檢索數據時對查詢的關鍵字也需要轉碼然後用+連接

  

  String[] array = StringUtilssplit(query null ); for (String str : array) { result = result + URLEncoderencode(str UTF) + +; }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25984.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.