我目前正在将网页索引到elasticsearch。索引是通过 java (Spring) 和 Apache Nutch 完成的。
我遇到了一种情况,在elasticsearch中索引或更新文档后,我必须调用外部API。 API 处理索引中的字段值,并将处理结果存储在另一个字段的同一索引中。我在索引之前尝试了 API 调用,它会影响索引性能(花费太多时间)。我必须在不影响索引或更新elasticsearch文档的情况下调用外部API。
寻找一些想法。
我使用的是elasticsearch版本5.6.3
。
最佳答案
目前 ES 不支持与您需要的类似的“通知系统”( https://discuss.elastic.co/t/notifications-from-elasticsearch-when-documents-are-added/5106/31 ),由于 ES 的分布式特性,这在大多数情况下是不切实际的。
我认为更简单的方法是插入 Kafka/RabbitMQ(队列),您可以将 ES 索引器作为此队列中的工作人员,然后该工作人员将是向不同队列发送消息的理想位置,表明文档 X 已准备好丰富(添加更多元数据)。而且在这种情况下,您不必担心会减慢系统的索引速度(您可以添加更多 ES 索引器)。您也不需要不断查询 ES 来丰富您的文档,因为您可以将所需的字段(或多个字段)与 ES id 一起发送给丰富工作人员,他们将在调用外部 API 后直接更新该文档)。请记住,也许其中一部分可以包含在自定义 ES 插件中。
这样做的优点是您可以分别缩放两个位置(ES 索引器/元数据丰富器)。
其他选项可能是使用一些外部模块来查询 ES 中尚未通过外部内容丰富的文档 block ,然后您可以调用外部 API,然后将文档更新回 ES。
关于java - Elasticsearch 索引后执行外部操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48494762/