自定义索引或唯一约束

时间:2013-09-08 21:39:26

标签: elasticsearch

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

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

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

3 个答案:

答案 0 :(得分:3)

我不知道,但您可以使用您的网址作为文档ID,这将使其有效独特。

答案 1 :(得分:0)

以下是 index 的两步解决方案,只有唯一值:

  1. 您可以使用网址字段上的Unique Tokenfilter仅存储唯一网址:

    {
    "settings": {
        "analysis": {
            "analyzer": {
                "uniqueTokenfilter": {
                    "type": "custom",
                    "tokenizer": "keyword",
                    "filter": "unique"
                }
            }
        }
    },
    "mappings": {
        "index" : {
            "properties": {
                "url": {
                    "type": "string",
                     "analyzer": "unique"
                 }
             }
         }
     }
     }
    
  2. 然后,您可以执行滚动条款查询以仅返回具有唯一网址的文档。您可以将这些返回的文档定向到单独的索引,从而创建仅包含唯一URL的索引。

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

  3. **您可能想要的是索引所有文档,但查询仅用于唯一字段值。这称为grouping/field collapsing,目前Elasticsearch不支持。

答案 2 :(得分:0)

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

如果URL很长,使用sha1或类似算法进行校验和将获得获取URL的唯一键的工作。将其设为文档ID,以便在任何时间点只出现一个页面。如果您不希望索引新的重复项(更高效),请再次使用_create API进行索引,如果您希望新文档使用正常索引,则使用_create API。

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

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