Se lavori in scala, un modo per farlo e utilizzare Future
quello di creare un RequestExecutor, quindi utilizzare IndicesStatsRequestBuilder e il client amministrativo per inviare la richiesta.
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'esecutore è sollevato da questo post del blog che è sicuramente una buona lettura se stai cercando di interrogare ES a livello di codice e non attraverso l'arricciatura. Una volta che hai questo puoi creare un elenco di tutti gli indici abbastanza facilmente in questo modo:
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
è un'istanza di Client che può essere un nodo o un client di trasporto, a seconda delle esigenze. Dovrai anche avere un implicitoExecutionContext
ambito per questa richiesta. Se provi a compilare questo codice senza di esso, riceverai un avviso dal compilatore scala su come ottenerlo se non ne hai già importato uno.
Avevo bisogno del conteggio dei documenti, ma se hai davvero bisogno solo dei nomi degli indici puoi estrarli dalle chiavi della mappa invece che da IndexStats
:
indicesStatsResponse.getIndices().keySet()
Questa domanda viene visualizzata quando stai cercando come farlo anche se stai cercando di farlo a livello di codice, quindi spero che questo aiuti chiunque cerchi di farlo in scala / java. Altrimenti, gli utenti di curl possono semplicemente fare come dice e usare la risposta principale
curl http://localhost:9200/_aliases
curl http://localhost:9200/_stats/indexes\?pretty\=1