Utilisation de la cardinalité pour dédupliquer
les statistiques. Généralement, nous utilisons elasticsearch pour dédupliquer les résultats statistiques en utilisant la cardinalité dans l'agrégation. Par exemple, il existe un champ "one_account.one_account_no" et la valeur "one_account.one_account_no" en deux documents est à la fois 111, alors le résultat de la
déduplication de "uid" est 2. instruction dsl:
POST user_onoffline_log/_search
{
"query": {
"match_all": {
}
},
"size": 0,
"aggs": {
"uid_aggs": {
"cardinality": {
"field": "one_account.one_account_no"
}
}
}
}
résultat:
{
"took": 565,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 21,
"max_score": 0,
"hits": []
},
"aggregations": {
"one_account_no_aggs": {
"value": 14
}
}
}
Vous pouvez voir que la valeur de comptage du champ uid après la déduplication à l'aide de la cardinalité est de 14.
Réduire pour dédupliquer le contenu L' utilisation ci-dessus de la cardinalité pour dédupliquer est utilisée comme statistique. Si nous voulons interroger tous les one_account_no après la déduplication au lieu d'obtenir simplement un nombre 14, nous pouvons utiliser la réduction pour dédupliquer le contenu.
instruction dsl:
GET customer/_search
{
"from": 0,
"size": 5,
"query": {
"bool": {
"filter": [
{
"exists": {
"field": "one_account.one_account_no",
"boost": 1
}
}
]
}
},
"collapse": {
"field": "one_account.one_account_no"
},
"_source": {
"includes": [
"one_account.one_account_no"
],"excludes": []
},
"aggregations": {
"count": {
"cardinality": {
"field": "one_account.one_account_no"
}
}
}
}
Remarque: Exists filtre l'existence du champ one_account.one_account_no, collapse ne prend qu'un seul affichage pour plusieurs identiques, _source doit renvoyer le champ affiché, la déduplication de cardinalité compte le nombre de one_account.one_account_no
résultat:
{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 6,
"successful" : 6,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 21,
"max_score" : 0.0,
"hits" : [
{
"_index" : "customer_v2025",
"_type" : "customer_info",
"_id" : "105100015130",
"_score" : 0.0,
"_source" : {
"one_account" : {
"one_account_no" : "105100015130"
}
},
"fields" : {
"one_account.one_account_no" : [
"105100015130"
]
}
},
{
"_index" : "customer_v2025",
"_type" : "customer_info",
"_id" : "99522458",
"_score" : 0.0,
"_source" : {
"one_account" : {
"one_account_no" : "99522458"
}
},
"fields" : {
"one_account.one_account_no" : [
"99522458"
]
}
},
{
"_index" : "customer_v2025",
"_type" : "customer_info",
"_id" : "105500032110",
"_score" : 0.0,
"_source" : {
"one_account" : {
"one_account_no" : "105500032110"
}
},
"fields" : {
"one_account.one_account_no" : [
"105500032110"
]
}
},
{
"_index" : "customer_v2025",
"_type" : "customer_info",
"_id" : "110600001247",
"_score" : 0.0,
"_routing" : "110600001247",
"_source" : {
"one_account" : {
"one_account_no" : "110600001248"
}
},
"fields" : {
"one_account.one_account_no" : [
"110600001248"
]
}
},
{
"_index" : "customer_v2025",
"_type" : "customer_info",
"_id" : "110600000858",
"_score" : 0.0,
"_source" : {
"one_account" : {
"one_account_no" : "110600000858"
}
},
"fields" : {
"one_account.one_account_no" : [
"110600000858"
]
}
}
]
},
"aggregations" : {
"count" : {
"value" : 14
}
}
}
On peut voir qu'il y en a 21 au total contenant one_account.one_account_no, et 14 après avoir supprimé les doublons.
Comme la pagination à partir de la taille est utilisée, seuls 5 des appels sont renvoyés. Pour afficher les 14 d'entre eux, vous pouvez passer de Is 5 ou 10, pour afficher les 2e et 3e pages.
Code Java:
SearchRequest searchRequest = new SearchRequest("customer");
searchRequest.types("customer_info");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(QueryBuilders.existsQuery("one_account.one_account_no"));
searchSourceBuilder.collapse(new CollapseBuilder("one_account.one_account_no"));
searchSourceBuilder.aggregation(AggregationBuilders.cardinality("count").field("one_account.one_account_no"));
searchSourceBuilder.from(0);
searchSourceBuilder.size(5);
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchresponse = restHighLevelClient.search(searchRequest);
Référence:
requête de déduplication Elasticsearch