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参数时
GET /_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": "" # 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
lucene查询语法
*文本搜索 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": ["",""]
}}}
- 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 嵌套类型的查询
PUT 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 嵌套类型的查询