能否将Kibana查询结果存入Elasticsearch?是否需脚本实现?
当然可以把Kibana里的查询结果重新存入Elasticsearch,而且不一定非要写复杂脚本——很多场景下直接用Kibana Dev Tools里的Elasticsearch原生API就能搞定,下面分情况给你讲清楚:
一、直接基于查询条件把结果存入ES(不用先拿响应)
这是最省心的方式,尤其是你已经有明确的查询条件时,直接用ES的_reindex API就能让ES自动把匹配查询的文档复制到目标索引,全程在Dev Tools里操作:
举个例子,假设你之前在Dev Tools里用这个查询获取结果:
GET my_source_index/_search { "query": { "match": { "product_category": "electronics" } } }
要把这些结果存入新索引my_target_index,只需要执行:
POST _reindex { "source": { "index": "my_source_index", "query": { // 直接把上面的查询条件搬过来 "match": { "product_category": "electronics" } } }, "dest": { "index": "my_target_index" } }
如果需要在复制过程中修改文档(比如加字段、删字段),还可以加script参数:
POST _reindex { "source": { "index": "my_source_index", "query": {"match_all": {}} }, "dest": { "index": "my_target_index" }, "script": { "source": "ctx._source.imported_at = new Date(); ctx._source.remove('temp_field')" } }
二、已经拿到Dev Tools的查询响应,想把响应里的文档存入ES
如果已经得到了查询的JSON响应(比如hits.hits数组里的文档),也不用写复杂脚本:
- 数据量小的情况:把响应里的每个文档整理成
_bulkAPI的格式,直接在Dev Tools里执行。比如响应里的文档是:
整理成bulk请求:{ "hits": { "hits": [ {"_id": "1", "_source": {"name": "phone", "price": 500}}, {"_id": "2", "_source": {"name": "laptop", "price": 1000}} ] } }
复制到Dev Tools里执行就行,完全手动搞定。POST _bulk {"index": {"_index": "my_target_index", "_id": "1"}} {"name": "phone", "price": 500} {"index": {"_index": "my_target_index", "_id": "2"}} {"name": "laptop", "price": 1000} - 数据量大的情况:这时候手动整理太麻烦,可以写个简单的脚本(比如用Python的
elasticsearch库),遍历响应里的hits,自动生成bulk请求并发送给ES。这种脚本逻辑很简单,就是读JSON响应,循环处理每个文档,调用bulk接口,算不上复杂开发。
三、Kibana Discover里的查询结果怎么存?
如果你是在Discover界面做的可视化查询,先把查询条件导出成JSON(Discover界面右上角的「Share」→「Copy query to clipboard」),然后把这个查询条件放到上面的_reindex请求的source.query里,就能把匹配的结果存入目标索引了。
总结建议
- 优先用
_reindexAPI:不管是从查询条件直接存,还是处理Discover的查询,这都是最直接、无额外工具的方式。 - 小量响应文档用
_bulk手动整理:不用写脚本,复制粘贴就能搞定。 - 大量响应文档才需要简单脚本:比如用Python/Node.js写几行代码处理批量数据,效率更高。
内容的提问来源于stack exchange,提问作者cc.zhang
相关产品推荐
相关产品推荐

