在多线程中插入Elasticsearch时如何确保唯一性?

问题描述 投票:0回答:2

我们有一些elasticsearch文件。文档的唯一性由一些字段共同决定,当Java多线程确定文件是否存在并被插入时如何确保唯一性。

我以前不知道有什么好的方法,所以我写了一个方法:我猜它是否存在,如果不存在,我将其插入,并通过同步化对该方法进行修改。但是我发现这是一种非常低效的做法。

/**
 * @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
2个回答
0
投票

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


0
投票

没有办法仅通过索引中的属性来保证没有这样的文档。即使您检查它是否存在于索引中但没有看到它,在发出该操作的响应与ES接受您的索引请求之间仍有一段时间。因此,基本上,您只有两种方法:保证索引操作的单一执行(长而又不太容易的方法,因为我们没有精确的一次系统),或者保证它基于文档ID的唯一性。后者非常简单,因为您可以仅基于那些具有足够低冲突概率的字段来计算一些值,并将其作为文档ID传递,因此,您将针对此类结构发出的任何请求都将以相同的ID结尾。 “计算某个值”可能很简单,例如,串联这些字段的字符串表示形式(丑陋),串联那些字段的原始字节值并对其进行base64编码(丑陋的丑陋),然后通过您喜欢的哈希函数(md5,sha- X个家庭,依此类推),或者您可以提出的其他任何建议-仔细考虑一下,这样就不必在一天之内更改计划。

© www.soinside.com 2019 - 2024. All rights reserved.