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))