tablas kopf indice implement elastic descripción descripcion data crear big arquitectura java testing groovy elasticsearch

java - kopf - ¿Cómo borrar el índice ElasticSearch?



implement elastic search (4)

Mi idea es tener un índice de búsqueda vacío antes de cada prueba

Entonces, cree un nuevo índice al comienzo de la prueba, no reutilice el anterior. Tienes garantizado uno vacío entonces. En el desmontaje de las pruebas, puede eliminar el índice de prueba.

¿Hay alguna manera de confirmar los últimos cambios, o hacer un bloqueo hasta que se escriban todos los datos?

No, ElasticSearch no tiene transacciones ni bloqueo.

Si no desea crear un nuevo índice cada vez, intente agregar un bucle que verifique si el índice está vacío, luego espera e intenta de nuevo, hasta que lo haga.

Mi unidad / pruebas de integración incluye pruebas para la funcionalidad de búsqueda.

Mi idea es tener un índice de búsqueda vacío antes de cada prueba. Por lo tanto, estoy tratando de eliminar todos los elementos en el índice en setup método de setup (es el código 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()

Parece que está procesando todas las eliminaciones de forma asíncrona, por lo que he agregado Thread.sleep(5000) después. Como ve, estoy intentando abrir / cerrar la conexión unas pocas veces, no ayuda allí.

El problema es que a veces requiere más tiempo, a veces necesita más de 5 segundos para eliminarse, a veces no puede encontrar solo datos agregados (de pruebas anteriores), etc., etc. Y lo más molesto es que las pruebas de integración se vuelven inestables. Poner Thread.sleep() donde sea posible se ve como una solución no tan buena.

¿Hay alguna manera de confirmar los últimos cambios, o hacer un bloqueo hasta que se escriban todos los datos?


  1. no es la llamada asincrónica (puede agregar un oyente y evitar actionGet para obtener la llamada asincrónica)
  2. eliminar todos los artículos a través de:

    client.prepareDeleteByQuery(indexName). setQuery(QueryBuilders.matchAllQuery()). setTypes(indexType). execute().actionGet();

  3. actualice su índice para ver los cambios (solo se requiere en pruebas unitarias)


En primer lugar, no tiene que borrar todos los datos emitiendo una eliminación en cada id. De documento. Simplemente puede eliminar todos los datos con la eliminación por consulta que coincida con todos los documentos http://www.elasticsearch.org/guide/reference/api/delete-by-query.html Dicho esto, tampoco lo recomiendo, porque no es recomienda hacerlo a menudo en grandes colecciones de documentos (ver documentos).

Lo que realmente quiere hacer es eliminar todo el índice (es rápido) http://www.elasticsearch.org/guide/reference/api/admin-indices-delete-index.html , recrearlo, poner datos y esto es importante actualizar el índice para "confirmar" los cambios y hacerlos visibles. http://www.elasticsearch.org/guide/reference/api/admin-indices-refresh.html

Hago esto en mis pruebas y nunca tuve un problema.


Solución encontrada:

IndicesAdminClient adminClient = searchConnection.client.admin().indices(); String indexName = "location"; DeleteIndexResponse delete = adminClient.delete(new DeleteIndexRequest(indexName)).actionGet() if (!delete.isAcknowledged()) { log.error("Index {} wasn''t deleted", indexName); }

y

client.admin().indices().flush(new FlushRequest(''location'')).actionGet();

después de poner nuevos datos en el índice.