ElasticSearch - 唯一约束的解决方法

时间:2014-07-23 19:33:54

标签: database elasticsearch unique-constraint

我正在思考ElasticSearch中"没有唯一约束" 问题的一些智能解决方法。 我无法使用_id存储我的唯一字段,因为我将_id用于其他目的。

我抓取Internet页面并将它们存储在ElasticSearch索引中。我的规则是,url必须是唯一的(只有一个文档在索引中有给定的url),因此ElasticSearch不允许在一个字段上设置唯一约束,我必须在插入新页面之前查询索引以检查是否已经存在给定网址的网站。

因此,向文档添加新页面就像这样:

  1. 在ES中查询(匹配)索引以检查是否存在具有给定url字段的文档。
  2. 如果没有,我会插入新文件。
  3. 该解决方案有两个缺点:

    1. 我必须执行额外的查询以检查是否已存在具有给定网址的文档。它会减慢插入过程并产生额外负载。
    2. 如果我尝试在短时间内使用相同的网址添加2个文档并且索引在添加第二个文档之前没有刷新,则第二个查询返回,没有包含给定网址的文档,最后我有两个具有相同网址的文件
    3. 所以我正在寻找别的东西。如果您有任何想法请告诉我,或者请告诉我您对此类解决方案的看法:

      解决方案1 要使用其他数据库系统(或者在_id中使用url的另一个ES索引),我将只存储网址,我将查询它以检查是否已有网址

      解决方案2 2.在插入之前对文档进行排队,并在其他进程处理队列并将排队的文档添加到索引时禁用索引刷新。

1 个答案:

答案 0 :(得分:2)

与其他一些NoSQL解决方案相比,您已经遇到了Elasticsearch做得不好的事情之一(二级索引和约束)。除了解决方案1和解决方案2之外,我建议您查看Elasticsearch Rivers:

  

<强>河流

     

河流是在elasticsearch集群中运行的可插拔服务   提取数据(或用数据推送),然后将数据编入索引   群集。

例如,您可以使用MongoDB河,然后将数据插入MongoDB。 MongoDB支持辅助唯一索引,因此您可以防止插入重复的URL。然后,River将负责实时将数据推送到Elasticsearch。

https://github.com/richardwilly98/elasticsearch-river-mongodb

ES正式支持CouchDB,还有许多其他数据库也有河流 -