伺服器-docker-elasticsearch-Kibana-ik分詞器 操作指引
->用於大資料搜尋,文字相似度計算(BM25)
->參考資料:docker命令-菜鳥教程:https://www.runoob.com/docker/docker-architecture.html 及相關書籍
操作指引——在伺服器裡安裝docker,並在docker中搭建es,kibana並使用ik分詞器。
-
在伺服器中安裝docker
docker -v
檢視docker版本 -
獲取映象 可以在dockerhub中找合適的版本,以Elasticsearch為例。
docker pull elasticsearch:7.17.2
docker pull elasticsearch
不寫預設最新版本docker images -a
docker images
檢視執行中的映象 -
構建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
退出容器 -
容器與本地檔案互傳
本地檔案傳入容器docker cp /root/mwb.json 1d1196d53e55:/usr/share/kibana
容器傳入本地opt目錄下docker cp a6da08e70dc5:/opt/json /opt
-
部署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
-
安裝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,就進入了控制檯。 -
IK分詞器
es預設中文分詞是逐字劃分,要分析中文文字資料需要用到IK分詞器。
ik網址:https://github.com/medcl/elasticsearch-analysis-ik
重啟es容器docker restart es
在kibana中輸入
GET /_analyze
{"analyzer": "standard","text": "今天天氣可真好啊!"}
沒報錯就說明安裝成功.
- 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進行分詞
- 建立索引
- 先設定欄位屬性,插入欄位以後就不能改變分詞方式了.
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"
}
}
}
}
- 插入資料
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
- 查詢資料,並高亮顯示
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": {}
}
}
}
- 刪除索引
DELETE /my_index
修改docker儲存位置
參考連結:
https://blog.51cto.com/u_15499155/5044316
https://baijiahao.baidu.com/s?id=1705154291503534578&wfr=spider&for=pcsudo docker info | grep "Docker Root Dir"
檢視當前docker位置service docker stop
停掉dockermv /var/lib/docker /root/data/docker
移動dokcerln -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許可權進入dockerdocker exec -u 0 -it 容器名 /bin/bash
# 0 表示root
沒有vim問題
apt-get update
apt-get upgrade
apt-get install vim
vi 命令直接開啟