Если вы работаете в Scala, способ сделать это и использовать Future
это - создать RequestExecutor, затем использовать IndicesStatsRequestBuilder и административный клиент для отправки вашего запроса.
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
}
}
}
Исполнитель взят из этого поста в блоге, который, безусловно, хорошо читается, если вы пытаетесь запрашивать ES программно, а не с помощью curl. Если у вас есть это, вы можете легко создать список всех индексов, например:
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
это экземпляр клиента, который может быть узлом или транспортным клиентом, в зависимости от того, что вам подходит. Вы также должны иметь неявноеExecutionContext
область действия для этого запроса. Если вы попытаетесь скомпилировать этот код без него, вы получите предупреждение от компилятора scala о том, как его получить, если у вас его еще нет.
Мне нужно было количество документов, но если вам действительно нужны только имена индексов, вы можете извлечь их из ключей карты, а не из IndexStats
:
indicesStatsResponse.getIndices().keySet()
Этот вопрос появляется, когда вы ищете, как это сделать, даже если вы пытаетесь сделать это программно, поэтому я надеюсь, что это поможет всем, кто хочет сделать это в scala / java. В противном случае, пользователи curl могут просто делать так, как говорит главный ответ, и использовать
curl http://localhost:9200/_aliases
curl http://localhost:9200/_stats/indexes\?pretty\=1