Где я ошибаюсь с Elasticsearch _delete_by_query?

#amazon-web-services #elasticsearch #amazon-elasticsearch

#amazon-web-services #elasticsearch #amazon-elasticsearch

Вопрос:

Я довольно новичок в Elasticsearch и пытаюсь периодически удалять документы, используя API _delete_by_query (я полностью понимаю, что, вероятно, мне следует использовать индексы, основанные на времени, чтобы упростить это, и со временем я обновлю структуру индексации, но сейчас мне нужно заставить это работать).

Мой индекс содержит поля, называемые ServiceName, message и timestamp (среди прочих), и мое требование довольно простое. Я хочу удалить документы, в которых ServiceName равно определенному значению (MyService), сообщение НЕ равно ни одному из двух определенных значений (начиная * и заканчивая *, поскольку я хочу сохранить первое и последнее сообщение журнала из любой истории трассировки), а возраст документа превышает один день. Я использую конечную точку _delete_by_query со следующей полезной нагрузкой:

 {
    "query": {
        "bool": {
            "must": [],
            "filter": [{
                    "match_all": {}
                },
                {
                    "match_phrase": {
                        "ServiceName": {
                            "query": "myService"
                        }
                    }
                },
                {
                    "range": {
                         "@timestamp": {
                        "lte": "now-1d"
                        }
                    }
                }
            ],
            "should": [],
            "must_not": [{
                "bool": {
                    "should": [{
                            "match_phrase": {
                                "message": "Starting*"
                            }
                        },
                        {
                            "match_phrase": {
                                "message": "Finished*"
                            }
                        }
                    ],
                    "minimum_should_match": 1
                }
            }]
        }
    }
}
  

Когда я запускаю запрос с помощью _search API, он возвращает данные, которые я ожидал удалить, но когда я отправил тот же запрос в _delete_by_query, он удалил документы, которые не были возвращены в результатах поиска. Я использую сервис AWS Elasticsearch. Кто-нибудь может сказать мне, где я ошибаюсь, или это должно сработать? Изначально я думал, что это может быть minimum_should_match свойство, однако документация, похоже, предполагает, что в данном случае это не имеет значения

Комментарии:

1. ...it deleted documents that were returned in the search results чего вы ожидаете, верно?

2. Ха — там опечатка. Он удалил документы, которые не были возвращены результатами поиска, вот что я должен был сказать. Будет редактировать

3. Хорошо, так логичнее;-) Я нахожу это очень удивительным… Сколько результатов вы получаете для поискового запроса? и сколько из них было фактически удалено с помощью одного и того же запроса?

4. Хм, может быть, я действительно сделал что-то не так. Я попробую еще раз, так как я тоже был удивлен. Мы говорим о 20 миллионах документов, поскольку они накапливаются с течением времени

5. Спасибо всем за комментарии — я переработал стратегию индексации для использования индексов на основе даты, поэтому очистка старых данных теперь является простым случаем удаления индекса

Ответ №1:

Это странно. Можете ли вы проверить, одинаковое ли количество обращений или нет? Результаты поиска в kibana усекаются, что может быть причиной того, что определенные документы не отображаются в результатах поиска, а отображаются в удаленных документах.

Если это не так, было бы здорово, если бы вы могли поделиться образцом двух документов.

  • Документ A: отображается в поиске, а также удаляется.
  • Документ B: отсутствует в поиске, но удаляется.

Это поможет воспроизвести проблему с моей стороны и вернуться к вам.