参考https://www.cnblogs.com/ghj1976/p/5293250.html也可以看我的印象笔记
term 过滤
term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型):
terms 过滤
terms 跟 term 有点类似,但 terms 允许指定多个匹配条件。 如果某个字段指定了多个值,那么文档需要一起去做匹配:
{
"terms": {
"tag": [ "search", "full_text", "nosql" ] #tag字段对应的值有三种
}
}
exists 和 missing 过滤
exists 和 missing 过滤可以用于查找文档中是否包含指定字段或没有某个字段,类似于SQL语句中的IS_NULL条件.
{
"exists": {
"field": "title"
}
}
range 过滤
range过滤允许我们按照指定范围查找一批数据:
match 匹配查询
bool 查询
bool 查询与 bool 过滤相似,用于合并多个查询子句。不同的是,bool 过滤可以直接给出是否匹配成功, 而bool 查询要计算每一个查询子句的 _score (相关性分值)。
must:: 查询指定文档一定要被包含。
must_not:: 查询指定文档一定不要被包含。
should:: 查询指定文档,有则可以为文档相关性加分。
以下查询将会找到 title 字段中包含 "how to make millions",并且 "tag" 字段没有被标为 spam。 如果有标识为 "starred" 或者发布日期为2014年之前,那么这些匹配的文档将比同类网站等级高:
{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }},
{ "range": { "date": { "gte": "2014-01-01" }}}
]
}
}
#-*-coding:utf-8
import datetime
from elasticsearch import Elasticsearch
# 格式为:2016.7.19 的昨日日期
#yesterday = (datetime.datetime.now() + datetime.timedelta(days = -1)).strftime("%Y.%m.%d")
# 格式为:2016-7-19 的昨日日期
#filter_yesterday = (datetime.datetime.now() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d")
# 格式为:2016.7.18 的前天日期
#before_yesterday = (datetime.datetime.now() + datetime.timedelta(days = -2)).strftime("%Y.%m.%d")
# 请求elasticsearch节点的url
url = "http://ip:9200/"
# 使用的索引,因日期时区问题,所以要指定昨天和前天的索引名
#index_name = "deploy_metrics_pro-{date},deploy_metrics_pro-{b_date}".format(date=yesterday,b_date=before_yesterday)
index_name = "deploy_metrics_pro"
# 实例化Elasticsearch类,并设置超时间为120秒,默认是10秒的,如果数据量很大,时间设置更长一些
es = Elasticsearch(url,timeout=120)
# DSL查询语法,在下面es.search使用
data = {
"size": 10000000, #指定每个分片最大返回的数据量,可根据日志量进行设置
"query" : {
"bool":{
# 指定要匹配的字符,这里是查找所有数据
"must" : {
"term":{'type':'deployment'}
},
"filter":{
"range":{
"start_time_format":{
"gt": "2018-01-29 00:00:00",
"lt": "2018-01-30 00:00:00"
}
},
},
#过滤,指定时间范围,这里设置成昨天0点到24点,代码上||-8h,因为ELK用的是UTC时间,跟北京时间误差8小时,所以要减8小时,这就是日志里的北京时间了
#"filter" : {
# "range" : { "@timestamp" : {
# "gt" : "{date}T00:00:00||-8h".format(date=filter_yesterday),
# "lt" : "{date}T23:59:59||-8h".format(date=filter_yesterday),
# }
# }
#}
}
}
}
# 设置要过滤返回的字段值,要什么字段,就在这里添加,这样可以节约返回的数据量(带宽,内存等)
return_fields = [
'_scroll_id',
'hits.hits._source.timestamp',
'hits.hits._source.@timestamp',
'hits.hits._source.project',
'hits.hits._source.username',
'hits.hits._source.start_time_format',
]
def main():
# 指定search_type="scan"模式,并返回_scroll_id给es.scroll获取数据使用
res = es.search(
index=index_name,
body=data,
search_type="scan",
scroll="1m"
)
scrollId=res["_scroll_id"] # 获取scrollID
response= es.scroll(scroll_id=scrollId, scroll= "1m",filter_path=return_fields,)
print response
#print len(response['hits']['hits']) # 打印获取到的日志数量
# for hit in response['hits']['hits']:
# print hit['_source']
if __name__ == "__main__":
main()