Apache Solr 大致可分為四個功能區塊
- Mode (managed-schema 或舊版 schema.xml)
- Configuration (solrconfig.xml)
- Index
- Search
設定好 Schema (managed-schema
or schema.xml
) 並啟動 Solr 後,即可使用 DataImport 或 /update 方式加入資料,開始建立 Index。並透過 Solr Admin UI 或 restful API 查詢。
在 Mac 上,直接使用 Homebrew 安裝,目前最新版本版本為 v8.5.2 on (2020-07-11)
brew install solr
安裝完畢後,可使用以下指令啟動 Standalone Mode
# list services
brew services list
# start
brew services start solr
# stop
brew services stop solr
# restart
brew services restart solr
建立個 Core 設定 (new_core)
# enter Solr base dir
cd /usr/local/opt/solr/server/solr
cp -R configsets/_default/conf/ new_core
瀏覽器開啟 Solr Admin,點選 Add Core,使用預設設定即可建立。
參考 Solr Tutorial 官方教學,其中匯入的 example 資料請由 Github下載 或者直接使用 Homebrew 安裝目錄 /usr/local/Cellar/solr/8.5.2/example 檔案
NOTE: Solr 有 Cloud Mode 和 Standalone Mode,tutorial 裡面為 Cloud Mode
目前常見分詞器有 Smartcn、IKAnalyzer、NLPIR、LTP、結巴、MMSEQ 等
這邊使用 smartcn 當做分詞引擎 (smartcn為solr自帶的中文分詞器)
於 solrconfig.xml 加入 jar 目錄
<!-- vim solrconfig.xml
all jar in dist folder will be loaded
-->
<lib dir="./dist/" />
NOTE: 這裡的 jar 必須也複製一份至
solr-webapp/webapp/WEB-INF/lib
才能在 Solr Admin 使用該 Jar
加入 smartcn 於 managed-schema
<!--
# vim managed-schema
-->
<fieldType name="text_smartcn" 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>
Solr可以使用 Suggester 來達到Autocomplete功能。
在 solrconfig.xml 加入 SpellCheckComponent,並且指定要 autocomlete欄位為 content_autocomplete
<!--
# vim solrconfig.xml
-->
<searchComponent name="suggest" class="solr.SpellCheckComponent">
<lst name="spellchecker">
<str name="name">mySuggester</str>
<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
<str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
<str name="field">content_autocomplete</str>
<str name="buildOnCommit">true</str>
</lst>
</searchComponent>
<requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">mySuggester</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.extendedResults">false</str>
<str name="spellcheck.count">10</str>
<str name="spellcheck.collate">true</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
加入 smartcn 分詞器,並且由 content
欄位 copyField 至 content_autocomplete
<!--
# vim managed-schema
-->
<field name="content_autocomplete" type="text_smartcn" indexed="true" stored="true" multiValued="false" />
<copyField source="content" dest="content_autocomplete" />
<fieldType name="text_smartcn" 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>
重啟 solr 即可以使用 suggester 功能
資料來源也可直接使用 MongoDB 匯入,
先加入以上的 jar 於 new_core 的 dist 目錄中
- MongoDB Java Driver (v3.11.2)
- Solr DataImportHandler (v8.5.2)
- Solr Mongo Importer (v1.1.0)
設定 Solr Data Import Handler (DIH)
<!-- vim solrconfig.xml -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">./conf/data-config.xml</str>
</lst>
</requestHandler>
設定 Mongo 的連線方式、與 Schema 轉換
<!--
vim conf/data-config.xml
add new file data-config.xml shown in solrconfig.xml
-->
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource name="MyMongo" type="MongoDataSource" database="your_database" />
<document name="data">
<entity name="your_collection"
onError="continue"
processor="MongoEntityProcessor"
query=""
collection="reportBase"
datasource="MyMongo">
<field column="_id" name="id" />
<field column="content" name="content" />
</entity>
</document>
</dataConfig>
加入新的 Schema
<!--
vim managed-schema
Add a field: content in managed-schema
-->
<field name="content" type="text_general" termPositions="true" termVectors="true" indexed="true" termOffsets="true" stored="true" />
重啟 Solr 或 new_core 重新載入後,在 new_core 的 Dataimport 分頁中,可以使用 full-import 或 delta-import
使用 Data Importer 和 smartcn 分詞器時,在 new_core 和 sorl-webapp 裡面需要以下 jar lucene-analyzers-smartcn-8.5.2.jar. mongo-java-driver-3.11.2.jar. solr-dataimporthandler-8.5.2.jar. solr-dataimporthandler-extras-8.5.2.jar. solr-mongo-importer-1.1.0.jar.