隨筆-46  評論-54  文章-0  trackbacks-0

           

            Apache Solr集成至Tomcat

              原有系統已經開發,框架以SSH為基礎,頁面編碼GBK,數據庫為oracle,容器為tomcat6,需要整合全文檢索,下面只是一個簡單的整合測試。

          1、嵌入Tomcat

          解壓 apache-solr-1.3.0.tgz,拷貝apache-solr-1.3.0\example\example-DIH\solr目錄到Tomcat的安裝目錄后,修改solr目錄中的solr.xml,屏蔽rss部分的配置,內容如下:

          <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
          <solr sharedLib="lib" persistent="true">
           <cores adminPath="/admin/cores">
            <core default="true" instanceDir="db" name="db"></core>
          <!--
            <core default="false" instanceDir="rss" name="rss"></core>
           -->
           </cores>
          </solr>

          • 刪除Tomcat\solr\rss目錄
          • Tomcat\solr\db\lib目錄下添加必要jarojdbc14.jarslf4j-jdk14-1.5.5.jarslf4j-api-1.5.5.jarsolr-dataimporthandler-1.4-SNAPSHOT.jar
          • 拷貝apache-solr-1.3.0\example\webapps\solr.warTomcat\webapps目錄下。
          • 創建Tomcat\conf\Catalina\localhost\solr.xml,內容如下:

          <Context docBase="${catalina.home}/webapps/solr.war" debug="0" crossContext="true" >
             <Environment name="solr/home" type="java.lang.String" value="${catalina.home}/solr" override="true" />
          </Context>

          • 修改Tomcat\conf\server.xml,添加一個端口為8983Connector,內容如下:

          <Connector port="8983" protocol="HTTP/1.1" 

                         connectionTimeout="20000" 

                         redirectPort="8443" URIEncoding="UTF-8"/>





          2、配置DataImportHandler

          change @ 20097110:19:57

              主要修改Tomcat\solr\db\conf\db-data-config.xmlTomcat\solr\db\conf\schema.xmlTomcat\solr\db\conf\solrconfig.xml,三個配置文件:

          • db-data-config.xml

          <dataConfig>

              <dataSource driver="oracle.jdbc.driver.OracleDriver"

              url="jdbc:oracle:thin:@localhost:1521:orcl"

              user="solr" password="solr" batchSize="50"/>

              <document name="contents" >

                  <entity name="content" pk="ID"

                  query="select * from CONTENT"

                  deltaQuery="select ID from CONTENT where to_char(PUBTIME,'yyyy-mm-dd hh24:mi:ss') > '${dataimporter.last_index_time}'"

                  transformer="ClobTransformer">

                      <field name="title" column="TITLE" />

                      <field column="CONTENT" clob="true"/>

                      <field name="pubtime" column="PUBTIME" />

                  </entity>

              </document>

          </dataConfig>

          • schema.xml

              types標簽最后,追加fieldtype,名稱為text_cjk,中日韓分詞分析器;

              ......



              <fieldtype name="text_cjk" class="solr.TextField"> 

                <analyzer class="org.apache.lucene.analysis.cjk.CJKAnalyzer"/> 

              </fieldtype>



           </types>



              屏蔽或清除<fields></fields>中的全部代碼,并添加如下內容:

           <fields>

             <field name="id" type="slong" indexed="true" stored="true" required="true" /> 

             <field name="title" type="text_cjk" indexed="true" stored="false"/>

             <field name="content" type="text_cjk" indexed="true" stored="true"/>

             <field name="pubtime" type="date" indexed="true" stored="true"/>

             <field name="searchtext" type="text_cjk" indexed="true" stored="false" multiValued="true"/>

           </fields>



              修改默認唯一索引為先前定義的id

           <uniqueKey>id</uniqueKey>



              修改默認搜索字段為先前定義的searchtext,并將要搜索的titlecontent都拷貝到searchtext中,方便統一檢索:

          ......



           <defaultSearchField>searchtext</defaultSearchField>

          ......



             <copyField source="title" dest="searchtext"/>

             <copyField source="content" dest="searchtext"/>

          ......

           

          add @ 20097110:19:57

          • solrconfig.xml

              修改<dataDir></dataDir>標簽中的檢索數據存放路徑。內容如下:

          <dataDir>${catalina.home}/solr/db/data</dataDir>

           

           



          3、導入和查詢:

          • 完全導入:
            http://localhost:8983/solr/db/dataimport?command=full-import
          • 增量導入:
            http://localhost:8983/solr/db/dataimport?command=delta-import
          • 查詢
            http://localhost:8983/solr
            點擊db,進入一個搜索頁面,填入如下內容:

          pubtime:[2007-11-16T00:00:00Z TO 2008-11-28T00:00:00Z]

          AND

          工作;

          pubtime desc

              點擊搜索,測試。

          4xml解析:

          一個簡單solr查詢結果的輔助搜索類,內容如下:



          import java.net.URL;

          import java.util.ArrayList;

          import java.util.Date;

          import java.util.List;



          import org.dom4j.Document;

          import org.dom4j.Node;

          import org.dom4j.io.SAXReader;

          import org.apache.commons.lang.time.DateUtils;



          public class SolrUtils {

          private List<Node> docs = new ArrayList<Node>();

          private Number numFound = 0;

          private Document doc;

          public List<Node> getDocs() {

          return docs;

          }



          public Number getNumFound() {

          return numFound;

          }

          @SuppressWarnings("unchecked")

          public SolrUtils(String urlString) {

          doc = documentFromURL(urlString);

          if (doc != null ) {

          docs = (List<Node>)doc.selectNodes("/response/result/doc");

          numFound = doc.numberValueOf("/response/result/@numFound");

          }

          }

          public Document documentFromURL(String urlString){

          try {

          SAXReader reader = new SAXReader();

          URL url = new URL(urlString);

                 doc = reader.read(url);

                 return doc;

          } catch (Exception e) {

          e.printStackTrace();

          }

          return null;

          }



          public static String valueOf(Object obj, String name){

          return valueOf(obj, "str", name);

          }

          public static Date dateValueOf(Object obj, String name){

          String[] parsePatterns = new String[]{

          "yyyy-MM-dd'T'HH:mm:ss'Z'",

          "yyyy-MM-dd'T'HH:mm:ss.S'Z'",

          "yyyy-MM-dd'T'HH:mm:ss.SS'Z'",

          "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",

          };

          try {

          return DateUtils.parseDate(valueOf(obj, "date", name), parsePatterns);

          } catch (Exception e) {

          e.printStackTrace();

          }

          return null;

          }

          public static String valueOf(Object obj, String type, String name){

          String path = "./" + type + "[@name='" + name + "']";

          if (obj instanceof Node) {

          Node n = (Node)obj;

          return n.valueOf(path);

          }

          return "";

          }

          public static Number numberValueOf(Object obj, String type, String name){

          String path = "./" + type + "[@name='" + name + "']";

          if (obj instanceof Node) {

          Node n = (Node)obj;

          return n.numberValueOf(path);

          }

          return null;

          }

          public static void main(String[] args) throws Exception {

          String url = "http://localhost:8983/solr/db/select/?q=*%3A*&version=2.2&start=0&rows=10&indent=on";

          SolrUtils su = new SolrUtils(url);

          System.out.println(su.getNumFound());

          System.out.println(su.getDocs().size());

          for (Node doc : su.getDocs()) {

          System.out.println(valueOf(doc, "id"));

          System.out.println(valueOf(doc, "title"));

          System.out.println(dateValueOf(doc, "pubtime"));

          }



          }



          }



          參考資料:

          1Apache Solr 的新特性

          http://www.ibm.com/developerworks/cn/java/j-solr-update/



          2Solr開發經驗[]

          http://www.jinsehupan.com/blog/?p=25



          3slf4j-jdk14-1.5.5.jarslf4j-api-1.5.5.jarsolr-dataimporthandler-1.4-SNAPSHOT.jar

          https://svn.apache.org/repos/asf/lucene/solr/trunk/lib/slf4j-jdk14-1.5.5.jar

          https://svn.apache.org/repos/asf/lucene/solr/trunk/lib/slf4j-api-1.5.5.jar

          http://people.apache.org/repo/m2-snapshot-repository/org/apache/solr/solr-dataimporthandler/1.4-SNAPSHOT/solr-dataimporthandler-1.4-SNAPSHOT.jar



          4、本文地址

          http://docs.google.com/View?id=ajfmzbdvh8wz_37f4jv46gb








          posted on 2009-06-28 01:19 rox 閱讀(3124) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 博爱县| 叶城县| 囊谦县| 东乌珠穆沁旗| 图片| 鄢陵县| 稻城县| 大港区| 招远市| 巴南区| 高碑店市| 安福县| 东山县| 金昌市| 什邡市| 曲松县| 上思县| 驻马店市| 肥城市| 石台县| 策勒县| 神农架林区| 会昌县| 明星| 布尔津县| 南阳市| 斗六市| 灵山县| 交口县| 若尔盖县| 嫩江县| 南丹县| 永平县| 大石桥市| 左贡县| 贡嘎县| 丹凤县| 鄯善县| 墨玉县| 乐都县| 灵台县|