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

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

Мой индекс содержит поля с именами ServiceName, message и timestamp (среди прочего), и мое требование довольно простое. Я хочу удалить документы, в которых ServiceName равно определенному значению (myService), сообщение НЕ равно ни одному из двух конкретных значений (Starting* и Finished*, поскольку я хочу сохранить первое и последнее сообщение журнала из любой истории трассировки) и документ старше одного дня. Я использую конечную точку _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
                }
            }]
        }
    }
}

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


person pr.lwd    schedule 13.11.2020    source источник
comment
...it deleted documents that were returned in the search results чего вы ожидаете, верно?   -  person Val    schedule 13.11.2020
comment
Ха - там опечатка. Он удалил документы, которые не были возвращены результатами поиска, вот что я должен был сказать. Будет редактировать   -  person pr.lwd    schedule 13.11.2020
comment
Хорошо, так логичнее ;-) Хотя я нахожу это очень удивительным... Сколько результатов вы получаете по поисковому запросу? и сколько на самом деле было удалено с одним и тем же запросом?   -  person Val    schedule 13.11.2020
comment
Хм, может быть, я действительно сделал что-то не так. Я попробую еще раз, так как я тоже был удивлен. Мы говорим о 20 миллионах документов, поскольку они накапливались с течением времени.   -  person pr.lwd    schedule 13.11.2020
comment
Спасибо всем за комментарии - я переработал стратегию индексации, чтобы использовать индексы на основе даты, поэтому очистка старых данных теперь представляет собой простой случай удаления индекса.   -  person pr.lwd    schedule 17.12.2020
comment
Отлично, да, именно так вы должны обрабатывать данные, основанные на времени. Намного легче   -  person Val    schedule 17.12.2020


Ответы (1)


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

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

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

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

person Ankit Garg    schedule 01.12.2020