【发布时间】:2017-12-14 13:42:42
【问题描述】:
我有想要索引到 Elasticsearch 中的文档,其中包含现有的唯一“id”字段。
我从 REST api 端点 ( eg.: http://some.url/api/products) 以无特定顺序获取一组文档,如果 Elasticsearch 中已经存在具有 _id 的文档,它应该更新并重新索引该文档。
如果 Elasticsearch 中不存在具有 _id 的文档,我想创建一个新文档,然后更新一个文档,如果它与 Elasticsearch 中的现有文档匹配。
这可以通过:
PUT products/product/un1qu3-1d-b718-105973677e95
{
"id": "un1qu3-1d-b718-105973677e95",
"state": "packaged"
}
基本思想是使用提供的“id”字段来创建或更新文档。从文档字段中提取 _id 似乎已弃用 (link)。但是,使用 kibana 开发工具、邮递员或 cURL 请求,可以非常轻松地手动完成带有“id”字段的文档的索引/重新索引。
我想以编程方式对通过此 api 端点收到的文档进行(重新)索引。
是否可以使用logstash 或简单的cronjob 来实现这一点? Elasticsearch 是否为此提供任何功能?还是我需要编写一些自定义后端来实现这一点?
我想到了:
1) 使用我的文档的“id”字段将文档索引到 Elasticsearch 中或
2) 找到一个 Elasticsearch 查询,该查询首先搜索具有特定“id”字段的文档,然后更新该文档。
我无法找到任何一种方法的解决方案,也不知道好的方法会是什么样子。
谁能指出我如何实现这一目标的正确方向,提出更好的方法或提供解决方案?
非常感谢任何帮助!
更新
我在接受的答案的帮助下解决了这个问题。我使用了 Logstash,Http_poller 输入插件,这篇文章:https://www.elastic.co/blog/new-way-to-ingest-part-1 和这个 elastic.co 问题:https://discuss.elastic.co/t/upsert-with-logstash/59116
目前我的 logstash 输出如下所示:
output {
elasticsearch {
index => "products"
document_type => "product"
pipeline => "rename_id"
document_id => "%{id}"
doc_as_upsert => true
action => "update"
}
更新 2
为了完整起见,我添加了“rename_id”管道
{
"rename_id": {
"description": "_description",
"processors": [
{
"set": {
"field": "_id",
"value": "{{id}}"
}
}
]
}
}
它是这样工作的! 非常感谢!
【问题讨论】:
标签: rest elasticsearch indexing cron logstash