介紹
介紹
ElasticSearch是一個文件型資料庫引擎,和MongoDB類似,它的資料也是以一個一個文件的形式儲存起來的,同樣的它的資料也是JSON資料型別的。和MongoDB最大的區別是ElasticSearch的重點是在搜尋上,從名字也可以看得出來,ElasticSearch基於Lucene全文檢索引擎,可以輕鬆建立一個BM25演算法的全文搜尋引擎。
今天我們就來學習如何安裝配置ElasticSearch搜尋引擎,跟著福哥來吧~~
基本資訊安裝環境
CentOS:CentOS Linux release 7.6.1810 (Core)Linux:Linux version 3.10.0-1062.el7.x86_64GCC:gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
軟體版本
elasticsearch-6.5.2.tar.gz
準備工作本地化
如果是新環境,我們需要設定時區以保證時間顯示正確
timedatectl set-timezone Asia/Shanghai
安裝wget
如果環境裡沒有wget,透過yum安裝一下
yum -y install wget
建立環境根目錄
mkdir -p /tongfu.net/env/
建立安裝包目錄並進入
mkdir /packagescd /packages
安裝
官網下載
官網下載elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.2.tar.gz
網盤下載
如果官網下載太慢可以從網盤下載
連結: https://pan.baidu.com/s/1Fay75ADcmfX41xcUdU3hJA 提取碼: kfms
JDK官網下載
必須透過網頁下載,需要勾選“接受協議”,所以不能用wget直接下載了!
網頁地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
JDK網盤下載
這裡也提供一個網盤下載地址,如果不會從官網下載或者下載太慢可以從這裡下載
連結: https://pan.baidu.com/s/1szuuSTpjIon5qrPY-SH3NQ 提取碼: bp2y
安裝
Docker安裝
因為安裝elastic search引擎需要去掉記憶體使用限制,所以如果我們想要安裝在Docker容器內,則建立Docker容器時候需要增加如下引數設定
--ulimit memlock=-1:-1 --ulimit nofile=65536:65536
vm.max_map_count
預設 vm.max_map_count 是 65530,需要加大到 262144(Docker安裝需要在宿主機上執行)
[root@tongfunet]# vi /etc/sysctl.confvm.max_map_count=262144
使sysctl的配置改動立即生效(不需要重啟伺服器)
sysctl -p
建立使用者
useradd es
解壓縮elasticsearch
tar -xzvf elasticsearch-6.5.2.tar.gz -C /tongfu.net/env/
設定許可權elasticsearch
chown es.es -R /tongfu.net/env/elasticsearch-6.5.2/
解壓縮jdk
tar -xzvf jdk-8u192-linux-x64.tar.gz -C /tongfu.net/env/
最佳化
設定JVM記憶體使用
建議設定初始化記憶體和最高記憶體都是物理記憶體的一半
[root@tongfunet]# vi /tongfu.net/env/elasticsearch-6.5.2/config/jvm.options# Xms represents the initial size of total heap space# Xmx represents the maximum size of total heap space-Xms4g-Xmx4g
ES設定
設定啟動記憶體鎖定
把 bootstrap.memory_lock: true 前面的 # 去掉
[root@tongfunet]# vi /tongfu.net/env/elasticsearch-6.5.2/config/elasticsearch.yml## Lock the memory on startup:#bootstrap.memory_lock: true
設定IP
預設elasticsearch只能透過127.0.0.1訪問,我們需要設定一下IP地址
[root@tongfunet]# vi /tongfu.net/env/elasticsearch-6.5.2/config/elasticsearch.yml#network.host: 0.0.0.0## Set a custom port for HTTP:#http.port: 9200
啟動
啟動ES
建立啟動指令碼
[root@tongfunet]# cat > /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-start <<EOF#!/bin/shexport JAVA_HOME=/tongfu.net/env/jdk1.8.0_192/# argvesroot=/tongfu.net/env/elasticsearch-6.5.2# quitpid="\`ps -ax|grep \${esroot}|grep java|awk '{print \$1}'\`"if [ "" = "\$pid" ] ; then echo "starting..." \$esroot/bin/elasticsearch -delse echo "started"fiEOF
停止ES
建立停止指令碼
[root@tongfunet]# cat > /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-quit <<EOF#!/bin/sh# envexport PATH# argvesroot=/tongfu.net/env/elasticsearch-6.5.2# quitpid="\`ps -ax|grep \${esroot}|grep java|awk '{print \$1}'\`"if [ ! "" = "\$pid" ] ; then echo "stopping..." /bin/kill \$pidelse echo "stopped" fiEOF
授權指令碼
授權指令碼可執行許可權
chmod 0755 /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-startchmod 0755 /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-quitchown es.es /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-startchown es.es /tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-quit
自動啟動
新增自動啟動指令碼
[root@tfdev packages]# cat > /lib/systemd/system/elasticsearch.service <<EOF[Unit]Description=elasticsearchAfter=network.target[Service]Type=forkingLimitNOFILE=65536LimitNPROC=65536LimitMEMLOCK=infinityUser=esGroup=esExecStart=/tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-startExecStop=/tongfu.net/env/elasticsearch-6.5.2/bin/elasticsearch-quitPrivateTmp=true[Install]WantedBy=multi-user.targetEOF
使用 systemctl 管理 redis 服務
systemctl enable elasticsearch # 設定自動啟動systemctl start elasticsearch # 啟動服務systemctl stop elasticsearch # 停止服務systemctl restart elasticsearch # 重啟服務
測試
[root@tongfunet]# curl 'http://localhost:9200/'{ "name" : "QguZy94", "cluster_name" : "elasticsearch", "cluster_uuid" : "O5CfJjefQRWrkVe8_yRQoA", "version" : { "number" : "6.5.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "816e6f6", "build_date" : "2018-11-09T18:58:36.352602Z", "build_snapshot" : false, "lucene_version" : "7.5.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search"}
使用準備
建議使用工具Postman進行除錯。ES裡的index(索引)對應資料庫裡的資料庫名稱ES裡的資料是文件型的,每個型別下面可以有多個文件,文件結構必須一致如果文件結構有大的變化,需要建立新的型別,因為舊的資料已經存入快取,無法立即更新
寫入資料
透過POST方式請求如下地址,索引名稱 index1
POST /index1{ "id":1, "class":10, "name":"北京"}
我們按照這個結果插入多個文件進去,例如:上海,天津,河北,河南。為了測試我們再寫入河北省,河南省兩個文件進去。
獲取資料
透過GET方式請求如下地址
GET /index1/_search{ "_index": "index1", "_type": "type1", "_id": "1", "_version": 1, "found": true, "_source": { "id": 1, "class": 10, "name": "北京" }}
標準搜尋
關鍵字搜尋
搜尋包含“河”的文件
POST /index1/_search { "from" :0, "size" :10, "query" :{ "match" :{ "name":"河" } }}
搜尋包含“河北省”且class為20的文件注意:這裡的 must 相當於資料庫裡的“and”,“or”則用 should 表示,must、should必須配合 bool 使用
POST /index1/_search{ "from" :0, "size" :10, "query" :{ "bool" :{ "must" :[ { "terms" :{ "class":[20] } }, { "match" :{ "name":"河省" } } ] } }}
以上語法可以將“河北”,“河南”,“河北省”,“河南省”全部查詢出來,因為任何一個字命中都會被找出來如果我們希望只找出那些完全包含給定關鍵字的文件出來,可以使用以下語句
POST
使用match_phrase替代match,表示完全匹配模式,即:關鍵字的必須完全命中,且出現順序才會被查詢出來
分組統計
獲得包含“河”的文件的class列表
POST /index1/_search{ "from" :0, "size" :0, "query" :{ "bool" :{ "must" :[ { "match" :{ "name":"河" } } ] } }, "aggs":{ "group_by_class":{ "terms":{ "field":"class", "size":1000 } } }}
結果如下
{ "took": 2, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": 3, "max_score": 0, "hits": [] }, "aggregations": { "group_by_class": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": 20, "doc_count": 3 } ] } }}
這裡使用的是aggregations模擬資料庫的group by功能,group_by_class是別名可以隨便起如果分組的欄位是字串型別,則需要在欄位後面加上“.keyword”,例如:class.keyword
型別與對映
欄位型別
設定欄位型別
DELETE http://localhost:9200/index1
資料備份/還原安裝工具
安裝匯入匯出工具 elasticdump
cd /tongfu.net/env/elasticsearch-6.5.2/bin/yum -y install epel-releaseyum -y install nodejsnpm install elasticdump
匯出/匯入
從一個es匯出mappings到另一個es
./elasticdump --input=http://[源ES]/demo_index --output=http://[目標ES]/demo_index --type=mapping
從一個es匯出資料到另一個es
./elasticdump --input=http://[源ES]/demo_index --output=http://[目標ES]/demo_index --type=data
將es資料匯出到json檔案
./elasticdump --input=http://[源ES]/demo_index --output=my_data.json --type=data
從json檔案匯入資料到es
./elasticdump --input=my_data.json --output=http://[目標ES]/demo_index --type=data
常見錯誤
錯誤1
如果在寫入資料的時候遇到這個錯誤資訊 FORBIDDEN/655/index1 read-only / allow delete (api),可以透過執行下面的命令修復
PUT /index1/_settings{ "index.blocks.read_only_allow_delete":"false"}
https://m.tongfu.net/home/35/blog/406736.html