Wenn Sie in Scala arbeiten, können Sie dies tun und verwenden Future
, indem Sie einen RequestExecutor erstellen. Verwenden Sie dann den IndicesStatsRequestBuilder und den Verwaltungsclient, um Ihre Anfrage zu senden.
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
}
}
}
Der Executor wird aus diesem Blog-Beitrag entfernt, was definitiv eine gute Lektüre ist, wenn Sie versuchen, ES programmgesteuert und nicht durch Curl abzufragen. Wenn Sie dies haben, können Sie ganz einfach eine Liste aller Indizes erstellen:
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
ist eine Instanz von Client, die ein Knoten oder ein Transportclient sein kann, je nachdem, was Ihren Anforderungen entspricht. Sie müssen auch einen impliziten ExecutionContext
Gültigkeitsbereich für diese Anforderung haben. Wenn Sie versuchen, diesen Code ohne ihn zu kompilieren, erhalten Sie vom Scala-Compiler eine Warnung, wie Sie diesen Code erhalten, wenn Sie noch keinen importiert haben.
Ich brauchte die Anzahl der Dokumente, aber wenn Sie wirklich nur die Namen der Indizes benötigen, können Sie sie aus den Schlüsseln der Karte ziehen, anstatt aus IndexStats
:
indicesStatsResponse.getIndices().keySet()
Diese Frage wird angezeigt, wenn Sie nach einer Vorgehensweise suchen, auch wenn Sie dies programmgesteuert versuchen. Ich hoffe, dies hilft jedem, der dies in Scala / Java tun möchte. Andernfalls können Curl-Benutzer einfach das tun, was in der Top-Antwort steht, und verwenden
curl http://localhost:9200/_aliases
curl http://localhost:9200/_stats/indexes\?pretty\=1