Elasticsearch7.3安裝配置和使用


原文地址:http://blog.daozys.com/goods_167.html

先認識幾個東西:

1、Elasticsearch :開源分布式搜索引擎,它的特點有:分布式,零配置,自動發現,索引自動分片,索引副本機制, restful 風格接口,多數據源,自動搜索負載等。

2、Logstash :完全開源的工具,對日志進行收集、分析,並將其存儲供以后使用(如,搜索)。

3、kibana:開源和免費的工具,Kibana 可以為 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數據日志。

centos7安裝Elasticsearch

1:安裝jdk:Elasticsearch基於java,先配置java環境。

(2):我們到oracle去下載安裝包:https://www.oracle.com/technetwork/java/javase/downloads/index.html

我這里用:jdk-11.0.4_linux-x64_bin.tar.gz

(1):安裝jdk,先看看服務器上是否安裝過java

[root@localhost local]# java -version
-bash: java: 未找到命令

下載上面的jdk

tar -zxvf jdk-11.0.4_linux-x64_bin.tar.gz -C /usr/local/ //我解壓到這里
cd /usr/local/
ls 

改一下目錄名字吧

mv jdk-11.0.4/ jdk

(3):添加環境變量

vi /etc/profile

然后把環境變量添加到最后:

export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$JAVA_HOME/lib/
export PATH=$JAVA_HOME/bin //這一行如果有添加在后面

紅色部分是我加的環境變量

執行命令使環境變量生效:

source /etc/profile

再看看 java命令:

[root@localhost config]# java -version
java version "11.0.4" 2019-07-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.4+10-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.4+10-LTS, mixed mode)

安裝成功了!7.3自帶了一個jdk,可以不用去下載,用這個也可以,如圖:

img

安裝Elasticsearch

下載地址:https://www.elastic.co/cn/downloads/

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.1-linux-x86_64.tar.gz #下載
tar -xvf elasticsearch-7.3.1-linux-x86_64.tar.gz
mv elasticsearch-7.3.1/ elasticsearch #改個名字

這玩意兒解壓就可以啟動了,試一下:

./bin/elasticsearch

img

報錯,這里提示這個,因為es5.0以后,為了安全不允許root用戶操作,我們創建一個專門的賬號。

groupadd es_g //創建用戶組
useradd es -g es_g -p 123 //在es_g用戶組下添加一個es用戶

給elasticsearch目錄賦予權限

chown -R es:es_g elasticsearch/

切換用戶

su es

再啟動一下:

img看見這個表示啟動成功。

我們試一下,這里窗口先別關,重新打開一個終端(也可以后台啟動,-d),用linux的curl命令檢測一下,如果要查看http頭:curl -i -XGET 'localhost:9200'

[root@localhost ~]# curl "127.0.0.1:9200"
{
  "name" : "localhost.localdomain",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "iHsxZzqiQMWcAgw3yBdY9Q",
  "version" : {
    "number" : "7.3.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "4749ba6",
    "build_date" : "2019-08-19T20:19:25.651794Z",
    "build_snapshot" : false,
    "lucene_version" : "8.1.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

再用瀏覽器試下:

img

竟然訪問不到,防火牆也是關着的。

切換到root用戶查看一下端口:

[root@localhost ~]# netstat -aon|grep 9200
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      off (0.00/0/0)
tcp6       0      0 ::1:9200                :::*                    LISTEN      off (0.00/0/0)

原來這里綁定的是127,難怪訪問不到,改一下配置:

vi config/elasticsearch.yml

搜索 network.host

img注意前面有個空格,冒號后面也有個空格

再切換到se用戶運行一下,發現報錯。看看報錯死馬:

ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max number of threads [3796] for user [es] is too low, increase to at least [4096]
[3]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

1:ElasticSearch進程的最大文件描述符,2:es最大線程個數低,3:這兩個什么狗屁配置至少要配置一個。一個個來。首先切換到root賬號

(1)設置最大文件描述符,我們查看下現在是多少?

[root@localhost elasticsearch]# ulimit -Hn
4096
[root@localhost elasticsearch]# ulimit -Sn
1024

可以看到默認硬資源限制是 4096,軟資源限制是 1024,這兩個啥意思?

#硬限制是指對資源節點和數據塊的絕對限制,在任何情況下都不允許用戶超過這個限制
ulimit -Hn #硬資源數值 

#軟限制在一定時間范圍內(默認為一周,在/usr/include/sys/fs/ufs_quota.h文件中設置)超過軟限制的額度。
#在硬限制的范圍內繼續申請資源,同時系統會在用戶登錄時給出警告信息和仍可繼續申請資源剩余時間
#超過期限則不允許再申請資源
ulimit -Sn #軟資源數值

#所以軟資源限制數目不能超過硬資源限制

編輯 /etc/security/limits.conf文件:加入以下到文件開頭:

* soft nofile 65536
* hard nofile 65536

我這里的配置

加入后重新登錄有效,也就是把當前的終端關了,再進去,可以用上面兩個命令查下,已經改過來了。接着看下一個

(2)最大線程個數,查看一下當前是多少?

[es@localhost elasticsearch]$ ulimit -Hu #單個用戶可用的最大進程數量(硬限制)
3796
[es@localhost elasticsearch]$ ulimit -Su #單個用戶可用的最大進程數量(軟限制)
3796

還是修改 /etc/security/limits.conf文件,添加:

* soft nproc 4096
* hard nproc 4096

重新登錄生效

(3)the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

編輯文件:

vi config/elasticsearch.yml

這里有兩個節點,node-1,node-2,錯誤說必須打開一個,這里我們就打開node-1,表示集群必須信任某個節點,哪怕是本機。

img

然后切換到se用戶,再運行一下:

又報一個錯誤:

[root@bogon elasticsearch]# ./bin/elasticsearch -d
Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.

這個只是一個

警告,看不出來啥問題,

這個警告TM很容易誤解,讓人一直以為是jdk版本問題。

為了在屏幕看完整的信息,這里啟動的時候不加-d 后台啟動,看看到底什么鬼問題:

ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

果然問題出來了:這段報錯的意思是:最大虛擬內存區域vm.max_map_count只有65530,太低,至少增加到[262144]

切入到root賬號,我們查看一下:

sysctl -a|grep vm.max_map_count

果然是啊

改吧,繼續改,修改/etc/sysctl.conf文件最后添加一行:

vm.max_map_count=262144

這樣是永久修改!然后執行載入生效命令:

sysctl -p 

好,切入到es賬號,再啟動,終於可以了!瀏覽器訪問一下:

img大功告成,外面可以訪問了!

基本概念和命令

1:基本概念:es本質上是一個分布式文件數據庫,允許多台服務器協同工作,每台服務器可以運行多個 Elastic 實例。單個 Elastic 實例稱為一個節點(node)。一組節點構成一個集群(cluster);

Elasticsearch集群可以包含多個索引(相當於mysqlindices)(數據庫),每一個索引可以包含多個類型(types)(相當於mysql表),每一個類型包含多個文檔(documents)(行),然后每個文檔包含多個字段(Fields)(列)。

注意:類型types(相當於mysql表)在6.0以后一個索引下只能有一個type,7.0以后不建議用type類型,8.0開始正式拋棄

2:cat命令:

cat提供了查詢集群狀態的api,可以通過 curl -XGET localhost:9200/_cat 獲取所有cat操作

[root@localhost elasticsearch]# curl -XGET localhost:9200/_cat
=^.^=
/_cat/allocation       #節點分配情況
/_cat/shards           #分片情況
/_cat/shards/{index}  
/_cat/master           #主節點
/_cat/nodes            #所有節點
/_cat/tasks
/_cat/indices          #所有索引列表
/_cat/indices/{index}
/_cat/segments         #索引分片信息
/_cat/segments/{index}
/_cat/count            #文檔個數
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health           #集群運行狀況
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates

這些命令后面加上?v,格式化輸出,也可以加上?help查看命令相關幫助信息

比如查詢所有的節點:

[root@localhost usr]# curl -XGET 'http://localhost:9200/_cat/nodes?v' #?v 格式化輸出
ip             heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.17.160           11          92   0    0.11    0.07     0.05 dim       *      localhost.localdomain

查看所有索引:

curl -XGET 'http://localhost:9200/_cat/indices?v'

返回:

health status index uuid pri rep docs.count docs.deleted store.size pri.store.size

表示還未有任何索引

查看集群狀態是否正常:

curl -XGET localhost:9200/_cat/health?v

green 綠色表示一切正常

綠色——正常。黃色——所有主分片shard可用,部分副本分片replica不可用。紅色——部分主分片shard不可用。

詳細的后面結合例子理解!

配置用戶名和密碼

[elastic@console bin]$ vim ../config/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

添加密碼:

[elastic@console bin]$ ./elasticsearch-setup-passwords interactive
future versions of Elasticsearch will require Java 11; your Java version from [/usr/java/jdk1.8.0_181/jre] does not meet this requirement
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]:
Reenter password for [elastic]:
Passwords do not match.
Try again.
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana]:
Reenter password for [kibana]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]

數據交互

數據交互有兩種:

1:java api:java代碼調用es的API方式,默認端口:9300

2:RESTful API:基於http協議,任何語言都可以交互,我們就用這種。默認端口:9200

語法:curl -X[VERB] '[PROTOCOL]://[HOST]/[PATH]?[QUERY_STRING]' -d '[BODY]'

******************************************************************************************
VERB HTTP方法: GET  ,  POST  ,  PUT  ,  HEAD  ,  DELETE
PROTOCOL http或者https協議(只有在Elasticsearch前面有https代理的時候可用)
HOST Elasticsearch集群中的任何一個節點的主機名,如果是在本地的節點,那么就叫localhost
PORT Elasticsearch HTTP服務所在的端口,默認為9200
QUERY_STRING 一些可選的查詢請求參數,例如 ?pretty  參數將使請求返回更加美觀易讀的JSON數據
BODY 一個JSON格式的請求主體(如果請求需要的話)
******************************************************************************************

3:小試身手,搞個例子

curl -H "Content-Type: application/json" -XPUT 'localhost:9200/shcool/student/1' -d '
{
"name" : "李小龍",
"age" : 25,
"about" : "他是個偉大的武術家"
}'

我們准備執行一下這個命令,看看這個命令是什么意思:

curl:linux命令,可以發送HTTP請求,

-H:-H "Content-Type: application/json":代表head頭,表示數據為json格式(新版本需要加這個)

-XPUT:-XPUT 是一個 PUT 請求,-PUT:其實是GET請求,所以必須加-X

shcool:索引名稱(相當於mysql的數據庫)

student:類型(相當於mysql中的表)

紅色的 1 :表示ID,-XPUT必須寫id,可以為string,如果不寫必須用 -XPOST,這樣表示自增,系統自動分配隨機字符串

-d:表示要發送的數據

json數據:必須用單引號括號起來,否則格式不對,比如上面大括號外面的單引號

好了,現在執行一下!返回:

{
    "_index": "shcool", //索引名
    "_type": "student", //類型名
    "_id": "1",  //該條數據id
    "_version": 1, //第一次創建一個document的時候,_version內部的版本號為1,以后每次寫操作都會加1
    "result": "created", //result:結果,created:創建成功
    "_shards": {
        "total": 2, 
        "successful": 1, 
        "failed": 0
    }, 
    "_seq_no": 0, 
    "_primary_term": 1
}

更多參數介紹:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/docs-index_.html

上面這串命令干了什么?

建立了名為:shcool的索引,在該索引下創建了名為:student的類型,然后往該類型中添加了一條數據(文檔),發現這和mysql不一樣,mysql添加數據必須要先建個數據庫,表。而這里如果沒有該數據庫和表,es會自動建立。

確認一下這個索引是否存在:

[root@bogon ~]# curl -XGET 'http://localhost:9200/_cat/indices?v'
health status index  uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   shcool -wSnblotSEWb6XyvTEA5QQ   1   1          1            0      4.5kb          4.5kb

索引果然有了!

再查看一下索引下的type(類型):

[root@bogon ~]# curl -XGET 'http://localhost:9200/shcool/_mapping?pretty=true'
{
  "shcool" : {
    "mappings" : {
      "properties" : {
        "about" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "age" : {
          "type" : "long"
        },
        "name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}

?pretty=true

參數是格式化json數據,不然堆在一起很難看。這里可以發現有about,name,age,三個字段,但是有個問題,為什么沒有type名字?我們當時添加數據的時候,type:student。

因為6.0以后一個索引下只能有一個type,7.0以后不建議用type類型,8.0開始正式拋棄。

繼續,查詢一下shcool索引下是否有數據:

[root@bogon ~]# curl -XGET 'localhost:9200/shcool/student/_search?pretty=true'
{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "shcool",
        "_type" : "student",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "name" : "李小龍",
          "age" : 25,
          "about" : "他是個偉大的武術家"
        }
      }
    ]
  }
}

_search:返回全部數據,默認返回前面10條,因為type是計划拋棄的,所以7.0以后可以不帶這個type,所以上面的命令也可以這樣寫:

curl -XGET 'localhost:9200/shcool/_search?pretty=true'

這里只帶了索引!

用POST發送一下,POST發送的時候,不用帶ID,es自己分配一個字符串ID

curl -H "Content-Type: application/json" -XPOST 'localhost:9200/shcool/student' -d '
{
"name" : "甄子丹",
"age" : 25,
"about" : "他是個偉大的功夫明星"
}'

返回:

{
	"_index": "shcool",
	"_type": "student",
	"_id": "QRoP22wBkRiy3LLk_GC3", //es自己生成的字符串ID
	"_version": 1,
	"result": "created",
	"_shards": {
		"total": 2,
		"successful": 1,
		"failed": 0
	},
	"_seq_no": 1,
	"_primary_term": 1
}

API操作

官網文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html

1:索引操作:

(1);創建索引:發送:PUT 請求

curl -XPUT 'localhost:9200/goods' //創建名為:goods的索引,索引名稱只能小寫,7.0之前的索引可能包含冒號(:),但已被棄用,7.0+不支持

(2):刪除索引:發送:DELETE 請求

curl -XDELETE 'localhost:9200/goods' //刪除索引:goods

(3):查看索引,發送:GET請求

curl -XGET 'localhost:9200/goods' //查看索引:goods

更多索引操作查看官方文檔

2:文檔操作

(1)寫入操作:

將JSON文檔添加到指定的索引並使其可搜索。如果文檔已存在,則更新文檔並增加其版本。
請求:

PUT //_doc/<_id> //創建,必須帶ID 如果有相同文檔,更新
POST //_doc/ //創建,系統自動分配string id 如果有相同文檔,更新
PUT //_create/<_id> //創建,必須帶ID,如果有相同文檔 創建失敗
POST //_create/<_id> //創建,系統自動分配string id 如果有相同文檔 創建失敗
DELETE //_doc/<_id> //刪除文檔

因為type未來會放棄,所以7.X版本不需要創建type,這里的_doc,_create:相當於以前的type

創建一條:

curl -H "Content-Type: application/json" -XPUT 'localhost:9200/goods/_doc/1' -d '
{
"name" : "甄子丹",
"age" : 25,
"about" : "他是個偉大的功夫明星"
}'

這和我們小試身手那個例子基本是一樣的,唯一不同的地方,我們這里沒有type,注意紅色部分,最開始的那個例子紅色部分是:student類型。為什么不用類型?前面已經提過多次。

(2):讀取操作,檢索文檔數據

基本檢索:

curl -XGET 'localhost:9200/goods/_doc/_search' //全部
curl -XGET 'localhost:9200/goods/_doc/1' #檢索 索引goods 下ID為1
curl -i -XHEAD 'localhost:9200/goods/_doc/1' #檢索 索引goods 下ID為1s是否存在,必須加-i

組合檢索:

1):from,size
控制查詢返回的數量,相當於mysql 里面的limit
from:返回位置
size:定義返回最大的結果數

curl -H "Content-Type: application/json" -XGET 'localhost:9200/goods/_doc/_search?pretty=true' -d '
{
 "from" : 0, "size" : 2
}'

注意:

新版本es,必須要帶head頭部:-H "Content-Type: application/json",?pretty=true:格式化json

2):Match 查詢:

match會給字段提供合適的分析器,相當於mysql的模糊查詢,term相當於精確查詢

https://www.elastic.co/guide/en/elasticsearch/reference/7.3/query-dsl-match-query.html

查詢 goods 索引,字段:name 為:李小 的數據,下面兩個寫法一樣

curl -H "Content-Type: application/json" -XGET 'localhost:9200/goods/_doc/_search?pretty=true' -d '
{
    "query": {
        "match" : {
            "name" : {
                "query" : "李小"
            }
        }
    }
}'


curl -H "Content-Type: application/json" -XGET 'localhost:9200/goods/_doc/_search?pretty=true' -d '
{
   "query" : { "match" : { "name" : "李小" }}
}'

搜索字段name = 李 or name = 甄;中間空格即可 or

curl -H "Content-Type: application/json" -XGET 'localhost:9200/goods/_doc/_search?pretty=true' -d '
{
   "query" : { "match" : { "name" : "李 甄" }}
}'

這樣也可以:

curl -H "Content-Type: application/json" -XGET 'localhost:9200/goods/_doc/_search?pretty=true' -d '
{
    "query": {
        "match" : {
            "name" : {
                "query" : "李 甄",
		"operator" : "or"
            }
        }
    }
}'

搜索字段

name = 李 and name = 甄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM