如果您在 scala 中工作,那么执行此操作并使用Future
's 的一种方法是创建一个 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