天天看點

BroadLeaf項目搜尋功能改進關于Solr改進搜尋引擎

Broadleaf Commerce 是一個開源的Java電子商務平台,基于Spring架構開發,提供一個可靠、可擴充的架構,可進行深度的定制和快速開發。

Broadleaf項目中關于商品的搜尋使用了嵌入式的Solr伺服器,這個從配置檔案中可以看出來。

從源代碼SolrSearchServiceImpl.java中可以看出,一共啟動了兩個Solr服務,分别對應primary和reindex兩個solrcore,primary用于查詢,reindex用于重建索引。

本篇文章隻是将嵌入式Solr服務換成獨立運作的Solr服務,你還可以更進一步換成SolrCloud叢集。

單獨搭建搜素引擎伺服器

支援增量更新索引

支援手動重建索引

1.修改原系統中的嵌入式搜尋引擎為獨立部署的搜尋引擎,安裝方法見下文。

2.擴充原系統中的SolrSearchServiceImpl類,添加增加索引的方法。

3.修改原來系統中商品的service類(我這裡調用的是LLCatalogServiceImpl,該類是新添加的),在saveProduct方法中添加往搜尋引擎添加索引的方法。

4.修改原系統中solr相關的配置檔案。

5.修改原系統中的重建索引的定時任務,以支援手動重建索引。

關鍵在于solr/home的定義,以及在該目錄下建立兩個目錄,分别為primary和reindex,兩個目錄下的配置檔案都一樣,solr/home目錄結構如下:

solr.xml檔案内容如下:

solrconfig.xml内容如下:

在core子產品建立org.broadleafcommerce.core.search.service.solr.ExtSolrSearchService接口,該接口定義如下:

然後,建立其實作類org.broadleafcommerce.core.search.service.solr.ExtSolrSearchServiceImpl,該實作類定義如下:

a. 删除web子產品中/web/src/main/webapp/WEB-INF/applicationContext.xml的以下代碼:

b.删除web子產品中web/src/main/resources/runtime-properties/common.properties的以下代碼:

c. 在core子產品中core/src/main/resources/applicationContext.xml添加如下代碼:

d. 在core子產品中core/src/main/resources/runtime-properties/common-shared.properties添加如下代碼:

添加如下代碼:

修改該類的saveProduct方法如下:

a. web系統啟動時候,會查詢資料庫中商品,然後重建索引。該功能在applicationContext.xml中已經定義了定時任務,建議取消該定時任務。去掉以下代碼:

b. 編寫main方法,打成jar包,然後編寫shell腳本,用于手動重建索引或者設定定時任務。該類需要擷取一個名稱為blSearchService的bean,然後調用該bean的rebuildIndex方法,主要代碼如下。

a、建立索引異常 如果單節點Solr安裝過程中有多個core,則建立索引的過程使用的是reindex的core,如果沒有reindex這個core可能在啟動項目時抛出如下異常:

解決辦法:

修改Solrhome中的配置檔案solr.xml,確定配置solr中的core包含reindex,并且在solrhome目錄下有reindex的目錄以及配置檔案,如下所示:

b、solr查詢異常

如果單節點solr中多個core,預設的core為primary,查詢使用的是primary,而建立索引使用的是reindex,此時通路web查詢到的還是原來primary的資料,而不是建立的索引資料。

解決辦法:将建立索引的core作為預設使用的,修改solrhome/solr.xml如下:

c、啟動項目建立索引,solr中查詢不到

完成單節點內建,啟動項目進行測試,啟動完成,索引建立完成後,在solr的單節點中進行query,發現docs中沒有添加索引。

經過debug調試添加索引的過程,發現如下代碼導緻添加索引的docs被删除。原因是solr中配置的core是多個,則執行deleteAllDocuments方法,是以添加的索引都被删除,在solr中多個core的情況下,要屏蔽如下代碼。