Wenn Sie in Scala arbeiten, ist eine Möglichkeit, dies zu tun und Future
s zu verwenden, die Erstellung eines RequestExecutor, dann die Verwendung des IndicesStatsRequestBuilder und des administrativen Clients, um Ihre Anfrage zu senden.
import org.elasticsearch.action.{ ActionRequestBuilder, ActionListener, ActionResponse }
import scala.concurrent.{ Future, Promise, blocking }
/** Bequeme Wrapper für die Erstellung von RequestExecutors */
object RequestExecutor {
def apply[T <: ActionResponse](): RequestExecutor[T] = {
new RequestExecutor[T]
}
}
/** Wrapper zum Konvertieren einer ActionResponse in ein 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 stammt aus diesem Blog-Beitrag, der auf jeden Fall lesenswert ist, wenn Sie versuchen, ES programmgesteuert abzufragen und nicht über Curl. Wenn Sie dies haben, können Sie eine Liste aller Indizes recht einfach erstellen, wie folgt:
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, der ein Knoten oder ein Transportclient sein kann, je nach Ihren Bedürfnissen. Sie müssen auch implizit einen ExecutionContext
im Scope für diese Anfrage haben. Wenn Sie diesen Code ohne importierten ExecutionContext kompilieren möchten, erhalten Sie eine Warnung vom Scala-Compiler, wie Sie diesen erhalten können, wenn Sie ihn nicht bereits importiert haben.
Ich benötigte die Dokumentenzahl, aber wenn Sie wirklich nur die Namen der Indizes benötigen, können Sie sie aus den Schlüsseln der Karte anstelle von IndexStats
erhalten:
indicesStatsResponse.getIndices().keySet()
Diese Frage taucht auf, wenn Sie suchen, wie Sie dies auch programmgesteuert machen können, also hoffe ich, dass dies allen hilft, die dies in Scala/Java machen möchten. Andernfalls können Curl-Benutzer einfach wie in der Top-Antwort beschrieben vorgehen und
curl http://localhost:9200/_aliases