2

我想将 url 存储在索引中,但我想要唯一的 url。

我正在发出 POST 请求来存储我的文档,但我想避免基于 url 字段的重复文档。

有没有办法在 url 字段上指定唯一约束?

4

3 回答 3

3

我不知道,但您可以使用您的 url 作为文档 ID,这将使其有效地唯一。

于 2013-09-09T14:42:45.480 回答
1

您需要在此处采用的策略是为每个文档创建一个唯一的密钥。在您的情况下,选择 URL 作为文档 ID。

如果 URL 很长,则使用 sha1 或类似算法获取校验和将完成获取 URL 的唯一密钥的工作。将此作为文档 ID,以便始终只出现一页。如果您不想索引新的重复项(更高效),请再次使用 _create API 来索引,如果您希望新的重复项成为文档,请使用普通索引。

如果发现重复文档需要修改原始文档,请使用 upser。

我已经在这个博客中讨论了很多这个话题。

于 2015-12-10T16:30:17.883 回答
0

这是仅索引唯一值的两步解决方案:

  1. 您可以在 url 字段上使用Unique Tokenfilter来仅存储唯一的 url:

    {
    "settings": {
        "analysis": {
            "analyzer": {
                "uniqueTokenfilter": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": "unique"
                }
            }
        }
    },
    "mappings": {
        "index" : {
            "properties": {
                "url": {
                    "type": "string",
                     "analyzer": "unique"
                 }
             }
         }
     }
     }
    
  2. 然后,您可以执行 Scroll Term Query 以仅返回具有唯一 url 的文档。您可以将这些返回的文档指向一个单独的索引,创建一个只有唯一 url 的索引。

    
    curl -XGET localhost:9200/index/doc/_search?scroll=5m -d '{
       "query": {
           "term" : "url"
        }
    }'
    

**您可能想要的是索引所有文档,但仅查询唯一字段值。这称为分组/字段折叠,目前 Elasticsearch 不支持。

于 2013-09-10T03:50:07.113 回答