Elasticsearch utilise la réduction pour dédupliquer le contenu

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

Je suppose que tu aimes

Origine blog.csdn.net/qq_33697094/article/details/109735592
conseillé
Classement