一般要搜尋的資訊都是被儲存在資料庫裡面的,但是我們不能直接搜資料庫,所以只有藉助Solr將要搜尋的資訊在搜尋伺服器上進行索引,然後在客戶端供客戶使用。
一、連結資料庫
1. SQL配置
拿SQL Server 為例,需要先下載Sql Server的jar包,下載地址:
http://msdn.microsoft.com/en-us/data/aa937724.aspx
解壓縮之後將sqljdbc4.jar複製到webapps\solr\WEB-INF\lib下,也就是本例的:
D:\apache-tomcat-7.0.57\webapps\solr\WEB-INF\lib
2. 建立查詢
然後在D:\apache-tomcat-7.0.57\webapps\solr\solr_home\collection1\conf下面新建一個配置檔案:data-config.xml
然後在本目錄下編輯配置檔案:solrconfig.xml
找到很多個requestHandler節點,在最下面增加:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">D:\apache-tomcat-7.0.57\webapps\solr\solr_home\collection1\conf\data-config.xml</str> </lst> </requestHandler>
要配置的內容就是剛才新建檔案的路徑。
3. 將初次下載的solr-4.10.2資料夾下的dist, contrib資料夾複製到TomCat根目錄下:
4. 然後再次修改剛才編輯過的solrconfig.xml增加兩個資料夾的配置並修改一些引數:
大約在75行預設有8個路徑,但是路徑不一定全對,順著這個配置的路徑去找資料夾,根據查詢的層數修改這個路徑配置,另增加一個新的配置,全文如下:
<lib dir="D:\apache-tomcat\contrib\extraction\lib" regex=".*\.jar" /> <lib dir="D:\apache-tomcat\dist\" regex="solr-cell-\d.*\.jar" /> <lib dir="D:\apache-tomcat\contrib\clustering\lib\" regex=".*\.jar" /> <lib dir="D:\apache-tomcat\dist\" regex="solr-clustering-\d.*\.jar" /> <lib dir="D:\apache-tomcat\contrib\langid\lib\" regex=".*\.jar" /> <lib dir="D:\apache-tomcat\dist\" regex="solr-langid-\d.*\.jar" /> <lib dir="D:\apache-tomcat\contrib\velocity\lib" regex=".*\.jar" /> <lib dir="D:\apache-tomcat\dist\" regex="solr-velocity-\d.*\.jar" /> <lib dir="D:\apache-tomcat\dist\" regex="solr-dataimporthandler-\d.*\.jar" />
這個配置是根據本機推匯出來的,大家根據自己的實際情況去修改。
5. 將dist資料夾下的
複製到webapps\solr\WEB-INF\lib下。
6. 然後編輯
D:\apache-tomcat-7.0.57\webapps\solr\solr_home\collection1\conf\data-confing.xml檔案,以本機MyBookShop資料庫的Books表為例
配置如下:
<?xml version="1.0" encoding="UTF8"?> <dataConfig> <dataSource driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" url="jdbc:sqlserver://localhost:1433;DatabaseName=MyBookShop" user="sa" password="111"/> <document name="Info" pk="id"> <entity name="zpxx" transformer="ClobTransformer" pk="id" query="SELECT [ID],[Title] as name FROM [MyBookShop].[dbo].[Books]" deltaImportQuery="SELECT [Id],[Title] as name FROM [MyBookShop].[dbo].[Books] where [PublishDate] > '${dataimporter.last_index_time}'" deltaQuery="SELECT id FROM [MyBookShop].[dbo].[Books] where [PublishDate] > '${dataimporter.last_index_time}'"> <field column="id" name="id" /> <field column="name" name="name" /> </entity> </document> </dataConfig>
此配置千萬注意。
上述配置說明如下:
query是獲取全部資料的SQL(solr從sql中獲取那些資料),多列
deltaImportQuery是獲取增量資料時使用的SQL(資料庫新增資料追加到solr的資料),多列
deltaQuery是獲取pk的SQL(資料庫新增資料是,追加到solr的資料時的條件,根據id ,條件是最後一次獲取的時間,${dataimporter.last_index_time,最後獲取的時間}),一列
如需配置多列,步驟如:
1.先配置資料庫查詢資訊data config:
<entity name="zpxx" transformer="ClobTransformer" pk="id" query="SELECT [ProductID] as ID,[ShopProductTitle] as title1,[SecondTitle] as title2,[ShopProductDescription] as descr FROM [dbo].[ShopProduct]" deltaImportQuery="SELECT [ProductID] as ID,[ShopProductTitle] as title1,[SecondTitle] as title2,[ShopProductDescription] as descr FROM [dbo].[ShopProduct] where [PublishDate] > '${dataimporter.last_index_time}'" deltaQuery="SELECT [ProductID] as ID FROM [dbo].[ShopProduct] where [PublishDate] > '${dataimporter.last_index_time}'"> <field column="id" name="id" /> <field column="title1" name="title1" /> <field column="title2" name="title2" /> <field column="descr" name="descr" /> </entity>
2. 配置schema資訊(約120多行處):
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> <field name="sku" type="text_en_splitting_tight" indexed="true" stored="true" omitNorms="true"/> <field name="title1" type="text_ik" indexed="true" stored="true"/> <field name="title2" type="text_ik" indexed="true" stored="true"/> <field name="descr" type="text_ik" indexed="true" stored="true"/> <field name="cat" type="string" indexed="true" stored="true" multiValued="true"/>
這樣查處的結果就如:
"docs": [ { "title1": "櫻桃", "title2": "櫻桃櫻桃", "id": "1004", "descr": "<img alt=\"\" src=\"9f531.jpg\"><img alt=\"\" src=\"5.jpg\">", "_version_": 1503960451691577300 },
保證SQL SERVER配置了外網訪問即可。
配置到此基本結束。
二、建立索引
啟動Solr,刪除全部索引資料:
http://localhost:8080/solr/update/?stream.body=<delete><query>*:*</query></delete>&stream.contentType=text/xml;charset=utf-8&commit=true
停掉Solr,檢查下是不是清空了:
開始建立新的索引,瀏覽器執行方式:
終止跑索引:http://localhost:8080/solr/collection1/dataimport?command=abort
開始索引:http://localhost:8080/solr/collection1/dataimport?command=full-import
增量索引 :http://localhost:8080/solr/collection1/dataimport?command=delta-import
建議學習時使用UI的方式進行更新,能看清執行過程:
需要等執行結束,可以點選【Refrush status】看結果:
Indexing completed. Added/Updated: 1076 documents. Deleted 0 documents. (Duration: 03s)
表示結束。
然後點選左邊的查詢檢驗索引結果:
出現查詢結果表示建立成功。
三、更新索引、增加索引、刪除索引
1. 更新資料:
我們先來搜尋一個關鍵字“土豆”,這裡全是計算機圖書,不應該有土豆的。
然後將其中一個書籍的標題更新為“論土豆的栽培技術”
不更新索引是搜不到的。
執行增量更新:
http://localhost:8080/solr/dataimport?command=delta-import&clean=false&commit=true
然後去查詢:
已經可以查詢得到了。
2. 新增一個資料:“論蘋果的藝術”
insert into [MyBookShop].[dbo].[Books] ( [Title] ,[Author] ,[PublishDate] ,[WordsCount] ,[UnitPrice] ,[ContentDescription] ,[AurhorDescription] ,[EditorComment] ,[TOC] ) SELECT '論蘋果的藝術' ,[Author] ,[PublishDate] ,[WordsCount] ,[UnitPrice] ,[ContentDescription] ,[AurhorDescription] ,[EditorComment] ,[TOC] FROM [MyBookShop].[dbo].[Books] where id=4942
新增結果如下:
然後執行增量索引:
http://localhost:8080/solr/dataimport?command=delta-import&clean=false&commit=true
再查詢:
發現新結果被查詢出來了。
3. 刪除資料
將蘋果這條資料刪除掉,仍然能夠查詢出來,執行單條索引刪除:
再次查詢就查不到了:
資料庫下載