ElaticSearch删除空格和空格字符后发现所有重复项

时间:2018-08-03 02:00:32

标签: elasticsearch

我们的弹性搜索集群中大约有100,000个文档。我试图找到一个查询,以便我们可以根据某些字段找出重复的文档。 我可以运行此查询:

{
  "size": 0,
  "aggs": {
     "duplicateCount": {
        "terms": {
          "field": "name",
          "min_doc_count": 2
        },
        "aggs": {
          "duplicateDocuments": {
          "top_hits": {}
         }
     }
  }
}

但是我们的某些文档具有相似的价值。例如,两个不同的文档具有名称:“ pawan”和名称:“ paw-an”,我们希望将它们视为同一文档。我找不到任何说出replaceAll的方法,然后运行此查询。有什么办法吗?我们使用的是ElasticSearch 1.5,因此对于此类功能而言可能太旧了。谢谢。

映射:

{
  "mappings":{
            "employeeinfo":{
                        "_all" : {"enabled" : true},
                        "properties":{
                                    "name":{
                                              “type":"string"
                                    },
                                    "age":{
                                                "type":"long"
                                    }
                        }
            }
 }
}

关于, 帕湾。

2 个答案:

答案 0 :(得分:1)

可以使用script in your terms aggregation代替字段名:

{
  "size": 0,
  "aggs": {
     "duplicateCount": {
        "terms": {
          "script": "_source.name.replaceAll('-', '')",
          "min_doc_count": 2
        },
        "aggs": {
          "duplicateDocuments": {
          "top_hits": {}
         }
     }
  }
}

答案 1 :(得分:0)

在单个查询中,在Elasticsearch 1.5中无法做到这一点。我能想到的一种解决方案是,您可以滚动文档以维护相似字段的哈希集。遍历100,000个文档不应该占用大量内存。

然后您可以按以下方式应用聚合查询:

{
  "size": 0,
  "aggs": {
     "duplicateCount": {
        "terms": {
          "field": "name",
          "include": ["pawan", "paw-an"],
          "min_doc_count": 2
        },
        "aggs": {
          "duplicateDocuments": {
          "top_hits": {}
         }
     }
  }
}