首頁>技術>

介紹

介紹

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

20
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Elasticsearch難學?十萬字筆記 83.8k星,盤