Skip to content

Instantly share code, notes, and snippets.

@maxmilian
Last active July 11, 2020 06:40
Show Gist options
  • Save maxmilian/f84af72e47cb0eda56807f810a84be72 to your computer and use it in GitHub Desktop.
Save maxmilian/f84af72e47cb0eda56807f810a84be72 to your computer and use it in GitHub Desktop.

Apache Solr

Concept

Apache Solr 大致可分為四個功能區塊

  • Mode (managed-schema 或舊版 schema.xml)
  • Configuration (solrconfig.xml)
  • Index
  • Search

Solr Archecture

設定好 Schema (managed-schema or schema.xml) 並啟動 Solr 後,即可使用 DataImport 或 /update 方式加入資料,開始建立 Index。並透過 Solr Admin UI 或 restful API 查詢。

Installation

在 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

建立個 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

參考 Solr Tutorial 官方教學,其中匯入的 example 資料請由 Github下載 或者直接使用 Homebrew 安裝目錄 /usr/local/Cellar/solr/8.5.2/example 檔案

NOTE: Solr 有 Cloud Mode 和 Standalone Mode,tutorial 裡面為 Cloud Mode

Tokenizer

目前常見分詞器有 SmartcnIKAnalyzerNLPIRLTP結巴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

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 功能

Mongo Importer

資料來源也可直接使用 MongoDB 匯入,

先加入以上的 jar 於 new_core 的 dist 目錄中

設定 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment