如果你使用scala,一种方法是创建一个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
}
}
}
执行器摘自这篇博客文章,如果您试图以编程方式而不是通过curl查询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是client的实例,可以是节点或传输客户端,取决于您的需要。您还需要在这个请求的作用域中有一个隐式的ExecutionContext。如果你试图在没有导入它的情况下编译这段代码,那么你会从scala编译器那里得到一个警告,告诉你如果你还没有导入它的话,该如何得到它。
我需要文档计数,但如果你真的只需要索引的名称,你可以从地图的键拉他们,而不是从IndexStats:
indicesStatsResponse.getIndices().keySet()
这个问题会在你搜索如何做到这一点时出现,即使你试图以编程的方式做到这一点,所以我希望这能帮助任何想在scala/java中做到这一点的人。否则,curl用户可以按照上面的答案使用
curl http://localhost:9200/_aliases