我正在思考ElasticSearch中"没有唯一约束" 问题的一些智能解决方法。
我无法使用_id
存储我的唯一字段,因为我将_id
用于其他目的。
我抓取Internet页面并将它们存储在ElasticSearch索引中。我的规则是,url必须是唯一的(只有一个文档在索引中有给定的url),因此ElasticSearch不允许在一个字段上设置唯一约束,我必须在插入新页面之前查询索引以检查是否已经存在给定网址的网站。
因此,向文档添加新页面就像这样:
url
字段的文档。该解决方案有两个缺点:
所以我正在寻找别的东西。如果您有任何想法请告诉我,或者请告诉我您对此类解决方案的看法:
解决方案1
要使用其他数据库系统(或者在_id
中使用url的另一个ES索引),我将只存储网址,我将查询它以检查是否已有网址
解决方案2 2.在插入之前对文档进行排队,并在其他进程处理队列并将排队的文档添加到索引时禁用索引刷新。
答案 0 :(得分:2)
与其他一些NoSQL解决方案相比,您已经遇到了Elasticsearch做得不好的事情之一(二级索引和约束)。除了解决方案1和解决方案2之外,我建议您查看Elasticsearch Rivers:
<强>河流强>
河流是在elasticsearch集群中运行的可插拔服务 提取数据(或用数据推送),然后将数据编入索引 群集。
例如,您可以使用MongoDB河,然后将数据插入MongoDB。 MongoDB支持辅助唯一索引,因此您可以防止插入重复的URL。然后,River将负责实时将数据推送到Elasticsearch。
https://github.com/richardwilly98/elasticsearch-river-mongodb
ES正式支持CouchDB,还有许多其他数据库也有河流 -