elasticsearch允许具有不同身体数据的重复ID

2024-01-17

我目前正在尝试将我们的 elasticsearch 数据迁移到 2.0 兼容(即:字段名称中没有点),为从 1.x 升级到 2.x 做准备。

我编写了一个程序,它(批量)运行位于单节点集群中的数据,并重命名字段,使用批量 API 重新索引文档。

在某些时候,一切都会出错,并且从我的查询返回的文档总数(要“升级”)不会改变,即使它应该倒计时。

最初我以为它不起作用。当我选择一个文档并查询它以查看它是否正在更改时,我可以看到它正在工作。

但是,当我查询文档中的特定字段时,我会得到两个具有相同 ID 的结果。其中一项结果具有升级字段,另一项则没有。

经过进一步检查,我可以看到它们来自不同的分片:

{
  "took" : 2,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 2,
    "max_score" : 19.059433,
    "hits" : [ {
      "_shard" : 0,
      "_node" : "FxbpjCyQRzKfA9QvBbSsmA",
      "_index" : "status",
      "_type" : "status",
      "_id" : "http://static.photosite.com/80018335.jpg",
      "_version" : 2,
      "_score" : 19.059433,
      "_source":{"url":"http://static.photosite.com/80018335.jpg","metadata":{"url.path":["http://www.photosite.com/80018335"],"source":["http://www.photosite.com/80018335"],"longitude":["104.507755"],"latitude":["21.601669"]}},
      ...
    }, {
      "_shard" : 3,
      "_node" : "FxbpjCyQRzKfA9QvBbSsmA",
      "_index" : "status",
      "_type" : "status",
      "_id" : "http://static.photosite.com/80018335.jpg",
      "_version" : 27,
      "_score" : 17.607681,
      "_source":{"url":"http://static.photosite.com/80018335.jpg","metadata":{"url_path":["http://www.photosite.com/80018335"],"source":["http://www.photosite.com/80018335"],"longitude":["104.507755"],"latitude":["21.601669"]}},
      ...      
  }
}

我怎样才能防止这种情况发生?

弹性搜索版本: 1.7.3

query:

{
  "bool" : {
    "must" : {
      "wildcard" : {
        "metadata.url.path" : "*"
      }
    },
    "must_not" : {
      "wildcard" : {
        "metadata.url_path" : "*"
      }
    }
  }
}

编写文档的代码:

        BulkRequestBuilder bulkRequest = destinationConnection.getClient().prepareBulk();
        for(Map<String, Object> doc : batch.getDocs()){
            XContentBuilder builder;
            try {
                builder = XContentFactory.jsonBuilder().startObject();
                for(Map.Entry<String, Object> mapEntry : doc.entrySet()){
                    if(!mapEntry.getKey().equals("id")){
                        builder.field(mapEntry.getKey(), mapEntry.getValue());
                    }
                }
                builder.endObject();
            } catch (IOException e) {
                throw new DocumentBuilderException("Error building request to move items to new parent!", e);
            }

            bulkRequest.add(destinationConnection.getClient().prepareIndex(destinationIndex, destinationType, (String) doc.get("id")).setSource(builder).request());

        }
        // Tried with and without setRefresh
        BulkResponse response = bulkRequest.setRefresh(true).execute().actionGet();
        for(BulkItemResponse itemResponse : response.getItems()){
            if(itemResponse.isFailed()){
                LOG.error("Updating item: {} failed: {}", itemResponse.getFailure().getId(), itemResponse.getFailureMessage());
            }
        }

Update
可能是刷新/查询速度?

该程序设置为处理 5000 个文档批次,并且不使用滚动查询,因此我预计每次迭代从该查询返回的结果总数会减少 5000。

事实上这并没有发生。每次迭代从总结果集中删除的文档数量不断减少,直到最终每次迭代都相同:

10:43:42.220  INFO : Fetching another batch
10:43:51.701  INFO : Found 9260992 matching documents. Processing 5000...
10:43:51.794  INFO : Total remaining: 9260992
10:43:51.813  INFO : Writing batch of 5000 items
10:43:57.261  INFO : Fetching another batch
10:44:06.136  INFO : Found 9258661 matching documents. Processing 5000...
10:44:06.154  INFO : Total remaining: 9258661
10:44:06.158  INFO : Writing batch of 5000 items
10:44:11.369  INFO : Fetching another batch
10:44:19.790  INFO : Found 9256813 matching documents. Processing 5000...
10:44:19.804  INFO : Total remaining: 9256813
10:44:19.807  INFO : Writing batch of 5000 items
10:44:22.684  INFO : Fetching another batch
10:44:31.182  INFO : Found 9255697 matching documents. Processing 5000...
10:44:31.193  INFO : Total remaining: 9255697
10:44:31.196  INFO : Writing batch of 5000 items
10:44:33.852  INFO : Fetching another batch
10:44:42.394  INFO : Found 9255115 matching documents. Processing 5000...
10:44:42.406  INFO : Total remaining: 9255115
10:44:42.409  INFO : Writing batch of 5000 items
10:44:45.152  INFO : Fetching another batch
10:44:51.473  INFO : Found 9254744 matching documents. Processing 5000...
10:44:51.483  INFO : Total remaining: 9254744
10:44:51.486  INFO : Writing batch of 5000 items
10:44:53.853  INFO : Fetching another batch
10:44:59.966  INFO : Found 9254551 matching documents. Processing 5000...
10:44:59.978  INFO : Total remaining: 9254551
10:44:59.981  INFO : Writing batch of 5000 items
10:45:02.446  INFO : Fetching another batch
10:45:07.773  INFO : Found 9254445 matching documents. Processing 5000...
10:45:07.787  INFO : Total remaining: 9254445
10:45:07.791  INFO : Writing batch of 5000 items
10:45:10.237  INFO : Fetching another batch
10:45:15.679  INFO : Found 9254384 matching documents. Processing 5000...
10:45:15.703  INFO : Total remaining: 9254384
10:45:15.712  INFO : Writing batch of 5000 items
10:45:18.078  INFO : Fetching another batch
10:45:23.660  INFO : Found 9254359 matching documents. Processing 5000...
10:45:23.712  INFO : Total remaining: 9254359
10:45:23.725  INFO : Writing batch of 5000 items
10:45:26.520  INFO : Fetching another batch
10:45:31.895  INFO : Found 9254343 matching documents. Processing 5000...
10:45:31.905  INFO : Total remaining: 9254343
10:45:31.908  INFO : Writing batch of 5000 items
10:45:34.279  INFO : Fetching another batch
10:45:40.121  INFO : Found 9254333 matching documents. Processing 5000...
10:45:40.136  INFO : Total remaining: 9254333
10:45:40.139  INFO : Writing batch of 5000 items
10:45:42.381  INFO : Fetching another batch
10:45:47.798  INFO : Found 9254325 matching documents. Processing 5000...
10:45:47.823  INFO : Total remaining: 9254325
10:45:47.833  INFO : Writing batch of 5000 items
10:45:50.370  INFO : Fetching another batch
10:45:57.105  INFO : Found 9254321 matching documents. Processing 5000...
10:45:57.117  INFO : Total remaining: 9254321
10:45:57.121  INFO : Writing batch of 5000 items
10:45:59.459  INFO : Fetching another batch

看起来文档重复从一开始就很普遍。

我刚刚尝试了一个集群健康状态为绿色的两节点集群,并且发生了同样的事情。

接下来我将尝试使用没有复制的单节点。

Update:
以下是批量处理器侦听器数据之前/之后的示例:

Before:

Item( id=http://static.photosite.com/20160123_093502.jpg, index=status, type=status, op_type=INDEX, version=-3, parent=null, routing=null )

之后(BulkResponse 表明没有失败):

Item( id=http://static.photosite.com/20160123_093502.jpg, index=status, type=status, op_type=index, version=22)

注意事项:

  1. 没有父母
  2. 无路由
  3. 文档版本大幅跃升

此代码片段还没有明确指出,beforeBulk 请求中的每个项目都在 afterBulk 请求详细信息中表示为成功的 IndexRequest(即:没有丢失)。

Update 2

我认为最初的负面版本可能与此有关:https://discuss.elastic.co/t/negative-version-number-on-snapshot-restore-from-s3-bucket/56642 https://discuss.elastic.co/t/negative-version-number-on-snapshot-restore-from-s3-bucket/56642

Update 3

我刚刚发现,当我使用curl 查询文档时,版本是肯定的,即:

  1. 恢复快照。
  2. 使用curl查询文档,版本为2
  3. 使用java API查询文档,版本为-1
  4. 重新索引文档会导致版本为 1 的重复(具有相同 ID 的新文档写入不同的分片)。

这里发生了什么事?


执行摘要:
我是一个白痴。

Details:
我从今天开始学习elasticsearch 如何将文档路由到分片 https://www.elastic.co/guide/en/elasticsearch/guide/current/routing-value.html.

事实证明,它使用了以下公式: shard = hash(routing) % number_of_primary_shards

默认情况下,routing is the _id文档的内容,除非您在索引时覆盖它。

每个人都提到我在做路由,但我坚信我没有。这就是问题所在!

我已经恢复了数据快照。我尝试升级的索引中的数据最初是由一个名为风暴行者 https://github.com/DigitalPebble/storm-crawler/.

风暴行者does使用路由来索引这些文档,但因为我没有使用路由来重新索引它们,所以它在不同的分片上创建了明显的重复项。

再一次,elasticsearch 规则而我很糟糕。

对所有我在这件事上浪费时间的人表示抱歉。我现在要躺在黑暗的房间里哭泣。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

elasticsearch允许具有不同身体数据的重复ID 的相关文章

随机推荐

  • 在cakephp的AppController中调用AppModel函数

    我有一个希望所有控制器都能够使用的函数 因此我在 AppController 中定义了它 现在 此函数将执行的部分操作与控制器无关 因此它应该在模型中 但由于这是通用操作 因此它在 AppModel 中似乎才是正确的 我的函数如下所示 cl
  • 删除字符串 Python 中的 Unicode 代码 (\uxxx)

    我的文档中有一些 Unicode 字符串 我想要的只是删除这个 Unicode 代码或用一些空格 替换它 示例 doc Hello my name is Ruth u2026 I really like swimming and danci
  • 实体框架一对多插入 - 外键违规

    我是第一次使用实体框架 并且尝试使用集合创建一个对象 并且我希望集合中的所有对象也都在数据库中创建 但我遇到了一些外键违规 我的样本表 table APPOINTMENTS ID VAR1 DATE APPOINTMENT table GU
  • 如何在 Android 应用程序中从 Web 服务器获取数据? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在 Android 应用程序中从
  • Django - 将模型代码与数据库进行比较

    我维护一个 Django 项目 其中的数据库有几个与实际数据库不同步的模型约束 因此 例如 某些模型字段设置了 null False 但数据库允许相应的数据库列为 NULL 我很好奇 Django 或第三方 Python 脚本中是否有一个实
  • 如何为操作项(包括溢出菜单)的弹出窗口设置自定义颜色?

    背景 我正在努力为应用程序添加一些材料设计风格 因此我为操作栏和状态栏选择了不同的颜色 问题 为此 应用程序的主题是 Theme AppCompat Light DarkActionBar 并添加此主题以隐藏操作栏 因为我需要将其作为工具栏
  • 如何通过 Google Contacts API 创建新联系人?

    我正在创建一个新联系人 如中所述谷歌通讯录 API https developers google com google apps contacts v3 具体来说 我做了一个POST to https www google com m8
  • BigQuery - 从分区表中删除行

    我在 BigQuery 上有一个按日分区的表 当我尝试使用如下查询从表中删除某些行时 DELETE FROM MY DATASET partitioned table WHERE id 2374180 我收到以下错误 错误 分区表尚不支持
  • 需要在 Visual Studio 2010 中进行高效调试

    我经常使用Debug gt Exceptions gt check CLR Exceptions在调试会话期间 有时 会抛出并处理异常 但我真的想找到异常的来源 为了在不看到我不关心的第一次异常的情况下执行此操作 我启动我的应用程序 然后检
  • 使用 HTTPS 代替 HTTP

    我有一个用户必须登录的网站 我想使用 HTTPS 因此与服务器建立安全加密连接以检查用户名和密码 目前在我的服务器上我有一个名为 httpdocs 的文件夹 这是我的网站的存储位置 我还有一个名为 httpsdocs 的文件夹 现在正如我所
  • MongoDB updateMany,动态过滤字段

    使用 updateMany filter update option 时 如何为每个文档设置动态过滤字段 我有一系列这样的文档 time 1 data time 2 data time 3 data 每个都有一个唯一的时间戳 如果时间戳已经
  • 从另一个Java程序编译并运行Java程序[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 使用 CompileAndRun 类 我现在可以编译并运行我的 HelloWorld 类 现在我想用它来运行一个需要用户输入的程序 这可以是
  • 了解 MongoDB Aggregate 和 GroupBy

    我正在尝试在 MongoDB 中执行查询 首先按 id 进行分组 然后按降序排序 我这里有一个函数式 LINQ 表达式 var list this GetPackages ToList list list OrderByDescending
  • 为什么在使用自定义元素时会出现内部 Dartium 异常?

    我在控制台中看到此错误 Exception InvalidStateError Internal Dartium Exception PolymerDeclaration registerType package polymer src d
  • Maven:附加多个工件

    我有一个 Maven 项目 它使用一些自定义 jar 在任何存储库中都找不到 为了将它们与 Maven 构建一起添加 我在 Maven 中使用 Attach artifact 目标 以下是我的 pom 文件
  • 如何漂亮地打印 Golang 结构? [复制]

    这个问题在这里已经有答案了 我正在解组一个结构 我希望它以格式化的方式打印它 我的代码 https play golang org p D0KwGP6Cxa0 https play golang org p D0KwGP6Cxa0 当前产生
  • 宁静的API服务

    我正在寻找一项服务 可以用来调用基于 Web 的 REST API 基本上我想在 app init 上启动一个服务 然后我希望能够要求该服务请求一个 url 并返回结果 与此同时 我希望能够显示进度窗口或类似的东西 我目前已经创建了一个使用
  • 用酶测试连接的组件

    我正在学习采取本次测试课程 https www udemy com react testing with jest and enzyme 通过设置来测试连接的组件store factory测试助手 创建一个与我们商店的配置相匹配的测试商店
  • 如何向 javascript 类添加回调函数?

    javascript 中的以下代码给了我错误 this callback 不是一个函数 function ajaxRequest var httpObject this open open this callback function fu
  • elasticsearch允许具有不同身体数据的重复ID

    我目前正在尝试将我们的 elasticsearch 数据迁移到 2 0 兼容 即 字段名称中没有点 为从 1 x 升级到 2 x 做准备 我编写了一个程序 它 批量 运行位于单节点集群中的数据 并重命名字段 使用批量 API 重新索引文档