我正在使用Java API尝试使用基本Scala程序的Elasticsearch:
object TestES {
var node:Node = NodeBuilder.nodeBuilder.node
var client:Client = node.client
def insertDoc(id:String, doc:String) = {
client.prepareIndex("myindex", "test", id).
setSource(doc).execute.actionGet
}
def countHits(qry:String) = {
client.prepareSearch("myindex").setTypes("test").
setQuery(queryString(qry)).execute.actionGet.
getHits.getTotalHits
}
def waitForGreen = client.admin.cluster.prepareHealth().
setWaitForGreenStatus.execute.actionGet
def main(args: Array[String]): Unit = {
insertDoc("1", """{"foo":"bar"}""")
//waitForGreen
println(countHits("bar"))
node.close
}
}
这个工作,插入+查询在一秒钟内运行。如果我注释掉插入,我会得到以下异常:
Exception in thread "main" org.elasticsearch.action.search.SearchPhaseExecutionException:
Failed to execute phase [query], total failure;
shardFailures {[_na_][myindex][0]: No active shards}
如果我启用waitForGreen
行,它会再次运行,但需要花费半分钟才能运行这两行。
这似乎很奇怪。在运行查询之前是否必须插入文档,还是有更好的方法?
答案 0 :(得分:0)
运行查询不需要插入文档,但需要创建索引。 当您插入文档并且索引不存在时,它将自动创建。
如果您想避免创建文档,则只能使用API创建索引:
client.admin.indices.prepareCreate("myindex").execute.actionGet