我想将网址存储在索引中,但我想要唯一的网址。
我正在发出POST请求来存储我的文档,但我想避免基于url字段的重复文档。
有没有办法在url字段上指定唯一约束?
答案 0 :(得分:3)
我不知道,但您可以使用您的网址作为文档ID,这将使其有效独特。
答案 1 :(得分:0)
以下是 index 的两步解决方案,只有唯一值:
您可以使用网址字段上的Unique Tokenfilter仅存储唯一网址:
{
"settings": {
"analysis": {
"analyzer": {
"uniqueTokenfilter": {
"type": "custom",
"tokenizer": "keyword",
"filter": "unique"
}
}
}
},
"mappings": {
"index" : {
"properties": {
"url": {
"type": "string",
"analyzer": "unique"
}
}
}
}
}
然后,您可以执行滚动条款查询以仅返回具有唯一网址的文档。您可以将这些返回的文档定向到单独的索引,从而创建仅包含唯一URL的索引。
curl -XGET localhost:9200/index/doc/_search?scroll=5m -d '{
"query": {
"term" : "url"
}
}'
**您可能想要的是索引所有文档,但查询仅用于唯一字段值。这称为grouping/field collapsing,目前Elasticsearch不支持。
答案 2 :(得分:0)
您需要采用的策略是为每个文档创建一个唯一键。在您的情况下,选择URL作为文档ID。
如果URL很长,使用sha1或类似算法进行校验和将获得获取URL的唯一键的工作。将其设为文档ID,以便在任何时间点只出现一个页面。如果您不希望索引新的重复项(更高效),请再次使用_create API进行索引,如果您希望新文档使用正常索引,则使用_create API。
如果您需要在发现重复文档时修改原始文档,请使用upser。
我已经在这个blog中讨论了很多这个话题。