Как стереть индекс ElasticSearch?

Мои модульные / интеграционные тесты включают тесты для функциональности поиска.

Моя идея состоит в том, чтобы иметь пустое поле поисковый индекс перед каждым тестом. Итак, я пытаюсь удалить все элементы в индексе в методе setup (это код Groovy):

Client client = searchConnection.client

SearchResponse response = client.prepareSearch("item")
    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
    .setQuery(termQuery('name', 'test')) //tried also matchAllQuery()
    .setFrom(0).setSize(100).setExplain(false).execute().actionGet()

List<String> ids = response.hits.hits.collect {
    return it.id
}
client.close()

client = searchConnection.client

ids.each {
    DeleteResponse delete = client.prepareDelete("item", "item", it)
        .setOperationThreaded(false)
        .execute().actionGet()
}

client.close()

Похоже, он обрабатывает все удаления асинхронно, поэтому я добавил Thread.sleep (5000) после него. Как видите, я пытаюсь открыть / закрыть соединение несколько раз - это не помогает.

Проблема в том, что иногда требуется больше времени, иногда это требуется более 5 секунд для удаления, иногда он не может найти только добавленные данные (из предыдущего теста) и т. д. и т. д. И больше всего раздражает то, что интеграционные тесты становятся нестабильными. Размещение Thread.sleep () везде, где это, возможно, выглядит не очень хорошим решением.

Есть ли способ зафиксировать последние изменения или сделать блокировку до тех пор, пока все данные не будут записаны иттен?

28
задан Igor Artamonov 4 June 2012 в 05:11
поделиться