2

我正在研究在没有数据库的情况下使用 ES 的可能性,从我的 python 应用程序构建我的数据并将其实时直接发送到 ES。它告诉我很多复杂性,但我担心的是我可能会非常快速地生成数据并无情地发送请求,即使 ES 可能还没有准备好接受它。

我的问题是,在这种情况下,使用队列系统作为两者之间的缓冲区是否有意义,所以我的应用程序将所有内容发送到队列,然后队列尝试将其添加到 ES,如果没有成功则重试.

我不确定这是否是最合乎逻辑或最有效的方法。如果有人对适合哪种队列系统有任何信息或想法,或者我什至需要一个,我会非常有兴趣听到。

詹姆士

4

2 回答 2

4

Elasticsearch 批量索引 API 非常高效;它可以处理相当多的负载 - 当然取决于您的源文档和分析器的复杂性。请务必测试对您的硬件和用例最有效的批量批量大小(提到的复杂性)。

另一种方法是使用 Elasticsearchriver概念(http://www.elasticsearch.org/guide/reference/river/,简介:http ://www.elasticsearch.org/blog/the-river/ ):河流简单地运行集群中的单个节点侦听某种消息代理(redis、rabbitmq、couchdb 等存在)。您的应用程序以它支持的任何速度(通常非常快)将文档推送到消息代理,并且 Elasticsearchriver使用批量索引在内部批量提取数据和索引。

老实说,如果您不确定,请先尝试最简单的解决方案(直接批量索引)。如果这不起作用,请继续使用河流支持之类的东西。

于 2013-08-30T15:24:29.237 回答
3

我是新来的,但我会尝试与ES分享我自己的经验。在这里,我们使用 couchDB 将我们要索引的 json 存储到 ES 中。但是,我们对这些文档进行了大量修改,例如创建新节点等。文档很大,有数百个字段,超过 15 个嵌套集合。最后,有成千上万的文档。

所以,是的,以我的拙见,如果你可以通过你的应用程序创建你的文档,我不明白为什么 ES 会遇到麻烦。但是,对于 python 部分,我无能为力,我们在这里用 java 做事。

但是,对于 ES,我会

  • 使用批量 API。ES 以这种方式(很多,很多)更有效率。
  • 我可能会将由于随机错误而无法索引的文档的 ID 存储在另一个索引(或文件或其他地方)中,以便您可以在之后重建和重新索引它们,而不是重试错误。(虽然我不知道python中的可行性)
  • 不要为当前索引的索引使用副本。

对于重试错误,我的心情很复杂。如果错误是由于文档的错误构造或映射错误造成的,则每次重试都会失败。

在这里,我们每分钟索引数千个这样的文档,并且仍然可以发出搜索和构面请求(不过,这些请求可能会稍微慢一些)。

这并不多,但我希望它有所帮助。祝你好运。

于 2013-08-27T12:42:10.427 回答