import elasticsearch
from elasticsearch_dsl import Search, MultiSearch # Search-执行一个搜索,MultiSearch-同时执行多个搜索
from elasticsearch_dsl import Q
class settings():
es_host = "192.168.8.190"
port = 9200
timeout = 15000
index = ['pylog-view-*',]
#index = ['pylog-view-2020.12.07','pylog-view-2020.12.08']
es = elasticsearch.Elasticsearch([{'host': settings.es_host, 'port': settings.port}])
# size 指定个数, from_ 指定起始位置,filter_path 可以指定显示的数据
s = Search(using=es, index=settings.index)
# 查询
# s = s.query("match", browser = "小米浏览器"})
# s = s.query("match", ** {"browser": "小米浏览器"})
# s = s.query("match", browser__keyword = "小米浏览器"})
# , Q("term", browser = "华为浏览器")
# q = Q('bool', should=[Q('term', **{"browser.keyword": "小米浏览器"})])
# q = Q('bool', should=[Q('term', **{"browser.keyword": "小米浏览器"}), Q('term', **{"browser.keyword": "华为浏览器"})])
# q = Q('bool', should=[Q('term', browser__keyword = "小米浏览器")])
# s = s.query(q)
# s = s.filter("term", browser__keyword = "小米浏览器")
# s = s.query("match", browser__keyword = "小米浏览器")
# s = s.exclude('terms', browser__keyword=['华为浏览器', "小米浏览器", 'pc', '谷歌浏览器', '谷歌爬虫', '百度app', 'Safari浏览器'])
# 分页切片
#s = s[1:3]
# print(s.count())
# 模糊匹配
"""
1.使用Wildcard Query的通配符进行查询
前提是查询的字段类型是string类型,对应ES中的text,keyword(这种查询方式会慢,查询不进行分词处理)
{
"query": {
"wildcard": {
"msg.keyword": "*爱学*"
}
}
}
2.match_phrase
match_phrase查询首先解析查询字符串来产生一个词条列表。
然后会搜索所有的词条,但只保留包含了所有搜索词条的文档,并且词条的位置要邻接
"""
#s.query("match", browser="华为浏览器").aggs.bucket("browser", "terms", field="browser.keyword").metric("count_browser", "stats", field="browser.")
#s.query("match", browser="华为浏览器").aggs.bucket("pageurl", "terms", field="pageurl.keyword").bucket('browser', 'terms', field='browser.keyword')
#s.aggs.bucket("pageurl", "terms", field="pageurl.keyword", size=2).metric("sum_pageurl", "stats", field="pageurl.").bucket('browser', 'terms', field='browser.keyword')
# _count 按照数字排,_key 按照字母排序
# s.aggs.bucket("pageurl", "terms", field="pageurl.keyword", order={"_count": "asc"}, size=3).bucket('browser', 'terms', field='browser.keyword')
# for hit in s.scan():
# print(hit)
s = s.source(include=[""])
# 按照行业统计流量
s.aggs.bucket("industry", "terms", field="industry.keyword").bucket('rsdate', 'terms', field='rsdate')
# 添加参数
s = s.params(track_total_hits=True)
# 明确包含/排除字段 include=["browser"], exclude=["p.*"] 可以正则
# 执行
# print(s)
s = s.execute()
# 数据呈现
res = s.to_dict()
# for item in s.scan():
# print(item.browser)
#print(res)
with open('s.txt', 'w', encoding='utf-8') as f:
f.write(str(res))