基于docker的elasticsearch中文分詞及同義詞配置

一、Elasticsearch

1.1簡介

開源的 Elasticsearch 是目前全文搜索引擎的首選。

它可以快速地儲存、搜索和分析海量數(shù)據(jù)。

img

Elastic 的底層是開源庫 Lucene。Elastic 是 Lucene 的封裝,提供了 REST API 的操作接口,開箱即用。

1.2安裝

本文使用docker安裝elasticsearch:

$ docker pull elasticsearch:6.6.0

運行elasticsearch:

$ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.6.0

瀏覽器輸入127.0.0.1:9200 如得到和下面類似的響應,則說明安裝成功。

{
  "name" : "1qMIj3m",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "AT68_T_DTp-1qgIJlctQqA",
  "version" : {
    "number" : "6.6.0",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "f27399d",
    "build_date" : "2019-01-24T11:27:09.439740Z",
    "build_snapshot" : false,
    "lucene_version" : "7.6.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

為方便以后的操作,安裝Kibana,Kibana是Elasticsearch的開源數(shù)據(jù)可視化插件。它在Elasticsearch集群上索引的內(nèi)容之上提供可視化功能。用戶可以在大量數(shù)據(jù)之上創(chuàng)建條形圖,折線圖和散點圖,或餅圖和貼圖。

同樣通過docker拉取鏡像:

$ docker pull kibana:6.6.0

啟動:

$ docker run -d --name kibana -p 5601:5601 kibana:6.6.0

需要注意的是,運行不同主版本號的 Kibana 和 Elasticsearch 是不支持的(例如 Kibana 5.x 和 Elasticsearch 2.x),若主版本號相同,運行 Kibana 子版本號比 Elasticsearch 子版本號新的版本也是不支持的(例如 Kibana 5.1 和 Elasticsearch 5.0)。

編寫docker-compose.yml方便管理elasticsearch和kibana容器:

version: '3'
services:
    elasticsearch:
        build: elasticsearch:6.6.0
        container_name: elasticsearch
        environment: 
            - discovery.type=single-node
        ports:
            - 9200:9200
            - 9300:9300

    kibana:
        image: kibana:6.6.0
        container_name: kibana
        ports:
            - 5601:5601

之后可通過docker-compose up命令來啟動兩個容器。

二、中文分詞

直接使用對應的中文分詞插件elasticsearch-analysis-ik來進行中文分詞 ,這里通過編寫Dockerfile文件,來自定義一個具有中文分詞插件的elasticsearch容器。

在docker-compose.yml文件的同級目錄新建名為es的文件夾,在es文件夾中編寫Dockerfile。

目錄結(jié)構(gòu)如下:

.
├── docker-compose.yml
└── es
    └── Dockerfile

Dockerfile文件內(nèi)容如下:

FROM elasticsearch:6.6.0
RUN yes | ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip

修改docker-compose.yml 構(gòu)建我們在Dockerfile中的鏡像

version: '3'
services:
    elasticsearch:
        build: ./es
        container_name: elasticsearch
        environment: 
            - discovery.type=single-node
        ports:
            - 9200:9200
            - 9300:9300

    kibana:
        image: kibana:6.6.0
        container_name: kibana
        ports:
            - 5601:5601

修改完成之后記得執(zhí)行docker-compose build命令更新鏡像。

三、同義詞詞典

參考es的相關(guān)文檔:Synonym Token Filter

Two synonym formats are supported: Solr, WordNet.

也就是es的同義詞詞典格式目前支持兩種格式,本文僅使用Solr這種模式的同義詞。

詞典部分本文采用哈工大同義詞詞林,這里可以下載該詞典。在實際業(yè)務(wù)中應根據(jù)實際需求對詞典進行優(yōu)化。

下載后需要根據(jù)Solr模式的同義詞格式進行格式化一下,放至es文件夾下。

格式化后同義詞詞典synonym.txt的部分內(nèi)容如下:

人,士,人物,人士,人氏,人選

人類,生人,全人類

勞力,勞動力,工作者

匹夫,個人

此時目錄結(jié)構(gòu)如下:

.
├── docker-compose.yml
└── es
    ├── Dockerfile
    └── synonym.txt

由于需要添加同義詞詞典,我們需要更新Dockerfile

FROM elasticsearch:6.6.0
RUN yes | ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip
RUN mkdir -p ./config/analysis && chown -R elasticsearch:root ./config/analysis
COPY --chown=elasticsearch:root synonym.txt /usr/share/elasticsearch/config/analysis/

目的是在elasticsearch/config目錄下,建立analysis目錄, 并在analysis目錄下放入本地synonym.txt文件。
修改完成之后docker-compose build命令更新鏡像。

四、測試

新建名為first的索引,自定義一個叫做ik_synonymanalyzer

PUT /first
{
  "settings": {
    "analysis": {
      "filter": {
        "my_stop": {
          "type": "stop",
          "stopwords": [" "]
        },
        "my_synonym": {
          "type": "synonym",
          "synonyms_path": "analysis/synonym.txt"
        }
      },
      "analyzer": {
        "ik_synonym": {
          "type": "custom",
          "tokenizer": "ik_max_word",
          "filter": ["my_stop","my_synonym"]
        }
      }
    }
  }
}

設(shè)置好后,可以用以下命令檢測同義詞是否配置成功

GET /first/_analyze 
{
  "analyzer": "ik_synonym",
  "text": "番茄"
}

結(jié)果如下

{
  "tokens" : [
    {
      "token" : "番茄",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "西紅柿",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "SYNONYM",
      "position" : 0
    }
  ]
}

至此,elasticsearch環(huán)境基本搭建完成。本人水平有限,若有疏漏之處希望各位能夠指正,共同學習,謝謝。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容