我有版本 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
我搜索了很多,尝试了很多,但仍然没有得到答案。
我已经解决了这个问题。 “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
}
}
}
}