версияasticsearch = 7.1
Я использую msearch вasticsearch, где каждый запрос состоит из разных geo_polygon.
С 2019-10-01 по 2019-12-01, для каждого дня I я запрашиваю msearch для нескольких полигонов.
один Я получаю результаты из своего запроса. Я создаю фрейм данных и вставляю его в словарь с ключом в качестве даты и значения, созданный для этой даты.
мой код выглядит следующим образом:
def coord_list_to_dict(coord_list):
"""
coord_list consists list of lists, change it to list of dictionaries.
ex: [[lat,lng], [lat,lng], etc...] --> [{lat,lng}, {lat,lng}, etc..]
"""
list_of_dicts = []
for crd in coord_list:
coord = {}
coord["lat"] = crd[1]
coord['lon'] = crd[0]
list_of_dicts.append(coord)
return list_of_dicts
def create_msearch(dt):
"""
Combine multiple queries into one.
polygon_body[
{},
{query1},
{},
{query2},
etc...
]
"""
msearch = []
for name in polygons:
coordinates = polygons[name]
points = coord_list_to_dict(coordinates)
msearch.append({})
msearch.append({"_source":["date", "host","request_1","request_2", "location","status"],
"query":
{"bool" :
{"must": [{"match": {"request_3": "list"}},
{"range":
{"date":
{"format":"strict_date_optional_time",
"gte":f"{dt}T05:00:00.000Z",
"lte":f"{dt}T10:00:00.000Z"}}}],
"filter" : {
"geo_polygon" : {
"location" : {
"points" : points}}}}},
"size":"10000","timeout":"2h"})
return msearch
date_range = pd.date_range(start='2019-10-01', end='2019-12-31', freq='1d').strftime('%Y-%m-%d')
dfs = {}
for dt in date_range:
region = []
date = []
location = []
host_ip = []
status = []
request_1 = []
request_2 = []
response = es.msearch(index="access_log", body=create_msearch(dt))
for res, polygon_name in zip(response["responses"], polygons.keys()):
for hits in res['hits']['hits']:
region.append(polygon_name)
date.append(hits['_source']['date'])
location.append(hits['_source']['location'])
host_ip.append(hits['_source']['host'])
status.append(hits['_source']['status'])
request_1.append(hits['_source']['request_1'])
request_2.append(hits['_source']['request_2'])
df = pd.DataFrame({
"date" :date,
"region" :region,
"location":location,
'host_ip' :host_ip,
'status' :status,
"request_1":request_1,
'request_2':request_2
})
dfs[dt] = df
ПРИМЕЧАНИЕ : словарь - это словарь, который выглядит примерно так:
{
"location_1" :[[lat,lng],[lat,lng],[],...etc],
"location_2" :[[lat,lng],[lat,lng],[],...etc],
}
Я получаю желаемый результат вплоть до 2019-10- 19 и далее, без результатов.
То, что я проверил: 1. данные существуют в kibana 2. используются msearch для 2019-10-20 и на работах в консоли kibana. 3. Может быть, я думал, что существует ограничение на количество запросов, поэтому попытался указать l oop от 2019-10-20, и он ничего не возвращает в результате запроса.
запрос даты 2019-10-19, запрос возвращает:
{'_shards': {'failed': 0, 'skipped': 0, 'successful': 5, 'total': 5},
'hits': {'hits': [{'_id': '4oSQfW4BlMUmB',
'_index': 'index',
'_score': 1.0854696,
'_source': {'date': '19/Oct/2019:14:17:19 +0900',
'host': '223.38.24.1',
'location': {'lat': 37.50098672207175,
'lon': 127.03707346692681},
'request_1': 'req1',
'request_2': 'req2',
'status': '200'},and so on...
и для даты после 2019-10-20 он возвращает
{'_shards': {'failed': 0, 'skipped': 4, 'successful': 5, 'total': 5},
'hits': {'hits': [],
'max_score': None,
'total': {'relation': 'eq', 'value': 0}},
Кажется, я не могу понять, почему он пропускает осколки.
Извините, я не могу думать о способ провести MRE.