Jeśli pracujesz w scali, sposobem na to i skorzystanie Future
z tego jest utworzenie RequestExecutor, a następnie skorzystanie z IndicesStatsRequestBuilder i klienta administracyjnego w celu przesłania żądania.
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
}
}
}
Egzekutor jest usuwany z tego postu na blogu, co jest zdecydowanie dobrą lekturą, jeśli próbujesz programowo wysyłać zapytania do ES, a nie przez zwijanie. Po jego utworzeniu możesz łatwo utworzyć listę wszystkich indeksów:
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
jest instancją klienta, która może być węzłem lub klientem transportu, w zależności od potrzeb. Będziesz także musiał mieć domyślny ExecutionContext
zakres dla tego żądania. Jeśli spróbujesz skompilować ten kod bez niego, otrzymasz od kompilatora scala ostrzeżenie, jak go uzyskać, jeśli jeszcze go nie zaimportowano.
Potrzebowałem liczby dokumentów, ale jeśli naprawdę potrzebujesz tylko nazw indeksów, możesz wyciągnąć je z klawiszy mapy zamiast z IndexStats
:
indicesStatsResponse.getIndices().keySet()
To pytanie pojawia się, gdy szukasz sposobu, aby to zrobić, nawet jeśli próbujesz to zrobić programowo, więc mam nadzieję, że pomoże to każdemu, kto chce to zrobić w scala / java. W przeciwnym razie użytkownicy curl mogą zrobić to, co mówi najlepsza odpowiedź i użyć
curl http://localhost:9200/_aliases
curl http://localhost:9200/_stats/indexes\?pretty\=1