大家好,又见面了,我是你们的朋友全栈君。
欢迎关注“程序杂货铺”公众号,里面有精彩内容,欢迎大家收看^_^
Elasticsearch-JSON查询总结
一.数据模型
(1) 索引定义:
INDEX:POC
TYPE:zabbixmetadata
(2) 数据实体:
ID:自增主键
ID:ID值
VALUE_DAY:该机器当天的值
GROUPNAME:组名
TYPE_MACHINE:机器类型
DATE:日期
TYPE:类型
(3)数据示例:
二.JSON查询
1.单个变量的查询
POST poc/zabbixmetadata/_search
{
"query" : {
"match" : {
"GROUPNAME" : "压力测试"
}
}
}
注:做精确匹配搜索时,最好用过滤语句,因为过滤语句可以缓存数据。
2.过滤器查询
POST poc/zabbixmetadata/_search
{
"size": 100,
"query": {
"filtered": {
"filter": {
"range": {
"VALUE_DAY": {
"gt": 30,
"lt": 100
}
}
},
"query": {
"match": {
"GROUPNAME": "压力测试"
}
}
}
}
}
gt : > 大于
lt : < 小于
gte : >= 大于或等于
lte : <= 小于或等于
注:字符串范围适用于一个基数较小的字段,一个唯一短语个数较少的字段.你的唯一短语数越多,搜索就越慢。
过滤顺序:更详细的过滤条件应该被放置在其他过滤器之前,以便在更早的排除更多的文档。缓存的过滤器非常快,所以它们需要被放在不能缓存的过滤器之前。
例如:
GET/logs/2014-01/_search{
"query": {
"filtered": {
"filter": {
"range": {
"timestamp": {
"gt": "now-1h"
}
}
}
}
}
}
这个过滤条件没有被缓存,因为它使用了 now 方法,这个值每毫秒都在变化。这意味着我们需要每次执行这条查询时都检测一整个月的日志事件。
我们可以通过组合一个缓存的过滤器来让这变得更有效率:我们可以添加一个含固定时间的过滤器来排除掉这个月的大部分数据,例如昨晚凌晨:
[
"bool": {
"must": [
{
"range": {
"timestamp": {
"gt": "now-1h/d" <1>
}
}
},
{
"range": {
"timestamp": {
"gt": "now-1h" <2>
}
}
}
]
}
]
<1> 这个过滤器被缓存了,因为它使用了取整到昨夜凌晨 now 条件.
<2> 这个过滤器没有被缓存,因为它没有对 now 取整.
now-1h/d 条件取整到昨夜凌晨,所以所有今天之前的文档都被排除掉了。这个结果的字节集被缓存了,因为now被取整了,意味着它只需要每天当昨夜凌晨的值改变时被执行一次。now-1h条件没有被缓存,因为now表示最近一毫秒的时间。然而,得益于第一个过滤器,第二个过滤器只需要检测当天的文档就行。
上面的实现能正常工作是因为自从昨晚凌晨条件比最近一小时条件位置更前。假如它们用别的方式组合,那么最近一小时条件还是需要检测所有的文档,而不仅仅是昨夜以来的文档。
3.全文搜索
POST poc/zabbixmetadata/_search
{
"size": 100,
"query": {
"match": {
"TYPE_MACHINE": "物理机"
}
}
}
4.短语搜索
POST poc/zabbixmetadata/_search
{
"size": 100,
"query": {
"match_phrase": {
"TYPE_MACHINE": "物理机"
}
}
}
5.聚合查询
POST poc/zabbixmetadata/_search
{
"size": 100,
"aggs": {
"avg_VALUE_DAY": {
"avg": {
"field": "VALUE_DAY"
}
}
},
"query": {
"bool": {
"must": [
{
"match": {
"GROUPNAME": "压力测试"
}
},
{
"match": {
"TYPE": "cpu"
}
},
{
"match": {
"TYPE_MACHINE": "物理机-标准OS"
}
}
]
}
}
}
6.多属性查询
bool 过滤可以用来合并多个过滤条件查询结果的布尔逻辑,它包含一下操作符:
must:多个查询条件的完全匹配,相当于and;
must_not:多个查询条件的相反匹配,相当于not;
should:至少有一个查询条件匹配,相当于or.
POST poc/zabbixmetadata/_search
{
"size": 100,
"query": {
"bool": {
"must": [
{
"match": {
"GROUPNAME": "压力测试"
}
},
{
"match": {
"TYPE": "cpu"
}
},
{
"match": {
"TYPE_MACHINE": "物理机-标准OS"
}
}
]
}
}
}
7.集群健康
GET /_cluster/health
green 所有主要分片和复制分片都可用
yellow 所有主要分片可用,但不是所有复制分片都可用
red 不是所有的主要分片都可用
8.检查文档是否存在
curl -i -XHEAD http://192.168.52.130:9200/poc/zabbixmetadata/?pretty
文档存在:返回 200 OK
文档不存在:返回 404 Not Found
9.查询type的mapping映射
GET poc/zabbixmetadata/_mapping
string类型字段默认值是analyzed;如果我们想映射字段为确切值,我们需要设置它为not_analyzed.
analyzed 首先分析这个字符串,然后索引.换言之,以全文形式索引此字段.若该字段为analyzed会对其分词,这样使用条件查询时无法得到与字段对应的结果;
not_analyzed 索引这个字段,使之可以被搜索,但是索引内容和指定值一样.不分析此字段;
no 不索引这个字段,这个字段不能为搜索到。
注:对analyzed字段进行强制排序会消耗大量内存。
10.批量分页查询
GET poc/zabbixmetadata/_search?search_type=scan&scroll=1m
{
"query": {
"range": {
"DATE": {
"gte": "2017-08-01",
"lt": "2017-09-01"
}
}
},
"size": 1000
}
三.备注
详细程序及数据请浏览:
http://blog.csdn.net/u013473512/article/details/78119326
http://download.csdn.net/download/u013473512/9998225
https://github.com/Emmitte/ElasticSearch
欢迎关注“程序杂货铺”公众号,里面有精彩内容,欢迎大家收看^_^
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138699.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...