我目前正在将网页索引到elasticsearch。索引是通过java(Spring)和Apache Nutch完成的。
我遇到了一种情况,我必须在弹性搜索索引或更新文档后调用外部API。 API处理索引中的字段值,并将处理结果存储在另一个字段中的相同索引中。我在索引之前尝试了API调用,它会影响索引性能(花费太多时间)。我必须调用外部API而不影响索引或更新elasticsearch文档。
寻找一些想法。
我正在使用elasticsearch版本5.6.3
。
答案 0 :(得分:0)
目前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查询尚未使用外部内容丰富的大量文档,然后您可以调用外部API,然后将文档更新回ES。
答案 1 :(得分:0)
就我而言,我们使用logstash-kafka-logstash写入ES。在Kafka的消费者端,我们调用外部API来计算新字段,在POJO中更新并写入ES。它运行得很好。
注意:您可能还想检查是否可以改进通过外部API的数据计算过程。