Elasticsearch高效的索引管理

时间:2015-08-19 22:15:46

标签: apache-spark elasticsearch

我正在以非典型的方式使用Elasticsearch,并希望了解这是多么有效。

我创建了一整套“docs”,每个都有几个字段。我在Spark中将其作为Map [String,Any]的RDD。然后我经常使用潜在的新数据覆盖索引。我怀疑更典型的方法是一次更新或添加文档。我使用Elasticsearch Spark Scala支持执行此操作:

val docsRDD: RDD[Map[String, Any]] = getDocs()
docsRDD.saveToEs(esIndexURI, Map("es.mapping.id" -> "id"))

我已经在两个工作流程中完成了这项工作,并希望了解他们的权衡

  1. 删除索引,创建编写,然后刷新以使索引可用。这是因为据我所知,在刷新之前,索引并没有真正被删除,这将做旧的新索引的热交换。换句话说,Elasticsearch在后台工作,然后在刷新时交换新的新索引。
  2. 使用没有删除/创建/刷新的Spark代码覆盖索引。
  3. 起初我正在更新文档,但事实证明这是不切实际的,Spark的支持似乎暗示了一次性写作方法。两者似乎都有效,但我现在有一个小数据集,并想知道不同方法(或其他建议)如何影响:

    • 在运营期间查询效果
    • 重新索引的速度
    • 指数的连贯性。 #2是否创建了具有部分更新的索引,因此查询将针对不完整的更新?是#1导致索引在一段时间内不可用吗?

1 个答案:

答案 0 :(得分:0)

第三种选择:首先为当前索引分配别名,并通过该别名进行地址搜索,而不是直接搜索索引。更新/重建索引时,使用最新数据编写全新索引,不要覆盖或删除/重建当前数据。构建新索引后,为其分配别名并将其从旧索引中删除。将别名分配给更新的索引后,删除/存档/无论旧索引。根据需要重复后续索引重建。

完全符合您的需求,不会干扰当前索引版本的读取,而新的索引版本正在构建并且不依赖于计时/运气来保持删除的索引暂时可搜索。当然,它确实需要为索引的两个版本提供足够的存储空间。