Si vous travaillez dans scala, une façon de le faire et d'utiliser Future
est de créer un RequestExecutor, puis utilisez IndicesStatsRequestBuilder et le client administratif pour soumettre votre demande.
import org.elasticsearch.action.{ ActionRequestBuilder, ActionListener, ActionResponse }
import scala.concurrent.{ Future, Promise, blocking }
/** Convenice wrapper for creating RequestExecutors */
object RequestExecutor {
def apply[T <: ActionResponse](): RequestExecutor[T] = {
new RequestExecutor[T]
}
}
/** Wrapper to convert an ActionResponse into a scala Future
*
* @see http://chris-zen.github.io/software/2015/05/10/elasticsearch-with-scala-and-akka.html
*/
class RequestExecutor[T <: ActionResponse] extends ActionListener[T] {
private val promise = Promise[T]()
def onResponse(response: T) {
promise.success(response)
}
def onFailure(e: Throwable) {
promise.failure(e)
}
def execute[RB <: ActionRequestBuilder[_, T, _, _]](request: RB): Future[T] = {
blocking {
request.execute(this)
promise.future
}
}
}
L'exécuteur est retiré de ce billet de blog, ce qui est certainement une bonne lecture si vous essayez d'interroger ES par programme et non par curl. Une fois que vous l'avez, vous pouvez créer une liste de tous les index assez facilement comme ceci:
def totalCountsByIndexName(): Future[List[(String, Long)]] = {
import scala.collection.JavaConverters._
val statsRequestBuider = new IndicesStatsRequestBuilder(client.admin().indices())
val futureStatResponse = RequestExecutor[IndicesStatsResponse].execute(statsRequestBuider)
futureStatResponse.map { indicesStatsResponse =>
indicesStatsResponse.getIndices().asScala.map {
case (k, indexStats) => {
val indexName = indexStats.getIndex()
val totalCount = indexStats.getTotal().getDocs().getCount()
(indexName, totalCount)
}
}.toList
}
}
client
est une instance de Client qui peut être un nœud ou un client de transport, selon ce qui convient à vos besoins. Vous devrez également avoir une ExecutionContext
portée implicite pour cette demande. Si vous essayez de compiler ce code sans lui, vous obtiendrez un avertissement du compilateur scala sur la façon de l'obtenir si vous n'en avez pas déjà importé.
J'avais besoin du nombre de documents, mais si vous n'avez vraiment besoin que des noms des index, vous pouvez les extraire des clés de la carte au lieu de IndexStats
:
indicesStatsResponse.getIndices().keySet()
Cette question apparaît lorsque vous cherchez comment faire cela même si vous essayez de le faire par programme, donc j'espère que cela aidera toute personne qui cherche à le faire dans scala / java. Sinon, les utilisateurs de curl peuvent simplement faire ce que dit la première réponse et utiliser
curl http://localhost:9200/_aliases
curl http://localhost:9200/_stats/indexes\?pretty\=1