elasticsearch基于字段查询重复数据

terms聚合

要查completed_product_xxx索引里product_id重复的数据,用ES DSL可以直接用terms聚合:

1
2
3
4
5
6
7
8
9
10
11
12
13
GET /completed_product_xxx/_search
{
"size": 0,
"aggs": {
"duplicate_product_ids": {
"terms": {
"field": "product_id",
"min_doc_count": 2,
"size": 10000
}
}
}
}

这里的size:10000不是查询文档数量10000,而是控制terms聚合最终返回多少个product_id桶。

返回结果里的:

1
2
3
4
5
6
"buckets": [
{
"key": "2009398068101774300",
"doc_count": 2
}
]

就表示product_id=2009398068101774300出现了2次。

把重复的完整文档查出来

可以用terms+top_hits

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
GET /completed_product_xxx/_search
{
"size": 0,
"aggs": {
"duplicate_product_ids": {
"terms": {
"field": "product_id",
"min_doc_count": 2,
"size": 10000
},
"aggs": {
"docs": {
"top_hits": {
"size": 100
}
}
}
}
}
}

如果product_idtext类型,需要改成:

1
"field": "product_id.keyword"

如果只想查product_id=2009398068101774300是否重复

更简单:

1
2
3
4
5
6
7
8
9
GET /completed_product_10026_xxx/_search
{
"query": {
"term": {
"product_id": 2009398068101774300
}
},
"size": 100
}

size区别

DSL位置 size含义
_search下面的"size":0 返回0条原始文档
_search下面的"size":10000 最多返回10000条原始文档
terms下面的"size":10000 最多返回10000个不同的聚合桶
1
"size": 0

+:

1
2
3
"terms": {
"size": 10000
}

扫描/聚合索引中的数据,找出重复的product_id,但最终最多返回10000个重复的product_id