使用基本嵌入式Elasticsearch的SearchPhaseExecutionException

时间:2013-06-15 16:30:11

标签: elasticsearch

我正在使用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行,它会再次运行,但需要花费半分钟才能运行这两行。

这似乎很奇怪。在运行查询之前是否必须插入文档,还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

运行查询不需要插入文档,但需要创建索引。 当您插入文档并且索引不存在时,它将自动创建。

如果您想避免创建文档,则只能使用API​​创建索引:

client.admin.indices.prepareCreate("myindex").execute.actionGet