ElasticSearch ne renvoie que les documents avec une valeur distincte
Disons que j'ai ce compte tenu des données
{
"name" : "ABC",
"favorite_cars" : [ "ferrari","toyota" ]
}, {
"name" : "ABC",
"favorite_cars" : [ "ferrari","toyota" ]
}, {
"name" : "GEORGE",
"favorite_cars" : [ "honda","Hyundae" ]
}
Chaque fois que j'ai une requête de ces données lors de la recherche pour les personnes qui préféré de voiture de toyota, elle renvoie ces données
{
"name" : "ABC",
"favorite_cars" : [ "ferrari","toyota" ]
}, {
"name" : "ABC",
"favorite_cars" : [ "ferrari","toyota" ]
}
le résultat est de Deux enregistrements de avec un nom de ABC. Comment puis-je sélectionner des documents distincts? Le résultat que je veux obtenir est seulement ce
{
"name" : "ABC",
"favorite_cars" : [ "ferrari","toyota" ]
}
Voici ma Requête
{
"fuzzy_like_this_field" : {
"favorite_cars" : {
"like_text" : "toyota",
"max_query_terms" : 12
}
}
}
J'utilise ElasticSearch 1.0.0. avec l'api java client
source d'informationauteur user962206
Vous devez vous connecter pour publier un commentaire.
Vous pouvez éliminer les doublons à l'aide de les agrégations. Avec terme de l'agrégation les résultats seront regroupés en un seul domaine, par exemple,
name
fournir également un compte d'ocurrences de chaque valeur du champ, et va trier les résultats par ce nombre (décroissant).En plus de la
hits
le résultat sera également contenir lebuckets
avec les valeurs uniques danskey
et avec le comtedoc_count
:Noter que l'utilisation d'agrégations sera coûteux en raison de la double élimination et le tri des résultats.
ElasticSearch ne fournit pas de requête par laquelle vous pouvez obtenir des documents distincts en fonction d'une valeur de champ.
Idéalement, vous devriez avoir indexé le même document avec même type et id depuis ces deux choses sont utilisés par ElasticSearch pour donner un _uid id unique pour un document. Identifiant Unique est important de ne pas seulement en raison de sa méthode de détection des doublons de documents, mais également la mise à jour de la même document dans le cas de toute modification au lieu d'en insérer un nouveau. Pour plus d'informations sur l'indexation des documents, vous pouvez lire cette.
Mais il est certainement un travail autour de votre problème. Puisque vous êtes à l'aide de l'api java client, vous pouvez supprimer les doublons de documents basé sur la valeur d'un champ sur votre propre. En effet, il vous donne plus de flexibilité pour effectuer des opérations personnalisées sur les réponses que vous obtenez à partir d'ES.
Ainsi, vous aurez une carte unique searchHit objets dans votre carte.
Vous pouvez également créer un objet de la cartographie et de l'utiliser à la place de SearchHit.
J'espère que cela résout votre problème. S'il vous plaît pardonnez-moi si il y a des erreurs dans le code. C'est juste un pseudo-ish code pour vous faire comprendre comment vous pouvez résoudre votre problème.
Grâce
@JRL est presque corrrect. Vous aurez besoin d'une agrégation dans votre requête. Ainsi, vous obtenez une liste des meilleurs 10000 "favorite_cars" dans l'objet de votre commandés par l'occurance.
Il est également intéressant de noter que vous allez vouloir votre "favorite_car" sur le terrain pour ne pas être analysés afin d'obtenir "McLaren F1" au lieu de "McLaren ", "F1".
Pour un seul fragment cela peut être manipulé à l'aide de filtre personnalisé qui prend également en charge de la pagination. Pour gérer l'utilisation des cas, on peut utiliser le script de support comme suit:
si la demande est:
sélectionnez * à partir de myindex où file_hash = 'hash_value'
puis ajouter le filtre personnalisé:
sélectionnez * à partir de myindex où file_hash = 'hash_value" ET AcceptDistinctDocumentScriptFilter(params= ['nom_fichier', 'file_folder'])
Pour la distribution de recherche, c'est délicat et les besoins de plugin pour le crochet dans la REQUÊTE de phase. Plus de détails ici.