Якщо ви працюєте в масштабі, спосіб зробити це і використовувати Future
's - це створити RequestExecutor, тоді використовуйте IndeicesStatsRequestBuilder та адміністративний клієнт, щоб подати ваш запит.
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 програмно, а не через завиток. Один з них у вас є, ви можете легко створити список усіх індексів так:
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