PUT /testcase
{
“settings”: {
“number_of_replicas”: 1,
“number_of_shards”: 2
},
“mappings” : {
“t1” : {
“properties” : {
“name” : {
“type” : “keyword”
},
“value” : {
“type” : “long”
}
}
}
}
}
Ensuite, il y a l'importation de données.
Pour l'exactitude des tests,Fabriquer les données d'essai comme suit::
SelonnameAgrégation des champs,nameNe devrait pas avoir trop de valeur,Sinon, il y aura trop de seaux et de mauvais résultats d'analyse.;
Peut spécifier avec précision quelles données doivent être divisées1,Qui va au fractionnement2;
Pour ces données d'essai,Voici d'abord les résultats de l'agrégation(Calculé lors de la production des données),Avec ces résultats,,Et nous pouvonsesComparer les résultats de l'agrégation,Trouver le problème:
Tranche I,Appuyez.nameAprès agrégation,nameMême documentvalueSomme des champs:
14 : 22491 //14- Oui.name,22491C'est tout.nameégal à14Du documentvalueSomme des champs
8 : 21632
4 : 21502
15 : 21234
26 : 20731
10 : 20306
《Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Notes d'apprentissage pour le développement de l'arrière - plan+La dernière vidéo d'architecture+Document d'information sur le code source du projet en direct》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 Partage open source du contenu complet
17 : 19942
9 : 19418
25 : 19191
16 : 18797
6 : 18306
3 : 18166
22 : 17669
24 : 16971
27 : 16911
18 : 16758
23 : 16527
13 : 15705
7 : 15251
11 : 15019
12 : 14387
2 : 14329
30 : 14023
5 : 13421
29 : 13309
1 : 12574
28 : 12189
19 : 11673
21 : 11460
20 : 10576
Tranche 2 ,Appuyez.nameAprès agrégation,nameMême documentvalueSomme des champs:
19 : 168589
21 : 164705
16 : 162088
9 : 161579
8 : 160459
28 : 159775
15 : 158124
26 : 156609
24 : 156208
11 : 153976
4 : 153479
23 : 152833
12 : 152052
20 : 150718
29 : 150320
17 : 149352
10 : 148473
2 : 147812
5 : 147791
3 : 146158
6 : 145604
7 : 145439
18 : 144984
13 : 144784
14 : 144004
27 : 143564
30 : 140984
22 : 140309
25 : 133879
1 : 133233
Toutes les données,Appuyez.nameAprès agrégation,nameMême documentvalueSomme des champs:
8 : 182091
9 : 180997
16 : 180885
19 : 180262
15 : 179358
26 : 177340
21 : 176165
4 : 174981
24 : 173179
28 : 171964
23 : 169360
17 : 169294
11 : 168995
10 : 168779
14 : 166495
12 : 166439
3 : 164324
6 : 163910
29 : 163629
2 : 162141
18 : 161742
20 : 161294
5 : 161212
7 : 160690
13 : 160489
27 : 160475
22 : 157978
30 : 155007
25 : 153070
1 : 145807
Cet ensemble de données existe bulk.jsonDans le document, Vous pouvez télécharger ici :
https://raw.githubusercontent.com/zq2599/blog_demos/master/files/bulk.json
Après le téléchargement,Aveccurl La commande importe ces données :
curl -H ‘Content-Type: application/x-ndjson’ -s -XPOST http://192.168.50.75:9200/testcase/t1/_bulk --data-binary @bulk.json
Inbulk.jsonMoyenne,Parrouting Pour déterminer dans quelle tranche les données seront ,A été validérouting=a Le Premier fragment est écrit ,routing=b Écrivez la deuxième tranche à ,Donc toutbulk.jsonDansrouting La valeur de aEtbDeux.;
Les données et les résultats statistiques ci - dessus sont utilisés javaProduit, L'adresse source correspondante est ici :
https://raw.githubusercontent.com/zq2599/blog_demos/master/files/GenerateESAggSortData.java
Maintenant que les données sont prêtes , Vous pouvez répéter la question ;
Après l'importation réussie des données ,Exécuter la commande suivante,SelonnameFaire une agrégation,Oui.name Même document value Ajouter les valeurs des champs :
GET /testcase/t1/_search
{
“size”:0,
“aggs”:{
“names”:{
“terms”: {
“field”: “name”,
“size” :5,
“order”: {
“values”: “desc”
}
},
“aggs”: {
“values”: {
“sum”: {
“field”: “value”
}
}
}
}
}
}
Les résultats sont les suivants::
“buckets” : [
{
“key” : “8”,
“doc_count” : 356,
“values” : {
“value” : 182091.0
}
},
{
“key” : “9”,
“doc_count” : 356,
“values” : {
“value” : 180997.0
}
},
{
“key” : “16”,
“doc_count” : 351,
“values” : {
“value” : 180885.0
}
},
{
“key” : “15”,
“doc_count” : 347,
“values” : {
“value” : 179358.0
}
},
{
“key” : “26”,
“doc_count” : 353,
“values” : {
“value” : 177340.0
}
}
]
Le problème s'est posé.,Dans les données retournées,Quatrième placename- Oui.15,Mais en fait,19 C'est la quatrième place , La liste de comparaison est la suivante :
| Classement | Données réelles | ElasticsearchRetour |
| — | — | — |
| 1 | 8 : 182091 | 8:182091 |
| 2 | 9 : 180997 | 9:180997 |
| 3 | 16 : 180885 | 16:180885 |
| 4 | 19 : 180262 | 15:179358 |
| 5 | 15 : 179358 | 26:177340 |
Dans les opérations de tri agrégé , En fait, chaque tranche elle - même trie d'abord , Ensuite, avant chaque tranche 17 Les noms se regroupent à nouveau ,Réorganiser, Avant de trier après 5 Les enregistrements sont retournés comme résultat ;
Pourquoi utiliser avant chaque tranche 17Nom? C'est en utilisant la formule officielle ,L'adresse est: https://www.elastic.co/guide/en/elasticsearch/reference/6.1/search-aggregations-bucket-terms-aggregation.html ,Comme le montre la figure ci - dessous::
Si la demande n'est envoyée qu'à un seul fragment , Juste avant de revenir 5Article (s), Si vous envoyez plus d'une tranche , Le nombre d'entrées retournées par tranche est :5*1.5+10=17
En utilisant une image pour décrire ,Comme le montre la figure ci - dessous:, Violet dans les données agrégées , Est synthétisé à partir de la couleur pourpre des Parties I et II :
Comme le montre la figure ci - dessus, Avant la première tranche 17In record (s),Non.nameégal à19Les dossiers de( Parce que le classement de l'enregistrement dans la tranche 1 est 28), Donc après l'agrégation des données des deux tranches ,nameégal à19 L'enregistrement n'est disponible que dans les données de la tranche 2 ,C'est - à - dire:19:168589, Cette valeur n'est pas en tête des données agrégées 5De,Et donc,ESRetour àTop5 Avec des données réelles Top5C'est différent,C'est ça.Elasticsearch Raisons du mauvais tri après agrégation .
Voyons comment résoudre ce problème
Il est facile de savoir pourquoi le problème est résolu : Si chaque tranche n'est pas retournée avant 17Nom, Mais avant. 28Nom, Donc les deux tranches contiennent nameégal à19Les dossiers de, Ce paramètre qui spécifie le nombre de retours de tranches est shard_size,Plusshard_size La requête complète pour le paramètre est la suivante :
GET /testcase/t1/_search
{
“size”:0,
“aggs”:{
“names”:{
“terms”: {
“field”: “name”,
“size” :5,
“shard_size”: 28,
“order”: {
“values”: “desc”
}
Chaque entrevue est l'occasion de tester vos connaissances et vos compétences techniques,Après l'entrevue, il est recommandé de résumer et de répondre rapidement,Détection des lacunes,Ensuite, l'apprentissage ciblé,Cela augmente les chances de succès de la prochaine entrevue,Peut également augmenter sa propre réserve de connaissances techniques,C'est un double coup..
..Ali, le dernier résumé ci - dessousP6SeniorJavaChamp d'application et réponses des questions obligatoires,Contient le plus completMySQL、Redis、JavaProgrammation simultanée, etc. questions d'entrevue et réponses,Pour référence~
Dis trois fois quelque chose d'important.,Attention+Attention+Attention!
Plus de partage de notes
Cet article a été publié par CODINGProjet Open Source:【Grandes usines de première ligneJavaAnalyse des questions d'entrevue+Résumé de base notes d'étude+Dernière vidéo d'explication+Code source du projet opérationnel】Inclus