如何在elasticsearch 6中查找重复结果

问题描述 投票:0回答:1

我有版本 6 的 Elasticsearch,现在我需要通过具有相同字段值的字段“userName”在索引“es_index”中查找重复文档。这意味着我需要编写像sql这样的查询:

  select userName, count(*) from es_index group by userName having count(*) > 1

如何为 es 编写 DSL?

添加:
类似的问题“如何在ElasticSearch中查找所有重复文档”,无法解决我的问题。结果是中文分词(分词)之后。例如,我有 3 个文档,字段“userName”为“上海某公司”、“北京另一公司”、“上海某公司”(重复),但结果如下:

{
    "aggregations": {
        "buckets": [
            {
                "key": "公",
                "doc_count": 3
            },{
                "key": "司",
                "doc_count": 3
            },{
                "key": "上",
                "doc_count": 2
            },{
                "key": "海",
                "doc_count": 2
            }
        ]
    }
}

相反,我想要没有分词的aggs,可能如下:

"key": "上海某公司",
"doc_count": 2

我搜索了很多,尝试了很多,但仍然没有得到答案。

elasticsearch count having
1个回答
0
投票

我已经解决了这个问题。 “userName”字段类型为文本,因此将对其进行分词。所以我添加了一个新字段并在新字段中添加了聚合。
首先,我添加一个带有类型关键字的新字段“userNameKw”。

PUT /index/_mapping/type
{
  "properties": {
    "userNameKw": {
      "type": "keyword"
    }
  }
}

其次,将“userName”的值分配给新字段“userNameKw”。

POST /index/type/_update_by_query
{
  "query": {
    "match_all": {}
  },
  "script": {
    "inline": "ctx._source.userNameKw = ctx._source.userName;",
    "lang": "painless"
  }
}

最后,在新字段进行聚合,就像“如何在 ElasticSearch 中查找所有重复文档”一样。

GET /index/type/_search
{
  "size": 0,
  "aggs": {
    "userNameAgg": {
      "terms": {
        "field": "userNameKw",
        "min_doc_count":2
      }
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.