【问题标题】:How to ensure uniqueness when elasticsearch is inserted in multithreading?多线程插入elasticsearch时如何保证唯一性?
【发布时间】:2019-10-25 01:58:56
【问题描述】:

我们有一些 elasticsearch 的文档。文档的唯一性是由一些字段共同决定的,java多线程判断是否存在并插入时如何保证唯一性。

之前不知道有什么好方法,所以写了一个方法:我猜如果存在,如果不存在就插入,这个方法是通过syncronized修改的。但我发现这是一种非常低效的做法。

/**
 * @param document
 */
synchronized void selectAndInsert(Map<String, Object> document){
    //Determine if it exists, insert it if it does not exist
}

我的映射如下: {"properties":{"pt_number":{ "type":"keyword" }, "pt_name":{"type":"keyword" },"pt_longitude":{ "type":"text"},"pt_latitude ":{"type":"text" },"rd_code":{ "type":"text" }, "rd_name":{ "type":"keyword"}, "area_code":{ "type":"关键字"} ...等等}}

唯一性由 area_code、pt_longitude 和 pt_latitude 确定。插入文档时,我会根据area_code、pt-longitude、pt_latitude判断是否存在,不存在则插入。 java多线程运行时如何保证文档的唯一性?

这个问题困扰了我一段时间。谁能帮助我,我将不胜感激。

【问题讨论】:

    标签: java elasticsearch concurrency insert unique


    【解决方案1】:

    没有办法仅通过索引中的属性以任何方式保证不存在这样的文档。即使您检查它是否存在于索引中并且没有看到它,在发出该操作的响应和您的索引请求被 ES 接受之间也有一段时间。

    所以基本上你只有两种方法:

    • 保证索引操作的单次执行(冗长且不那么简单的方法,因为我们没有完全一次性的系统)
    • 将文档的唯一属性转换为文档 ID,因此即使您的索引操作重叠,它们也只会将相同的值写入同一个文档(或者第二个及后续的值将失败,具体取决于请求选项)。

    后一个很简单,你有一些开箱即用的选择:

    • 按确定的顺序获取所有唯一属性并连接它们的字符串表示形式(丑陋)
    • 按确定的顺序获取所有唯一属性,连接它们的字节值并使用 Base64 进行编码(不那么难看)
    • 按确定的顺序获取所有唯一属性,通过散列函数(md5、sha-X 系列,任何你喜欢的)传递它们,并使用字符串表示结果。

    【讨论】:

    • 感谢您的回复。我认为第二种解决方案可能是最合适的。在我当前的项目中,我可能需要一些时间来重置文档_id。幸运的是,document_id 并没有在项目中广泛使用。
    【解决方案2】:

    如果您检测到插入,为什么不在插入完成(和索引刷新...)后检查您是否没有重复。第二种解决方案是使用批量插入更新数据包写入每个 X(= 将新文档存储在共享区域的列表中,因此您可以检查您的文档是否已经存在,并每 10 秒写入一次此列表示例)。

    【讨论】:

    • 感谢您的建议。我会考虑这是否适合我的项目。
    【解决方案3】:

    常见的情况可能是您以某种方式发送了文档(例如 kafka)并希望确保没有重复。据我所知,ElasticSearch 中没有这种方法,尽管您可以在这里尝试一个技巧:

    • ElasticSearch 允许提供自定义文档 ID
    • 文档 ID 长度限制为 512 字节,不能用于正常的“处理”

    您可能希望根据您的字段(如数据库中的主键)创建一个 ID。如果使用 _create,那么只有当它不存在时才会创建您的文档。

    但仍有一些问题有待解决: 如何生成身份证?简单的串联会起作用,但前提是您确定总长度不会超过 512B。否则可以使用校验和 - 但碰撞的可能性很小。 如果收到几乎相同的文档该怎么办(您的密钥相同但存在其他一些差异)。 Elastic 只允许“替换”或“不替换”。您需要处理其他情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      相关资源
      最近更新 更多