elasticsearch - 使用弹性搜索查询从源索引复制时从目标索引中删除额外记录
问题描述
我正在使用弹性搜索查询,遇到问题,例如将记录从一个索引复制到另一个具有相同映射和类型的索引。但是,index1(source) 的记录 (ex : 2) 比 index2(destination ex: 3) 少。现在我的要求是将记录从源索引复制到目标索引,并且应该删除目标索引中额外的一条记录(id:3)。我已经使用弹性搜索中的重新索引查询进行了一些跟踪,但它对我不起作用。
任何形式的帮助表示赞赏..
解决方案
通过无痛脚本应该有更好/更简单的方法,但这是我还没有尝试过的东西。
我再次假设,您的文档不包含任何时间戳字段来跟踪文档的创建/更新时间,否则,一旦您从源重新索引到目标,您就可以使用时间戳执行按查询 API 删除。
以下技术利用了 Elasticsearch 的Ingest API和Reindex功能
假设你有
- 源索引 - indexA
- 目标索引 - indexB
创建两个摄取管道
PUT _ingest/pipeline/pipeline_one
{
"description" : "pipeline from indexB to intermediate index",
"processors" : [
{
"set" : {
"field": "tempField",
"value": "default"
}
}
]
}
PUT _ingest/pipeline/pipeline_two
{
"description" : "pipeline from indexA to intermediate index",
"processors" : [
{
"set" : {
"field": "tempField",
"value": "update"
}
}
]
}
从 indexB 重新索引到临时 indexC。
POST _reindex
{
"source": {
"index": "indexB"
},
"dest": {
"index": "indexC",
"pipeline": "pipeline_one"
}
}
从 indexA 重新索引到临时 indexC
POST _reindex
{
"source": {
"index": "indexA"
},
"dest": {
"index": "indexC",
"pipeline": "pipeline_two"
}
}
通过这样做,现在您知道可以通过查询删除来删除不需要的文档,并且tempField的值仍然是default。
POST indexc/_delete_by_query
{
"query": {
"match": {
"tempField": "default"
}
}
}
此时您可以继续删除目标索引。
重新创建目标索引(首先进行备份)并创建从中间索引到目标的以下管道,同时删除字段 tempField 以保留您的映射。
PUT _ingest/pipeline/pipeline_three
{
"description" : "pipeline from intermediate to destination index",
"processors" : [
{
"remove" : {
"field": "tempField"
}
}
]
}
POST _reindex
{
"source": {
"index": "indexC"
},
"dest": {
"index": "indexB",
"pipeline": "pipeline_three"
}
}
推荐阅读
- docker - 从正在运行的容器创建 docker 映像
- javascript - 如何导出多个融合图以分离图像文件
- python - 如何在 Django 中从 views.py 中导入变量?
- google-my-business-api - 任何 GMB 位置的问答部分是否有任何预览 URL...?
- spring-boot - Java Spring Boot:使独立应用程序无需退出即可运行
- php - 如何只显示一次结果检查的消息
- java - 春季启动:java.lang.NoSuchMethodError:javax.servlet.http.HttpServletRequest.getHttpServletMapping()Ljavax/servlet/http/HttpServletMapping;
- json - json中特定变量后的jinja匹配字符串
- android - [Android][RecyclerView] 行可见时回调
- javascript - 使用多个相同的下拉列表 ID,但第二个下拉列表不会触发 onchange 事件