[英]ElasticSearch updating documents in an automated way
我不知道如何提出有关我当前问题的问题,所以我想,这就是我找不到正确答案的原因。 所以请让我告诉你我的问题是什么。
我正在尝试通过使用 Zmap 和 Zgrab(如 Shodan.io、censys.io 等)来做一个简单的互联网端口扫描器。
我需要将数据存储在 ElasticSearch 中(因为我想学习如何使用它)。
在这种情况下;
我创建了一个 JSON 架构以在 ElasticSearch 中使用它,例如
{
"value": "192.168.0.1",
"port": [
{
"value": 80,
"HTMLbody": "BODY OF THE WEB PAGE",
"status": 200,
"headers": {
"content_type": "html/png",
"content_length": 23123,
"...": "..."
},
"certificate": {
"company_names": [
"example.com",
"acme.io"
]
}
}
]
}
Elasticsearch 内部将有大约 40 亿个 IP 地址打开不同的端口。 我的问题从这里开始; 第一次初始扫描后,我需要更新现有的 IP 地址。
例如;
IP:192.168.0.1 端口:80 开放
在第二次扫描时,我扫描端口 443 并且它可能也会打开。 然后我需要根据打开的端口更新我的 Elasticsearch 文档。
我发现有一个端点是; POST /<index>/_update/<_id>
但它更新单个文档。 我需要在一次扫描中更新至少超过 100.000 个文档。 它也应该是自动的。 我怎么知道一个ip地址文件的id并更新它呢?
其次,我发现;
POST <index>/_update_by_query
我考虑过使用查询来搜索 ip 地址并收集其索引号,然后按如下方式更新文档;
{
"value": "192.168.0.1",
"port": [
{
"value": 80,
"HTMLbody": "BODY OF THE WEB PAGE",
"status": 200,
"headers": {
"content_type": "html/png",
"content_length": 23123,
"...": "..."
},
"certificate": {
"company_names": [
"example.com",
"acme.io"
]
}
},
{
"value": 443,
"HTMLbody": "BODY OF THE SSL WEB PAGE",
"status": 200
}
]
}
理论上,我可以做到这一点,但在实践中无法编写高效的代码。 因为我一次扫描至少有 6 GB 的 JSON 文件,处理整个文件和更新 elasticsearch 需要很长时间。
有什么方法可以有效地解决这个问题吗?
要完全回答这个问题,首先,使用 ip 地址作为_id
使 sur 更新相应的文档。 您需要在端口数组中添加一个条目,因此使用_update
API 来执行它,如下所示:
POST <index>/_update/192.168.0.1
{
"script": {
"source": "ctx._source.port.add(params.tag)",
"lang": "painless",
"params": {
"tag": {
"value": 443,
"HTMLbody": "BODY OF THE SSL WEB PAGE",
"status": 200
}
}
}
}
这是一个更新查询,用一个小脚本向数组添加一个条目。
要使用批量,只需像此处解释的那样添加您的所有请求
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.