四、Solr數據源配置(JNDI、DIH)及定時重做索引


簡介

Solr支持很多種創建索引的方式,包括網頁,xml以及數據庫,因為我這邊做的是企業級的搜索,所以用的是數據庫建立索引。其實從數據庫建立索引,很大程度上取決於原來的數據庫設計。

從數據庫建立索引,solr官方是提供一個工具的—Data Import Handler。在下載的solr中可以找到相關的jar包:

solr-dataimporthandler-4.9.0.jar

solr-dataimporthandler-extras-4.9.0.jar

將這兩個jar包添加進web-inf/lib中

Solr/example中有example-DIH的項目,用了hsqldb作為數據庫演示了DIH的使用。讀者有興趣可以去看下,這里就介紹我的配置方法。

DIH還支持增量索引,即在上次建立索引的基礎上,只導入增量的數據。這個需要數據表設計的比較好,能夠有字段區分,比如創建日期。這里我並沒有使用增量索引。

 

Jndi配置

    Jndi有兩種配置方法,第一種是在tomcat中配置,跟普通的jndi配置並沒有什么區別。

    另外一種則是在前面博客中說過的$TOMCAT_HOME\conf\Catalina\localhost\solr.xml中配置,因為我是在開發環境中配置,到生產環境時用的是resin所以,我使用第二種方法配置,之后比較容易移植。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Context docBase="D:\Installed Applications\apache-tomcat-8.0.9-windows-x64\apache-tomcat-8.0.9\webapps\solr.war" debug="0" crossContext="true" >
  3.     <Environment name="solr/home" type="java.lang.String" value="D:\Installed Applications\SolrIndex" override="false" />
  4.    <Resource name="jdbc/song" auth="Container" type="javax.sql.DataSource" username="root" password="123456" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/song" maxActive="-1"/>
  5. </Context>

Solrconfig.xml配置

在每個核心中的solrconfig.xml中配置dataimport:

  1. <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
  2.     <lst name="defaults">
  3.        <str name="config">dbconf/Song.xml</str>
  4.     </lst>
  5.   </requestHandler>

 

配置文件的路徑最好使用相對路徑。

Db.xml配置

在solrconfig.xml中配置好了db.xml所在的路徑后,接下來就來配置db.xml。名字可以隨便起,不過建議和core name一致。

先來看個最簡單的配置:

  1. <dataConfig>
  2.        <dataSource name="song" jndiName="java:comp/env/jdbc/song" type="JdbcDataSource"/>
  3.     <document>
  4.          <entity name="Artist" dataSource="song" query="select ArtistID,Name from artist'">
  5.             <field column="ArtistID" name="Artist_ID" />
  6.             <field column="Name" name="Artist_Name" />
  7.  
  8.          </entity>
  9.       </entity>
  10.     </document>
  11. </dataConfig>

 

dataSource

所使用的數據源,其中name為可選的,主要在使用多數據源時使用。

Document

代表一個文檔

Entity

即需要從數據庫中取出的數據,支持sql語句,支持多表查詢。跨庫查詢后面會介紹

Field

即接受到的數據,列名column和索引中的名稱(必須和schema.xml)中field定義的名字一樣。

 

Schema.xml配置

  1. <field name="Artist_ID" type="int" indexed="true" stored="true" multiValued="false" />
  2.    <field name="Artist_Name" type="text_ik" indexed="true" stored="true" multiValued="false"/>

配置相應的field。

導入和測試

如上圖所示,點擊excute即可將數據庫中的數據導入索引庫。

 

多數據源配置

多數據源是非常有用的一個配置。比如用戶的信息存儲在user表中,但是用戶的分類存儲在category表中,這兩個表用userid聯系起來,那么用多數據源的配置會非常簡單。當時我並不知道怎樣配置多數據源,結果導致我的SQL非常長,並且如果需要同時用到mysql和oracle時,只能用兩個核心來實現(使用多數據源后,可以再一個核心索引庫里配置)

數據源jndi的配置就不說了。

主要是DB.xml的配置:

  1. <dataConfig>
  2.    <dataSource name="song" jndiName="java:comp/env/jdbc/song" type="JdbcDataSource"/>
  3.    <dataSource name="songCategory" jndiName="java:comp/env/jdbc/songCategoty" type="JdbcDataSource"/>
  4.  
  5.     <document>
  6.        <entity name="Song" query="SELECT songID,name FROM song" >
  7.       <field column="songID" name="songID" />
  8.       <field column="name" name="Name" />
  9.       
  10.  
  11.          <entity name="SongCategory" dataSource="SongCategory" query="select categoryName from songcategory where songID=${Song.songID}">
  12.             <field column="categoryName " name="categoryName " />
  13.          </entity>
  14.    </entity>
  15.     </document>
  16. </dataConfig>

 

如上面的配置,其實配置是比較簡單的,主要是SQL和數據的組織。可以看到DIH的功能是非常強大的。

定時重做索引

在用solr生成索引時,還有一個需求就是定期重做索引,官方是不支持此功能的,需要使用一個修改過的第三方jar:solr-dataimportscheduler-1.1.jar。

下載地址https://code.google.com/p/solr-dataimport-scheduler/

    但是這個版本會有一個問題,它是使用post請求訪問到solr服務器端,並沒有制定content-type,導致出錯,需要修改源碼。

所以附件提供修改后的jar包下載(下載配置后即可使用):

 

配置:

步驟一:

在solr hom根目錄中新建conf文件夾

步驟二:

    將solr-dataimportscheduler-1.1.jar包解壓縮取出dataimport.properties復制到上一步建立的conf文件夾中。

步驟三:

修改tomcat發布的webapps/solr/WEB-INF/web.xml(或者修改solr.war中WEB-INF/web.xml), 在servlet節點前面增加:

  1. <listener>
  2. <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener
  3. </listener-class>
  4. </listener>

步驟四:

在中配置相關的信息,都比較簡單,讀者可以自行看文件中的注釋就明白了,特別說下重做索引的URL,如下:

# 重做索引的參數

  1. reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true
  2. #reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true

 

兩種方式都可以。

加上其他的配置信息,如localhost,port,syncCores等等,其實原理就是根據配置信息生成一個帶有重做索引命令的url,然后定期訪問該url即可。自己在項目中實現一個定時器也可以實現:)

 

 

附件

點擊下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM