asticsearch не возвращает никакого результата после определенной даты - PullRequest
0 голосов
/ 08 января 2020

версия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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...