簡介
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所以,我使用第二種方法配置,之后比較容易移植。
-
<?xml version="1.0" encoding="UTF-8"?>
-
<Context docBase="D:\Installed Applications\apache-tomcat-8.0.9-windows-x64\apache-tomcat-8.0.9\webapps\solr.war" debug="0" crossContext="true" >
-
<Environment name="solr/home" type="java.lang.String" value="D:\Installed Applications\SolrIndex" override="false" />
-
<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"/>
-
</Context>
Solrconfig.xml配置
在每個核心中的solrconfig.xml中配置dataimport:
-
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
-
<lst name="defaults">
-
<str name="config">dbconf/Song.xml</str>
-
</lst>
-
</requestHandler>
配置文件的路徑最好使用相對路徑。
Db.xml配置
在solrconfig.xml中配置好了db.xml所在的路徑后,接下來就來配置db.xml。名字可以隨便起,不過建議和core name一致。
先來看個最簡單的配置:
-
<dataConfig>
-
<dataSource name="song" jndiName="java:comp/env/jdbc/song" type="JdbcDataSource"/>
-
<document>
-
<entity name="Artist" dataSource="song" query="select ArtistID,Name from artist'">
-
<field column="ArtistID" name="Artist_ID" />
-
<field column="Name" name="Artist_Name" />
-
-
</entity>
-
</entity>
-
</document>
-
</dataConfig>
dataSource
所使用的數據源,其中name為可選的,主要在使用多數據源時使用。
Document
代表一個文檔
Entity
即需要從數據庫中取出的數據,支持sql語句,支持多表查詢。跨庫查詢后面會介紹
Field
即接受到的數據,列名column和索引中的名稱(必須和schema.xml)中field定義的名字一樣。
Schema.xml配置
-
<field name="Artist_ID" type="int" indexed="true" stored="true" multiValued="false" />
-
<field name="Artist_Name" type="text_ik" indexed="true" stored="true" multiValued="false"/>
配置相應的field。
導入和測試
如上圖所示,點擊excute即可將數據庫中的數據導入索引庫。
多數據源配置
多數據源是非常有用的一個配置。比如用戶的信息存儲在user表中,但是用戶的分類存儲在category表中,這兩個表用userid聯系起來,那么用多數據源的配置會非常簡單。當時我並不知道怎樣配置多數據源,結果導致我的SQL非常長,並且如果需要同時用到mysql和oracle時,只能用兩個核心來實現(使用多數據源后,可以再一個核心索引庫里配置)。
數據源jndi的配置就不說了。
主要是DB.xml的配置:
-
<dataConfig>
-
<dataSource name="song" jndiName="java:comp/env/jdbc/song" type="JdbcDataSource"/>
-
<dataSource name="songCategory" jndiName="java:comp/env/jdbc/songCategoty" type="JdbcDataSource"/>
-
-
<document>
-
<entity name="Song" query="SELECT songID,name FROM song" >
-
<field column="songID" name="songID" />
-
<field column="name" name="Name" />
-
-
-
<entity name="SongCategory" dataSource="SongCategory" query="select categoryName from songcategory where songID=${Song.songID}">
-
<field column="categoryName " name="categoryName " />
-
</entity>
-
</entity>
-
</document>
-
</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節點前面增加:
-
<listener>
-
<listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener
-
</listener-class>
-
</listener>
步驟四:
在中配置相關的信息,都比較簡單,讀者可以自行看文件中的注釋就明白了,特別說下重做索引的URL,如下:
# 重做索引的參數
-
reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true
-
#reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
兩種方式都可以。
加上其他的配置信息,如localhost,port,syncCores等等,其實原理就是根據配置信息生成一個帶有重做索引命令的url,然后定期訪問該url即可。自己在項目中實現一個定時器也可以實現:)