1. 程式人生 > 其它 >伺服器-docker-elasticsearch-Kibana-ik分詞器 操作指引

伺服器-docker-elasticsearch-Kibana-ik分詞器 操作指引

->用於大資料搜尋,文字相似度計算(BM25)
->參考資料:docker命令-菜鳥教程:https://www.runoob.com/docker/docker-architecture.html 及相關書籍

操作指引——在伺服器裡安裝docker,並在docker中搭建es,kibana並使用ik分詞器。

  1. 在伺服器中安裝docker
    docker -v檢視docker版本

  2. 獲取映象 可以在dockerhub中找合適的版本,以Elasticsearch為例。
    docker pull elasticsearch:7.17.2
    docker pull elasticsearch 不寫預設最新版本
    docker images -a

    檢視已拉取的映象
    docker images 檢視執行中的映象

  3. 構建es容器
    docker run -d --name es -p 9200:9200 -p 9300:9300 --network es-net -e "discovery.type=single-node" elasticsearch:7.17.2
    容器名為es 網路為es-net,以便後續Kibana部署
    docker ps -a 檢視建立的所有容器
    docker ps 檢視執行中的容器
    docker exec -it 容器ID /bin/bash 進入容器
    docker exec -it es /bin/bash 輸入容器名也行
    exit 退出容器

  4. 容器與本地檔案互傳
    本地檔案傳入容器
    docker cp /root/mwb.json 1d1196d53e55:/usr/share/kibana
    容器傳入本地opt目錄下
    docker cp a6da08e70dc5:/opt/json /opt

  5. 部署ElasticSearch-Head
    docker pull mobz/elasticsearch-head:5
    docker run -d --name es_admin -p 9100:9100 mobz/elasticsearch-head:5
    登入 http://伺服器IP:9100/ 就可以看到es的管理介面

    連不上的話修改ES中elasticsearch.yml
    在檔案最後最後加上,解決跨域問題。

http.cors.enabled: true 
http.cors.allow-origin: "*"

改好後退出並重啟es

  1. 安裝kibana 可以更好的查詢展示資料
    (可選,如果通過python等直接呼叫es就不用安裝)
    必須要和es相同版本
    docker pull kibana:7.17.2
    docker run -d --name kibana -e ELASTICSEARCH_HOSTS=http://es:9200 --network=es-net -p 5601:5601 kibana:7.17.2
    和es放到一個網路中es-net省去檔案配置
    登入http://伺服器IP:5601/

    找到Management 中的Dev Tools,就進入了控制檯。

  2. IK分詞器
    es預設中文分詞是逐字劃分,要分析中文文字資料需要用到IK分詞器。
    ik網址:https://github.com/medcl/elasticsearch-analysis-ik

    重啟es容器 docker restart es
    在kibana中輸入

GET /_analyze
{"analyzer": "standard","text": "今天天氣可真好啊!"}

沒報錯就說明安裝成功.

  1. Python呼叫es
from elasticsearch import  Elasticsearch
index_name = 'my_index' #索引名
es = Elasticsearch(
    ['伺服器IP:9200'],
    #節點沒有響應時,進行重新整理,重新連線
    sniff_on_connection_fail=True,
    #每 60 秒重新整理一次
    sniffer_timeout=60
)
body = {
    "query": {
        "match": {
            "cont": "今天的天氣真不錯!"
        }
    }
}
requ_data= es.search(index=index_name, body=body)
print(requ_data)

一些ES建立查詢語句、使用ik進行分詞

  1. 建立索引
  2. 先設定欄位屬性,插入欄位以後就不能改變分詞方式了.
PUT /my_index
{
  "mappings": {
      "properties": {
        "post": {
          "type": "text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_smart"
        },
        "repost": {
          "type": "text",
          "analyzer": "ik_max_word",
          "search_analyzer": "ik_smart"
        }
   }   
}
}
  1. 插入資料
POST /my_index/_bulk
{ "index": { "_id": "1"} }
{ "cont": "杭州的天氣真好啊!" }
{ "index": { "_id": "2"} }
{ "cont": "我喜歡下雪天的西湖。" }
{ "index": { "_id": "3"} }
{ "cont": "我也不知道你在說什麼,反正幹就完事兒!" }

或者搞成json檔案批量匯入es資料

{ "create" : { "_index" : "my_index", "_id" : " 1110432760" }}
{ "uid" : "1110432760", "cont" : "今晚吃啥呢?"}

{ "create" : { "_index" : "my_index", "_id" : " 1113428580" }}
{ "uid" : "1113428580", "cont" : "我覺得吃火鍋就挺好"}

把資料處理成這種JSON格式,最後一行也要加空格,一條資料要放在一行。
s= "".join(s.split()) 處理文字
將處理好的JSON檔案放到Kibana容器裡,每個檔案最好保持在5-15M.

curl -H "Content-Type: application/json" -XPOST http://伺服器IP:9200/uwb02/usi/_bulk --data-binary @uwb.json

  1. 查詢資料,並高亮顯示
GET /my_index/_search
{
  "query": {
    "match": {
      "cont": "我喜歡喝西湖龍井!"
    }
  },
  "highlight": {
    "fields": {
      "cont": {}
    }
  }
}

多個欄位一起查詢

GET /my_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "post": {
              "query": "中國真美",
              "boost": 2
            }
          }
        },
        {
          "match": {
            "repost": "中國真美"
          }
        }
      ]
    }
  }
,
  "highlight": {
    "fields": {
      "post": {},
      "repost": {}
    
    }
  }
}

  1. 刪除索引
    DELETE /my_index

修改docker儲存位置

參考連結:
https://blog.51cto.com/u_15499155/5044316
https://baijiahao.baidu.com/s?id=1705154291503534578&wfr=spider&for=pc
sudo docker info | grep "Docker Root Dir" 檢視當前docker位置
service docker stop停掉docker
mv /var/lib/docker /root/data/docker 移動dokcer
ln -s /root/data/docker /var/lib/docker 建立軟連線
systemctl restart docker 重啟docker

常見錯誤處理

docker容器內使用apt報錯 E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission
使用root許可權進入docker
docker exec -u 0 -it 容器名 /bin/bash # 0 表示root

沒有vim問題

apt-get update
apt-get upgrade
apt-get install vim

vi 命令直接開啟