結合上述文章,決定採用全文檢索引擎進行功能的實現。目前市面上成熟的全文檢索引擎有多種,本人挑選了目前最火的、用戶最多的兩款全文檢索引擎solr與elasticsearch進行對比,從中選取更適合本系統的解決方案。html
本篇主要介紹對solr初體驗的一些步驟和看法。java
Solr 是創建在 Apache Lucene 上的流行的、快速的、開源的企業搜索平臺。node
Solr 是高度可靠、可伸縮和容錯的, 提供分佈式索引、複製和負載平衡查詢、自動故障切換和恢復、集中配置等。web
Solr 賦予了世界上許多最大的互聯網網站的搜索和導航功能。apache
特徵:windows
由Lucene提供支持,Solr支持強大的匹配功能,包括短語,通配符,鏈接,分組以及更多數據類型。api
Solr在世界範圍內以極大的規模獲得證實。服務器
Solr使用您使用的工具快速構建應用程序。session
Solr附帶內置的響應式管理用戶界面,能夠輕鬆控制Solr實例。架構
Solr經過JMX發佈大量度量數據。
Solr基於通過實戰考驗的Apache Zookeeper,能夠輕鬆擴展和縮小。
Solr開箱即用於複製,分發,從新平衡和容錯。
Solr's旨在知足您的需求,同時簡化配置。
Solr利用Lucene的近實時索引功能確保您在想要查看內容時看到您的內容。
Solr發佈了許多定義明確的擴展點,能夠輕鬆插入索引和查詢時插件。固然,因爲它是Apache許可的開源,您能夠更改您想要的任何代碼。
資源:
要求:Apache Solr在Java 8或更高版本上運行。對於全部Java版本,強烈建議不要使用實驗性的-XX JVM選項。
bin/
該目錄包含幾個重要的腳本,能夠更輕鬆地使用Solr。
solr and solr.cmd
這是Solr的控制腳本,也稱爲bin / solr(* nix)/ bin / solr.cmd(Windows)。此腳本是啓動和中止Solr的首選工具。在SolrCloud模式下運行時,您還能夠建立集合或核心,配置身份驗證以及使用配置文件。
post
PostTool,它提供了一個簡單的命令行界面,用於將內容POST到Solr。
solr.in.sh and solr.in.cmd
這些是* nix和Windows系統的屬性文件。此處配置Java,Jetty和Solr的系統級屬性。使用bin / solr / bin / solr.cmd時,能夠覆蓋其中許多設置,但這容許您在一個位置設置全部屬性。
install_solr_services.sh
此腳本在* nix系統上用於將Solr安裝爲服務。在Solr to Production一節中有更詳細的描述。 contrib/
Solr的contrib目錄包含Solr專用功能的附加插件。
dist/
dist目錄包含主要的Solr .jar文件。
docs/
docs目錄包含指向Solr的在線Javadocs的連接。
example/
示例目錄包括幾種演示各類Solr功能的示例。
licenses/
licenses目錄包含Solr使用的第三方庫的全部許可證
server/
此目錄是Solr應用程序的核心所在的目錄。此目錄中的自述文件提供了詳細的概述,但如下是一些要點:
進入bin目錄,運行solr.cmd,這將在後臺啓動Solr,偵聽端口8983。訪問http://localhost:8983/solr/ 將看到solr啓動頁面。
點擊Core Admin菜單,若是沒有Core,會彈出以下框,提示添加。
solr7之前的版本對於中文分詞支持很差,一般會用IK分詞器。對於solr7,能夠直接使用提供的分詞器。
a. 複製lucene-analyzers-smartcn-7.2.0.jar(在contrib/analysis-extras/lucene-libs目錄下)到server/solr-webapp/webapp/WEB-INF/lib目錄下。
b. 在managed-schema(在server/solr/new_core/conf目錄下,這裏選的自定義core即new_core)文件中添加新分詞器。
<fieldType name="text_hmm_chinese" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
</analyzer>
</fieldType>
複製代碼
c. 修改<field name="stu_id" type="text_hmm_chinese" indexed="true" stored="true"/>
d. 在頁面上從新加載自定義的core即new_core。
e. 在頁面上選擇core,選擇分詞器,進行分詞。
在schema.xml文件中,新增<field>
,name指定中文分詞的數據的key,type指定爲上面設置的中文分詞器name。
導入JSON數據以下圖所示:
查詢數據以下圖所示:
至此,solr單機版安裝並啓動完成,並實現了對中文分詞的查詢。
因爲本系統數據量不算很大,單機solr徹底能夠勝任,可是仍是研究了下集羣的搭建,以防以後在單機向集羣升級時會有不便。
SolrCloud 旨在爲跨多個服務器分發索引內容和查詢請求提供高可用的容錯環境。 它是一種將數據組織成多個碎片或碎片的系統, 能夠承載在多臺計算機上, 複製副本爲可伸縮性和容錯提供冗餘, 以及一個管理員服務器, 幫助管理整個結構, 使索引和搜索請求能夠正確路由。
交互式啓動
腳本使您能夠輕鬆地開始使用 SolrCloud, 由於它引導您完成在雲模式下啓動 Solr 節點和添加集合的過程。要開始, 只需作:
bin/solr -e cloud
這將啓動一個交互式會話, 以讓您完成與嵌入式管理員一塊兒設置簡單 SolrCloud 羣集的步驟。
該腳本首先詢問您要在本地羣集中運行多少個 Solr 節點, 默認值爲2。
Welcome to the SolrCloud example!
This interactive session will help you launch a SolrCloud cluster on your local workstation.
To begin, how many Solr nodes would you like to run in your local cluster? (specify 1-4 nodes) [2]
複製代碼
該腳本支持啓動多達4個節點, 但咱們建議在啓動時使用默認值2。這些節點將分別存在於一臺計算機上, 但將使用不一樣的端口在不一樣的服務器上模擬操做。
接下來, 腳本將提示您將端口綁定到每一個 Solr 節點, 如:
Please enter the port for node1 [8983]
爲每一個節點選擇任何可用端口;第一個節點的默認值爲第二個節點的8983和7574。腳本將按順序啓動每一個節點, 並向您顯示它用來啓動服務器的命令, 例如:
solr start -cloud -s example/cloud/node1/solr -p 8983
第一個節點還將啓動綁定到端口9983的嵌入式管理員服務器。第一個節點的 Solr 主頁按選項所示。
example/cloud/node1/solr-s
啓動羣集中的全部節點後, 腳本將提示您輸入要建立的集合的名稱:
Please provide a name for your new collection: [gettingstarted]
建議的默認值爲 "gettingstarted", 但您可能但願爲特定的搜索應用程序選擇更適合的名稱。
接下來, 腳本將提示您輸入要在其中分發集合的碎片數。 若是您不肯定, 咱們建議使用默認值 2, 以便您能夠看到集合是如何分佈在 SolrCloud 羣集中的多個節點上的。
接下來, 腳本將提示您爲每一個碎片建立的副本數。 若是您不肯定, 請使用默認值 2, 以便您能夠看到在 SolrCloud 中如何處理複製。
最後, 腳本將提示您輸入集合的配置目錄的名稱。你能夠選擇**_default**, 或sample_techproducts_configs。配置目錄被拉起, 因此你能夠預先審查, 若是你想。當您仍在爲文檔設計架構時, _default配置頗有用, 在測試 Solr 時須要一些靈活性, 由於它具備無模式功能。可是, 在建立集合以後, 能夠禁用無模式功能, 以便鎖定架構 (以便在這樣作後索引的文檔不會更改架構) 或自行配置架構。這能夠按以下方式完成 (假定您的集合名稱爲):server/solr/configsets/mycollection
curl http://host:8983/api/collections/mycollection/config -d '{"set-user-property": {"update.autoCreateFields":"false"}}'
此時, 您應該在本地 SolrCloud 羣集中建立一個新的集合。要驗證這一點, 能夠運行狀態命令: bin/solr status
若是在此過程當中遇到任何錯誤, 請檢查中的 Solr 日誌文件。 example/cloud/node1/logsexample/cloud/node2/logs
經過訪問 Solr 管理用戶界面中的 "雲" 面板: http://localhost:8983/solr/#/~cloud, 您能夠看到如何在羣集上部署集合。Solr 還提供了一種使用運行情況檢查命令對集合執行基本診斷的方法: bin/solr healthcheck -c gettingstarted
運行情況檢查命令收集有關集合中每一個副本的基本信息, 如文檔數、當前狀態 (活動、向下等) 和地址 (副本在羣集中的位置)。 如今可使用Post 工具將文檔添加到 SolrCloud 中。 要在 SolrCloud 模式下中止 Solr, 您可使用該腳本併發出命令, 以下:
bin/solr stop -all
至此,集羣搭建完畢。 若是有其餘疑問能夠參考官方文檔:solrcloud官方文檔
SolrJ是一種 API, 它使用 Java 編寫的應用程序 (或基於 JVM 的任何語言) 能夠輕鬆地與 Solr 進行對話。SolrJ 隱藏了許多鏈接到 solr 的詳細信息, 並容許應用程序使用簡單的高級方法與 solr 進行交互。SolrJ 支持大多數 Solr api, 而且是高度可配置的。
SolrJ API 附帶了 Solr, 所以您沒必要下載或安裝其餘任何內容。可是, 您須要將生成配置爲包括 SolrJ 及其依賴項。
對於使用 Maven 構建的項目, 請將如下內容放在:pom.xml
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>7.4.0</version>
</dependency>
複製代碼
SolrJ 概述
SolrJ 的靈活性是圍繞幾個簡單的接口構建的。 全部對 Solr 的請求都由一個 SolrClient發送。SolrClient 是 SolrJ 核心的主要主力。他們處理與 Solr 鏈接和通訊的工做, 而且是大多數用戶配置發生的地方。 請求以 SolrRequests的形式發送, 並做爲 SolrResponses返回。
SolrClients 類型
SolrClient有幾個具體的實現, 每一個都面向不一樣的使用模式或恢復模式:
HttpSolrClient -面向以查詢爲中心的工做負載, 但也是一個很好的通用客戶端。直接與單個 Solr 節點通訊。
LBHttpSolrClient -平衡請求負載橫跨 Solr 節點列表。根據節點的運行情況調整 "在職" 節點的列表。
CloudSolrClient -面向與 SolrCloud 部署的通訊。使用已記錄的動物園管理員狀態發現並將請求路由到健康的 Solr 節點。
ConcurrentUpdateSolrClient -面向以索引爲中心的工做負載。在將更大的批處理髮送到 Solr 以前, 在內部緩衝文檔。
在 SolrJ 中查詢
SolrClient有許多獲取 Solr 結果的方法。其中的每一個方法都採用一個封裝任意查詢參數的對象。每一個方法輸出 a, 一個包裝器, 可用於訪問結果文檔和其餘相關元數據。 query()SolrParamsQueryResponse
下面的代碼段使用 SolrClient
查詢 Solr 的 "techproducts" 示例集合, 並對結果進行迭代。
final SolrClient client = getSolrClient();
final Map<String, String> queryParamMap = new HashMap<String, String>();
queryParamMap.put("q", "*:*");
queryParamMap.put("fl", "id, name");
queryParamMap.put("sort", "id asc");
MapSolrParams queryParams = new MapSolrParams(queryParamMap);
final QueryResponse response = client.query("techproducts", queryParams);
final SolrDocumentList documents = response.getResults();
print("Found " + documents.getNumFound() + " documents");
for(SolrDocument document : documents) {
final String id = (String) document.getFirstValue("id");
final String name = (String) document.getFirstValue("name");
print("id: " + id + "; name: " + name);
}
複製代碼
SolrParams
有一個子類, 它提供了一些方便的方法, 大大簡化了查詢的建立。下面的代碼段顯示瞭如何使用如下幾種方便方法生成上一個示例中的查詢:SolrQuery SolrQuery
final SolrQuery query = new SolrQuery("*:*");
query.addField("id");
query.addField("name");
query.setSort("id", ORDER.asc);
query.setRows(numResultsToReturn);
複製代碼
SolrJ 中的索引
索引也很簡單, 使用 SolrJ。用戶生成要做爲實例索引的文檔, 並將它們做爲參數提供給其中的一個方法。
SolrInputDocumentadd()SolrClient
下面的示例演示如何使用 SolrJ 將文檔添加到 Solr 的 "techproducts" 示例集合中:
final SolrClient client = getSolrClient();
final SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", UUID.randomUUID().toString());
doc.addField("name", "Amazon Kindle Paperwhite");
final UpdateResponse updateResponse = client.add("techproducts", doc);
// Indexed documents must be committed
client.commit("techproducts");
複製代碼
至此,solrj的一些簡單操做介紹完畢,一些複雜的查詢能夠參考官方文檔:使用solrj
solr安裝簡單,初次使用須要配置一些參數在配置文件中,不過配置文件中描述的很詳細,若是以後想修改配置能夠在配置文件中直接參考註釋便可。solr自帶了可視化界面,能夠經過solr admin界面進行數據的查詢,插入,節點狀態信息查看等各項功能。solrcloud可使用solr直接啓動,集羣搭建也挺方便。在java編碼時,可使用現有的solrj進行數據操做,避免了一些不須要的鏈接等操做,方便簡單。
整體來講,solr值得信賴。
附上一些優秀的參考文檔: