java - ES删除重复项

标签 java elasticsearch duplicates

我目前正在将一些数据 (> 100MM) 从 Oracle 迁移到 Elasticsearch。

我使用的批量 API 工作得很好,但现在我已经迁移了所有我想通过删除重复项来清理的数据(由于迁移过程中出现问题,需要大约 2 天的时间,我不这样做)不想重新开始)。

我可以通过这样的查询查看所有重复项(使用 sense):

GET myindex/mytype/_search?search_type=count
{
  "aggregations": {
    "duplicates": {
      "terms": {
        "field": "message_id",
        "min_doc_count": 2,
        "size": 100
      }
    }
  }
}

但是我在寻找一种方法来删除那些使用按查询删除的方法时遇到了很多问题,你看,我需要删除重复项,留下一个副本。我的意思是,如果我有 2 条 message_id XXXX 的记录,我只需删除一条即可在 ES 中保留 1 条。

你知道实现这一目标的方法吗?

非常感谢任何帮助。

最佳答案

找到您要保存的文档的 ID,然后您可以使用 Delete by QueryNot Filter

例如,如果您有 3 个文档,文档 ID 为 1、2、3,所有文档的 messageId 均为 13,并且您想要保存文档 1,则可以运行以下查询:

DELETE /yourIndex/yourType/_query
{
    "query": {
        "filtered": {
            "query": {
                "term": {
                    "messageId": "13"
                }
            },
            "filter": {
                "not": {
                    "term": {
                        "_id": 1
                    }
                }
            }
        }
    }
}

文档 2 和文档 3 将被删除,文档 1 仍会出现在索引中。首先在本地测试一下。

关于java - ES删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29258252/

相关文章:

Java : How to timeout an operation?

java - 将ArrayList插入Oracle表中

elasticsearch - 具有小写过滤器的自定义分析器无法正常工作

ElasticSearch 连接本地环境时无法获取 TransPortClient

elasticsearch - 集群的Elasticsearch设置(两个主节点)

java - 如何使用 Spring JPA 存储库正确保存带有外键的对象?

java - 带有Opera和Edge浏览器的远程Webdriver

scope - 在函数外幸存的冷聚变参数的奇怪行为?

objective-c - 重复符号 _OBJC_CLASS_$_GTMBase64

sql - SSIS删除重复数据