elasticsearch查询语句
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 嵌套类型的查询
elasticsearch查询语句的更多相关文章
- Func<T,T>应用之Elasticsearch查询语句构造器的开发
前言 之前项目中做Elasticsearch相关开发的时候,虽然借助了第三方的组件PlainElastic.Net,但是由于当时不熟悉用法,而选择了自己拼接查询语句.例如: string queryG ...
- elasticsearch查询语句总结
query 和 filter 的区别请看:https://www.cnblogs.com/bainianminguo/articles/10396956.html Filter DSL term 过 ...
- SpringBoot使用注解的方式构建Elasticsearch查询语句,实现多条件的复杂查询
背景&痛点 通过ES进行查询,如果需要新增查询条件,则每次都需要进行硬编码,然后实现对应的查询功能.这样不仅开发工作量大,而且如果有多个不同的索引对象需要进行同样的查询,则需要开发多次,代码复 ...
- 常用ElasticSearch 查询语句
为了演示不同类型的 ElasticSearch 的查询,我们将使用书文档信息的集合(有以下字段:title(标题), authors(作者), summary(摘要), publish_date(发布 ...
- ElasticSearch 论坛搜索查询语句
概述 研究论坛搜索如何综合时间和TF/IDF权重. 自定义权重计算的效率问题 数据结构 假设有一个论坛的搜索 字段包括: subject:标题 message:内容 dateline:发布时间 tag ...
- ElasticSearch 7.X版本19个常用的查询语句
整理一篇常用的CRUD查询语句,之前这篇文件是在17年左右发表的,从英文翻译过来,现在采用7.x 版本进行实验,弃用的功能或者参数,我这边会进行更新,一起来学习吧. 为了演示不同类型的 Elastic ...
- elasticsearch 查询(match和term)
elasticsearch 查询(match和term) es中的查询请求有两种方式,一种是简易版的查询,另外一种是使用JSON完整的请求体,叫做结构化查询(DSL). 由于DSL查询更为直观也更为简 ...
- Elasticsearch 查询与过滤
今天在给上级汇报工作的时候,被问到了这个问题,一时也没回到上来. 英文原文: https://www.elastic.co/guide/en/elasticsearch/guide/current/_ ...
- ElasticSearch查询 第五篇:布尔查询
布尔查询是最常用的组合查询,不仅将多个查询条件组合在一起,并且将查询的结果和结果的评分组合在一起.当查询条件是多个表达式的组合时,布尔查询非常有用,实际上,布尔查询把多个子查询组合(combine)成 ...
随机推荐
- Python3基础 dict 推导式 生成10以内+奇数的值为True 偶数为False的字典
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- BottomNavigationBar 底部导航控件
BottomNavigationBar 底部导航控件 属性 说明BottomNavigationBarItem 多个 item,iconSize icon大小currentIndex 默认选中第几个o ...
- openwrt中在软件包中定义PKG_INSTALL将会发生什么?
答: 将会使用默认软件包安装方式,相关代码如下 . 在include/package.mk中: Build/Install=$(if $(PKG_INSTALL),$(call Build/Insta ...
- ubuntu安装微软雅黑和Consolas字体
原文:http://fooler5.iteye.com/blog/2406227 [字体下载] YaHeiConsolas.tar:http://www.mycode.net.cn/wp-conten ...
- 最后一次谈 VirtualBox的安装方法
用 VirtualBox....run 或 .rpm安装都可以, 最重要的是要 用 /usr/sbin/vboxconfig -> vboxdrv.sh --> 去创建 VirutalBo ...
- Nacos整合Spring Cloud Gateway实践
Spring Cloud Gateway官网:http://spring.io/projects/spring-cloud-gateway Eureka1.0的问题和Nacos对比:https://w ...
- 卸载linux系统上自带的mysql
步骤: 1.打开centos命令提示符,切换为root用户 2.输入rpm -qa|grep -i mysql命令以检查系统含有的mysql插件,回车,若没有则说明无自带mysql,系统很干净.若有显 ...
- C# DataTable.Compute()用法
DataTable.Compute()用法 2010-04-07 11:28 一.DataTable.Compute()方法說明如下 作用: 计算用来传递筛选条件的当前行上的给定表达 ...
- 《操作系统_FCFS和SJF》
先来先服务FCFS和短作业优先SJF进程调度 转自:https://blog.csdn.net/qq_34374664/article/details/73231072 一.概念介绍和案例解析 FCF ...
- FICO年终完全手册
FICO年终完全手册 一:系统增加配置部分 1,FBN1增加凭证号码范围,OBH2维护会计凭证号码到新的会计年度 2,KS13检查成本中心的有效期 3,KA23检查成本要素的有效期 4,KL03检查作 ...