1,安裝es
安裝java環境
# java --version
java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
安裝es 官網:https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md # sudo yum install elasticsearch
2,es配置文件
elasticsearch.yml 配置Elasticsearch
# cat /etc/elasticsearch/elasticsearch.yml |grep -v ^# cluster.name: escluster #集群名稱 node.name: ${HOSTNAME} #節點名稱 path.data: /data/es-data/ #數據存儲路徑 path.logs: /var/log/elasticsearch #日志文件路徑 network.host: _eth0_ # 節點要綁定的地址 http.port: 9200 # 接受http請求的端口 transport.tcp.port: 9300 # 集群節點之間通信的端口 transport.tcp.compress: true discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"] #要加入集群的節點,如果沒指定端口默認為transport.tcp.port discovery.zen.minimum_master_nodes: 1 #默認1,必須要合理設置。避免網絡故障時腦裂將集群拆分成獨立集群(master_eligible_nodes/2)+1.假如有3個節點符合則設置為2. bootstrap.memory_lock: true # 鎖定進程的內存空間,防止es內存被交換出去。 xpack.security.enabled: false xpack.monitoring.enabled: true
除此之外還有一些重要的配置。es調優的時候經常用到。
文件描述符
- .zip .tar包安裝的。
# ulimit -n 65536 或者 # vim /etc/security/limits.conf elasticsearch - nofile 65536
- rpm包的已經將文件描述符最大數量默認為65536無需更改。
可以通過 GET _nodes/stats/process?filter_path=**.max_file_descriptors 來檢查。
禁用交換分區
- # sudo swapoff -a
- # /etc/sysctl.conf 添加vm.swappiness=1
- # 在elasticsearch.yml配置 bootstrap.memory_lock: true 鎖定進程地址空間,防止es內存被交換出去。
可以用curl -X GET "localhost:9200/_nodes?filter_path=**.mlockall" 來查看。如果"mlockall": false說明請求失敗。日志里面還會有警告信息:memory locking requested for elasticsearch process but memory is not locked。可能是因為運行es的用戶沒有鎖定內存的權限。
解決方法:
-
- 如果es是用tar或者zip包安裝的
#ulimit -l unlimited,或者 # /etc/security/limits.conf添加 elasticsearch - nofile 65536
- 如果es是用tar或者zip包安裝的
-
- rpm包安裝的
在/usr/lib/systemd/system/elasticsearch.service文件中,或者添加一個/etc/systemd/system/elasticsearch.service.d/override.conf文件 [Service] LimitMEMLOCK=infinity # sudo systemctl daemon-reload
- rpm包安裝的
虛擬內存
-
# sysctl -w vm.max_map_count = 262144 或者是 # vim /etc/sysctl.conf vm.max_map_count=262144 # sysctl vm.max_map_count # rpm包已經自動配置,無需配置。
jvm.options 配置es的jvm
-Xms256m
-Xmx256m
3,架構
filebeat--> kafka --> logstash --> elasticsearch --> kibana
filebeat收集日志傳給kafka-->logstash input作為消費者消費kafka的數據 -->logstash output將input的內容傳給es --> kibana上添加新索引
4,Restful API
Elasticsearch支持使用RESTful API,可以使用RESTful API來進行增加文檔,刪除文檔等操作,也可以用於查詢。
可以直接使用 kibana的 DevTools來發送restful請求,進行增刪改查操作。

es 查詢語句
URI Search
參數有q, analyzer,_source,sort,from,size等
- q
GET my_index/doc/_search?q=quick GET my_index*/_search?q=title:quick GET _search?q=user:ketty GET _all/_search?q=user:ketty
Request body search
- query
GET test_index/_search { "query": { "term": { "age": { "value": "22" }}}}
- from/size
GET test_index/_search { "from": 0, #第一個結果的偏移量,第0頁 from默認為0 "size": 1, # 最大命中個數 , 1條數據 size 默認為10 "query": { "term": { "name": { "value": "ketty" }}}}
- sort
-
GET test_index/_search { "query": { #先過濾出含有ketty的name字段 "term": { "name": { "value": "ketty" } } }, "sort": [ #后對這些字段排序 { "age": { "order": "desc" #desc 倒序 asc 順序 }}}}
- source filtering
默認會返回_source 所有字段的內容。
-
# "_source": false 關閉 # "_source": "fieldname" # "_source": "obj.*" 可接受通配符 GET test_index/_search { "_source": { "excludes": "content", "includes": "name" }, "query": { "term": { "content": { "value": "hello" }}}}
query DSL
- query and filter context
查詢上下文:文檔匹不匹配這個查詢,相關度高嗎。是在query進行查詢是的執行環境
過濾器上下文:文檔匹不匹配。 不考慮相關性算分,和返回的排序問題。使用filter參數時
-
View CodeGET /_search { "query": { #查詢上下文 "bool": { "must": [ #兩個match在查詢上下文中 { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ # 過濾器上下文 { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] # term,range在過濾器上下文中,會過濾掉不匹配的,但不會影響算分 } } }
- match_all query
GET test_index/_search { "query": { "match_all": {} } }
- full-context queries
- match query
-
-
GET test_index/_search
{ "query": { "match": { "content": { "query": "hello ketty", "operator": "and" # 默認是or) 匹配出content字段中同時含有hello和ketty單詞的文檔 }}}}#模糊查詢 fuzziness GET test_index/_search { "query": { "match": { "content": { "query": "test tontent", "fuzziness": 1 # "fuzziness":"auto" 自動根據字段值長度編輯距離 }}}}
-
- match_phrase 匹配短語
-
-
GET test_index/_search { "query": { "match_phrase": { "content": { "query": "test content" # 如果使用match,會匹配帶有test,content,test content的文檔 }}}}
# "slop":"2" "content test" 這個順序 也可以匹配
# "analyzer": "my_analyzer" 可以指定分詞器
-
-
- match_phrase_prefix 匹配短語前綴
-
PUT test_index/doc/6 { "name":"fox", "message":"quick brown fox." } GET test_index/doc/_search { "query": { "match_phrase_prefix": { "message": { "query": "quick brown f", "max_expansions": "2" # max_expansions 控制將要擴展的后綴數量 } }}}
- multi_match 多字段
-
GET test_index/_search { "query": { "multi_match": { "query": "hello", "fields": ["message","conte*"] #可以使用通配符 } } }
- query_string
-
#### deafult_field 指定字段,如果不指定默認字段會查詢索引中的所有字段
GET test_index/_search
{
"profile":true, #查看執行過程
"query": {
"query_string": {
"default_field": "message",
"query": "fox AND (white OR brown)" #匹配到 "slow white fox" 和 "quick brown fox"
}}}### fields 多字段查詢
GET test_index/_search { "query": { "query_string": { "fields": ["message","content"], "query": "brown AND fox" }}}
等同於 -->{
"query": {
"query_string": {
"query": "(message:brown OR content:brown) AND (message:fox OR content:fox)"
}}}#返回結果
"_source": {"message": "quick brown fox." }}]也可以在字段名中使用通配符,例如:GET test_index/_search
{
"query": {
"query_string": {
"fields": ["messa*"], #使用通配符匹配字段名
"query": "brown AND fox"
}}}} 等同於----》GET test_index/_search
{
"query": {
"query_string": {
"query": "messag\\*:(brown AND fox)" #將字段名寫在query string里面。轉義*
}}}# 由於\是json字符串中的特殊字符,因此需要用\進行轉義,因此上面的兩個反斜杠。
# 返回結果:
"_source": {"message": "quick brown fox." }}]
# query string syntax字段名 例如:
status:active
title:(quick OR brown)等同於 title:(quick brown) titile字段中含有quick或者brown
author:"John Smith" author字段中包含John Smith短語的
book.\*:(quick brown) 字段名為book.title,book.cotent之類的字段名包含quick或者brown
_exists_:title title字段中有非null值通配符 ? *
qu?ck bro* 能匹配quick或者bro*GET test_index/_search
{
"query": {
"query_string": {
"query": "name:ket*" #匹配到ketty kety
}}}正則表達式 可以通過包裝在/中嵌入query string中
GET test_index/_search
{
"query": {
"query_string": {
"query": "name:/k.*y/" #可以匹配name中包含ketty,kety等文檔
}}}
模糊查詢 ~1 ~2 默認編輯距離為2
GET test_index/_search
{
"query": {
"query_string": {
"query": "mess\\*:(quikc~1)" #可以匹配quick
}}}接近查詢 指定短語中最大編輯距離 "fox quick"~5 可以匹配"quick brown fox"
范圍查詢 [] 包含范圍 {} 排他范圍 [} {]
date:[2018-01-01 TO 2018-07-03]
count: [10 TO *] 大於等於10
age:[1 TO 5} 大於等於1 小於5
age: >10
age: <=5
GET test_index/_search
{
"query": {
"query_string": {
"query": "age:[18 TO 24}" #大於等於18 小於24
}}}Boosting ^ 使一個術語比另一個術語更相關 默認值是1 quick^2 fox
布爾運算符
+ 必須存在
- 必須不存在
&& AND
|| OR
! NOTGET test_index/_search
{
"query": {
"query_string": {
"query": "name:(!ketty)"
}}}分組 (quick OR brown) AND fox
保留字符 某些特殊字符需要用反斜杠轉義: + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /
<> 無法轉義
例如:要查詢(1+1)=2 寫成 \(1\+1\)\=2
-
-
- lucene query syntax
View Codelucene查詢語法 自由文本搜索 safari 表示搜索所有字段的safari 特定字段中搜索值 status:200 搜索多個值 status:[400 TO 499] 布爾 AND,OR,NOT。要查找4XX狀態碼並且擴展名php或html status:[400 TO 499] AND (extension:php OR extension:html) Lucene 支持轉義特殊字符 + - && || ! ( ) { } [ ] ^ " ~ * ? : \ 這些需要在字符前使用\轉義。 例如搜索(1+1):2 需要寫成\(1\+1\)\:2 terms 單個term: 搜索單個單詞例如"test"或者"hello" 短語查詢:用雙引號括起來一組單詞 "hello world" 多個術語可以和布爾運算符組合起來 fields 可以指定字段 也可以使用默認字段 字段名:術語 例如 title:Do it right 在title中搜索Do,在默認字段中搜索it和right 通配符 支持?和*通配符 (不能用在短語查詢中) ? 單個字符 te?t 匹配 test text等 * 多字符 test* 匹配 test,tests,tester等 注意:不能用?或*作為搜索的第一個字符 模糊匹配 roam~1 range范圍查詢 []包含首尾 {}不包含首尾 mod_date:[20170101 TO 20180606] 字段值在>=20170101 <=20180606的文檔 title:{Aida TO Carmen} 文件標題介於Aida Carmen之間但不包含Aida,Carmen 布爾運算符 AND OR NOT 必須大寫否則查不出來哦 AND &&可替代AND OR || 可以替代OR 要搜索包含 apache或者nginx的文檔,可用查詢 apache nginx 或者是 apache OR nginx + 必須包含該字段值 例如 +jakarta lucene 表示必須包含jakarta可能包含lucene的文檔 NOT - 可代替NOT 必須不包含 分組 用括號將子句分組為子查詢。 (jakarta OR apache) AND website 有website 可能有jakarta或apache Field 分組 使用括號將多個字句分組到單個字段 title:(+return +"pink panther") 搜索title字段包含單詞return和短語"pink panther"的 轉義 特殊字符需要轉義 + - && || ! ( ) { } [ ] ^ " ~ * ? : \ 搜索(1+1):2 應該使用 \(1\+1\)\:2
- kuery
加引號是短語搜索。 message:"Quick brown fox" 將搜索短語 ,不加引號將字段先分詞再查詢,可以匹配到brown quick fox 多個搜索項必須由布爾運算符分割。布爾運算符不區分大小寫 and or not response:200 extension:php 將寫成 response:200 and extension:php 默認情況下 and優先級高於or 可以用括號( )分組覆蓋優先級 單個字段搜索多個值 response:(200 or 400) 范圍。 變為:bytes>1000。在 lucene里面是 bytes:>100 >,>=,<,<= 存在的查詢。response:* 表示存在字段 通配符。machine: win* 通配符 可以匹配win7 win10等 machine.os*: win* 。使用的是es里面的復合查詢 在kibana搜索條里面使用kuery source : /ubox/logs/test* 使用lucene source : \/ubox\/logs\/test*
- lucene query syntax
- simple_query_string
-
與常規的query_string不同,simple_query_string永遠不會拋異常,並丟棄查詢的無效部分
simple_query_string支持的特殊字符有:+ | - " * (AND) ~N在單詞后 ~N在短語后 搜索這些特殊字符需轉義
-
-
GET test_index/_search { "query": { "simple_query_string": { "query": "(test content) | fox + white", # 匹配到一條 "message": "slow white fox." "fields": ["content","mess*"], "default_operator": "AND" }}}
# +AND |OR -否定 *在末尾表示前綴查詢
-
- Term level queries
- term
#區別於match。 term不會對查詢語句做分詞,而是將查詢語句作為整個單詞 GET test_index/_search { "query": { "term": { "message": { "value": "test message" #無法匹配到"this is a test message" }}}} GET test_index/_search { "query": { "match": { "message": "test alkdfj" #可以匹配"this is a test message" }}}
- terms 查詢多個單詞
GET test_index/_search { "query": { "terms": { "message": [ "test", "message" ]}}}
- range 范圍查詢
GET test_index/_search { "query": { "range": { "age": { "gte": 10, # gte 大於等於 ,gt 大於 "lte": 20 # lte 小於等於, lt 小於 }}}} #按時間的range GET /_search { "query": { "range": { "@timestamp": { "gte": "now-1h/d", # -1h:減去1小時, /d:向下舍入到UTC 00:00 "lte": "now" }}}}
- term
- exists 字段存在
GET test_index/_search { "query": { "exists":{ "field":"name" }}}
- prefix 前綴查詢
GET test_index/_search { "query": { "prefix": { "name": { "value": "ket" }}}}
- wildcard 通配符查詢
GET test_index/_search { "query": { "wildcard": { "name": { "value": "ke*y" }}}}
- regexp 正則表達式查詢
GET test_index/_search { "query": { "regexp":{ "name":"k.*y" }}}
- fuzzy 模糊查詢
GET test_index/_search { "query": { "fuzzy": { "name":{ "value": "ket", "fuzziness": 2 #fuzziness 最大編輯距離 }}}}
-
- type
-
GET _search { "query": { "type":{ "value":"my_type" }}}
- ids
GET _search { "query": { "ids": { "type": "my_type", "values": ["1","2"] }}}
- compoud queries 復合查詢
- constant_score
GET _search { "query": { "constant_score": { "filter": { # filter語句在過濾器上下文中 得分被忽略 "term": { "name": "ketty" } }, "boost": 1.2 #設定boost的值 }}}
- bool
bool查詢由一個或多個子句構建,每個子句都有一個類型. 類型有:must,must not,should,filter
-
GET nginx-access-log-2018.06.03/_search { "query": { "bool": { "must": [ {"match":{ "source":"/ubox/logs/budd/access.log" }}, {"range":{ "@timestamp":{ "gte":"2018-06-03T00:00:00.000", "lte":"2018-06-03T02:00:00.000" } }}, {"regexp":{ "url_path":"/sync/vmSkin.*" }} ] }}}
- joining queries
- nested 嵌套類型的查詢
View CodePUT test_index { "mappings": { "doc": { "properties": { "man":{ #設置man字段為嵌套類型 "type": "nested", "properties": { "age":{ "type":"integer" }, "name":{ "type":"text" }}}}}}}} PUT test_index/doc/1 { "man":[ { "name":"alice white", "age":34 }, { "name":"peter brown", "age":26 } ] } GET test_index/_search #查詢語句 { "query": { "nested": { #關鍵字 "path": "man", #嵌套字段 "query": { "match": { "man.name": "peter" #子字段 } } } } }
- has_child
- has_parent
- nested 嵌套類型的查詢
