我想将 url 存储在索引中,但我想要唯一的 url。
我正在发出 POST 请求来存储我的文档,但我想避免基于 url 字段的重复文档。
有没有办法在 url 字段上指定唯一约束?
我想将 url 存储在索引中,但我想要唯一的 url。
我正在发出 POST 请求来存储我的文档,但我想避免基于 url 字段的重复文档。
有没有办法在 url 字段上指定唯一约束?
我不知道,但您可以使用您的 url 作为文档 ID,这将使其有效地唯一。
您需要在此处采用的策略是为每个文档创建一个唯一的密钥。在您的情况下,选择 URL 作为文档 ID。
如果 URL 很长,则使用 sha1 或类似算法获取校验和将完成获取 URL 的唯一密钥的工作。将此作为文档 ID,以便始终只出现一页。如果您不想索引新的重复项(更高效),请再次使用 _create API 来索引,如果您希望新的重复项成为文档,请使用普通索引。
如果发现重复文档需要修改原始文档,请使用 upser。
我已经在这个博客中讨论了很多这个话题。
这是仅索引唯一值的两步解决方案:
您可以在 url 字段上使用Unique Tokenfilter来仅存储唯一的 url:
{
"settings": {
"analysis": {
"analyzer": {
"uniqueTokenfilter": {
"type": "custom",
"tokenizer": "keyword",
"filter": "unique"
}
}
}
},
"mappings": {
"index" : {
"properties": {
"url": {
"type": "string",
"analyzer": "unique"
}
}
}
}
}
然后,您可以执行 Scroll Term Query 以仅返回具有唯一 url 的文档。您可以将这些返回的文档指向一个单独的索引,创建一个只有唯一 url 的索引。
curl -XGET localhost:9200/index/doc/_search?scroll=5m -d '{
"query": {
"term" : "url"
}
}'
**您可能想要的是索引所有文档,但仅查询唯一字段值。这称为分组/字段折叠,目前 Elasticsearch 不支持。