Solr是Apache旗下基于NoSQL技術的全文本搜索引擎。
簡單來說,Solr具有如下特點:
- 強大的全文本搜索能力
- 針對大容量流量進行優化
- 提供基于XML/JSON/HTTP的標準開放接口
- 提供高效的管理頁面
- 提供易于使用的監控工具
- 高度易于擴展和容錯
- 使用簡單的配置文件,靈活且適應性強
- 近實時索引
- 提供可擴展的插件
安裝
Cli命令?不存在的….emmm
curl或wget吧
curl https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/7.4.0/solr-7.4.0.zip
這里使用的鏈接是清華的鏡像,具體請參見Apache Download Mirrors
將Solr下載后解壓,得到如下的文件夾:
/bin:存放solr相關的運行腳本和配置文件
關于solr的quick start,大家參見Solr quick start
使用solr建立自己的搜索服務
啟動solr
首先,切換到solr下的bin目錄:
cd solr-7.4.0/bin
使用如下命令運行solr
./solr start
看到這個輸出,說明solr就啟動成功了,可以打開 http://localhost:8983/solr 查看solr的運行情況。
此外,solr還支持如下命令
- ./solr restart 重啟solr
- ./solr stop 停止solr
- ./solr -h 查看幫助
創建自己的核心(core)
核心(core)其實就是一個搜索的倉庫,可以往這個搜索倉庫添加索引文檔,再進行相關的搜索和查詢。
使用如下命令創建一個新的核心:
./solr create -c <yourCollection>
注意:該命令創建核心時,使用了solr的默認配置文件,solr官方不推薦我們在應用到實際產品時使用它的默認配置文件。但是我們可以在默認文件的基礎上進行修改。當我們需要部署多個solr實例的時候,這份配置文件就可以復用了。其次,如果你的solr運行在cloud模式下,可以添加 -s 2 -rf 2
,對于這兩個參數起到的作用,這里簡單說明一下,solr為你創建的核心添加了兩個節點(node),每個節點都添加了兩個區塊(shard),這兩個參數在SolrCloud中才會起作用。
執行創建核心的命令后,可以在solr管理面板中查看新核心的基本信息:
Solr配置文件
在上一步說到,我們創建的核心使用了solr的默認配置文件,那默認配置文件在哪里呢?這些默認配置文件有什么用呢?
Solr的默認配置文件在solr-7.4.0/server/solr/configsets/_default/conf目錄下:
簡單說明一下這些文件的作用:
synonyms.txt 同義詞替換配置
這個文件的作用就是配置一些常用的同義詞替換。比如說你的文檔里面有一個關鍵詞土豆,但是顯然用戶如果搜索馬鈴薯、洋芋,solr也應該返回包含土豆的文檔。synonyms.txt文件就是配置這樣的一些同義詞映射關系的。
stopwords.txt停用詞配置
對于停用詞配置,我暫時找不到一個中文搜索的例子來解釋這個東西。但是在英文里面,有很多冠詞之類的,如”a”,”an”,”the”等,這些冠詞是不需要作為關鍵詞進行索引的,用戶提交的搜索里面包含這些無意義的詞匯時,也應當剔除。因此stopwords.txt就是用來配置這些沒有意義的詞匯表的。但是在中文里面,這些無意義的詞匯可能比較少。我能想到的可能是量詞之類的,比如個、顆等;當用戶搜索”一顆蘋果”時,顆不應該作為關鍵詞進行查詢。
solrconfig.xmlsolr核心配置文件
該文件配置了solr核心運行的基本參數。該文件一般不需要進行修改,里面的默認配置已經能夠滿足大部分應用的需求。
managed-schemacore模式配置
這個文件沒有后綴,但其實他是一個xml文檔,solr不希望我們手工編輯這個文件,所以沒有寫明它的后綴名吧。這個文件是核心如何對文檔進行索引、分析、查詢處理的配置文件,solr確實也提供了相應的API對這個文件進行修改。在老版本中,古老的程序員都是手工修改這個文件的。
當你使用solr create命令創建自己的核心時,solr就會把該文件夾提交到新核心的配置文件目錄下。默認情況下,新核心在 solr-7.4.0/server/solr/ 目錄下
managed-schema詳細介紹
首先,選用一款你最愛的文本編輯器打開solr-7.4.0/server/solr/<yourCollectionName>/conf/managed-schema文件,定位到<field>節:
如圖,solr默認為我們配置的四個字段。其中id作為solr索引和存儲的主鍵;_version記錄了每個字段的版本信息;如果solr沒有匹配到你文檔的字段信息的話,就會默認把你的文檔全部索引成為text字段。
對了,這里隨便說一句。對于需要添加到solr進行索引的結構化文檔,必須包含id字段;但是對于類似于word、pdf這種文件可以不用指明id。
緊接著,solr還定義了一大推默認的動態字段:
動態字段的作用就是模糊匹配字段進行索引。舉個例子,比如你的文檔里面有類似于”age_i”,”level_i”等,就會被動態字段”*_i”匹配到,并識別為int數據類型。
這個文件余下的部分就是定義了一堆默認的字段類型,比如:
這種低級的基礎數據類型,這些基礎的類型都不帶有數據分析的功能。
當然還有待數據分析、過濾功能的類型:
Solr定義的類型默認是不支持中文解析的,但是我們完全可以自己去定義這些類型。比如定義對中文進行分詞、過濾的字段類型。
根據需要索引的文檔配置manage-schema
這里的配置主要是對manage-schema進行配置。由于每個公司管理的數據在結構上差異巨大,數據類型也不盡相同。因此,對于管理的數據進行針對性的配置,對實現更好的搜索效果至關重要。
對于需要搜索的數據,我們需要對其配置字段信息、字段的類型信息等。雖然solr提供了schemaless的功能,該功能可以根據你提交的文檔自動生成字段并推測字段類型。但是這個功能坑比較多,實際使用的時候經常會觸發solr內部的一大推數據類型轉換異常。由于solr是基于Java這類強類型語言開發的,因此這里我們還是手動對需要搜索的數據進行配置比較好。
比如,需要添加的文檔結構如下:
這里給的例子時JSON文件,當然你也可以使用XML、CSV一類的結構化文件格式。
對應的,我們在managed-schema添加對如上結構的識別信息:
<field name="user_id" type="plong" indexed="false" stored="true"/>
<field name="book_source" type="pint" indexed="false" stored="true"/>
<field name="ori_id" type="pint" indexed="false" stored="true"/>
<field name="ref_id" type="pint" indexed="false" stored="true"/>
<field name="book_name" type="text_general" indexed="true" stored="true" />
<field name="book_price" type="pdouble" indexed="true" stored="true" />
<field name="boor_price_type" type="string" indexed="false" stored="true"/>
<field name="book_author" type="text_general" indexed="true" stored="true" />
<field name="book_press" type="text_general" indexed="true" stored="true" />
<field name="book_date" type="pdate" indexed="true" stored="true" />
<field name="book_edition" type="string" indexed="false" stored="true"/>
<field name="book_isbn" type="text_general" indexed="true" stored="true" />
<field name="book_barcode" type="text_general" indexed="true" stored="true" />
<field name="book_pic" type="string" indexed="false" stored="true"/>
<field name="book_adopted" type="pint" indexed="false" stored="true"/>
<field name="book_description" type="text_general" indexed="true" stored="true" />
<field name="book_md5" type="string" indexed="false" stored="true"/>
<field name="book_catalog" type="text_general" indexed="true" stored="true" />
<field name="book_cretime" type="pdate" indexed="true" stored="true" docValues="true" />
<field name="book_credate" type="pdate" indexed="true" stored="true" docValues="true" />
這里說明一下indexed和stored屬性的作用:
Indexed表示對該字段需要進行索引,索引的目的是為了后面可以對該字段進行查詢;
Stored表示是否存儲該字段,只有存儲的了字段才會顯示在搜索結果中。
如何設置這個兩個屬性呢?我覺得可以使用如下的簡單原則:
- 判斷某個字段會不會為用戶提供搜索的功能,如果用戶能夠根據該字段進行搜索,那么indexed設置為true
- 對于indexed為true的字段,stored也應該為true
-
對于不需要索引的字段,如果需要暫時給用戶看,那么stored設置為true
將你的配置文件添加到solr默認的field區下面就可以了。
現在,已經完成了對solr核心的基本配置,我們可以在solr core admin中重新加載核心,讓新的配置文件生效。
重新加載核心
點了reload之后反饋的是綠色,那么說明你手工修改manage-schema已經被solr原諒了,恭喜你。
將數據添加到solr進行索引
在完成managed-schema配置后,我們就可以把數據添加到solr了。
在命令行中使用
./post -c <yourCoreName> <your-data-path>
如下:
如果你的terminal瘋狂輸出一大堆信息的話,說明emmmm你的配置可能有點問題,參照前面的步驟仔細檢查一遍喲~
到這里我們已經將數據成功的提交給solr進行索引了,那我們是不是就可以利用solr進行搜索了呢?
是的,沒錯。打開這個神奇的鏈接 http://localhost:8983/solr/#/<yourCollectionName>/query 吧!
直接click Execute Query按鈕!如果出現一遍原諒色的海洋,恭喜你。進入solr概覽的總結,否則的話請從頭仔細看一下本文章,直到出現一片原諒色的海洋,否則solr將對你永不饒恕,你已經惹怒它了。
總結
- 本文對solr進行了一個簡單的介紹,并說明了solr一些基礎的啟動命令,并介紹了solr核心的創建方式。但是注意,文中對核心用了兩個不同的詞匯進行表述,分別是”core”和”collection”,不嚴謹的說他們都是表示核心。
- 對于核心的配置文件,本文做了一個簡要的概述,介紹了一些重要配置文件的基本作用。
- 本文重點介紹了managed-schema文件的結構和配置方式。
- 本文使用solr實現了對文檔的搜索。
總結一下solr的基本使用:
- 使用./solr start命令啟動solr
- 使用./solr create命令創建一個核心
- 根據待索引文檔的結構,配置核心的managed-schema文件
- 將準備好的數據利用./post命令添加到solr進行索引。
最后說明
本文介紹的命令均是在mac os系統上,linux系統的命令格式和本文差異不大。但windows系統存在部分差異,可以參見前文提交的sorl-quick-start鏈接查看詳細內容。
請期待下一期關于solr在filedType中添加中文分詞、從數據庫導入數據倒solr已經solr高級搜索的相關內容。
please give me your ?? and ??!!!