ElaticSearch在删除空格和空格字符后查找所有重复项



我们的弹性搜索集群中有大约100000个文档。我正在尝试查找一个查询,以便我们可以根据某些字段查找重复的文档。我可以运行这个查询:

{
"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"
                                    }
                        }
            }
 }
}

谨致问候,帕万。

可以在terms聚合中使用脚本而不是字段名:

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

在Elasticsearch 1.5中,在单个查询中不可能做到这一点。我能想到的一个解决方案是,你可以滚动浏览文档,维护类似字段的哈希集。遍历100000个文档不应该占用那么多内存。

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

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

最新更新