Elasticsearch et recherche de doublons

488 views
Skip to first unread message

Joffrey Hercule

unread,
Jun 18, 2014, 6:26:53 AM6/18/14
to elastics...@googlegroups.com
Bonjour, 
débutant dans elesticsearch, nous avons déployé la solution afin d'améliorer la gestion des indexes de notre solution.
Pour une recherche pure, pas de soucis à signaler.
En revanche, j'ai une petite problématique au niveau de la recherche de doublons afin de savoir si un nouvel élément doit être créé ou juste mis à jour dans l'index d'ES.

Concrètement :
- une élement (voiture) contient par exemple une marque, un modèle, une cylindrée, une finition.
- afin de savoir si un nouveau element existe déjà dans l'index, nous utilisons un algo avec une notion de points. 
- exemple si la marque existe déjà ça fait un point, si la marque et le modèle existent 5 points, etc.
- une fois ces recherches faites, on fait la somme. En fonction de celle-ci, si cette somme est haute, nous aimerions pouvoir récupérer le résultat.

Ma question est de savoir si il existe un système (natif ou pas) dans ES pour faire cette recherche sans faire trop d'appels à l'index d'ES.

Merci d'avance pour votre aide !

Cédric Hourcade

unread,
Jun 18, 2014, 9:31:56 AM6/18/14
to elastics...@googlegroups.com
Hello,

Tu pourrais peut-être le faire en une seule requête, de la même manière que tu fais tes recherches, par exemple :

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "marque" : "renault"
          }
        },
        {
          "match": {
            "modele" : "clio"
          }
        },
        {
          "match": {
            "couleur" : "rouge"
          }
        }
      ]
    }
  }
}

Dans un premier temps tu peux même ajouter des boosts selon les champs pour se rapproche un peu votre algorithme.

Cédric

Joffrey Hercule

unread,
Jun 18, 2014, 10:37:53 AM6/18/14
to elastics...@googlegroups.com
Merci Cédric pour ta réponse.
En effet, je peux utiliser des OR, cela prend plus de temps mais donne de bons résultats.
Ensuite je prend celui qui a le plus haut score et je fais mes calculs de points dessus...

Petite question suite au "boost" : Comment l'intégrer dans le search ?




--
--
---
Vous pouvez également poster et consulter les réponses en anglais sur le groupe Elasticsearch https://groups.google.com/group/elasticsearch
 
Si vous avez également posté votre question sur la mailing list elasti...@googlegroups.com, merci d'indiquer ici le lien vers cette discussion pour faciliter le suivi.
 
Twitter : @ElasticsearchFR https://twitter.com/#!/ElasticsearchFR
Site web (English) : http://www.elasticsearch.org/
---
Vous recevez ce message, car vous êtes abonné à un sujet dans le groupe Google Groupes "Elasticsearch FR".
Pour vous désabonner de ce sujet, visitez le site https://groups.google.com/d/topic/elasticsearch-fr/u4g6ZGL9wyQ/unsubscribe.
Pour vous désabonner de ce groupe et de tous ses sujets, envoyez un e-mail à l'adresse elasticsearch-...@googlegroups.com.
Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse elastics...@googlegroups.com.
Visitez ce groupe à l'adresse http://groups.google.com/group/elasticsearch-fr.
Cette discussion peut être lue sur le Web à l'adresse https://groups.google.com/d/msgid/elasticsearch-fr/605a6d20-a5df-4821-845e-dc71f936ca4b%40googlegroups.com.
Pour obtenir davantage d'options, consultez la page https://groups.google.com/d/optout.

Cédric Hourcade

unread,
Jun 18, 2014, 11:20:30 AM6/18/14
to elastics...@googlegroups.com
Ca prend plus de temps par rapport à quoi ? Ca dépend juste peut-être
de la façon dont les données sont indexées/analyzées. Ca peut être
très rapide !

Pour le boost, par exemple si le fait que la marque match est plus
important que la couleur, on peut avoir :

"should": [
{
"match": {
“marque": {
"boost": 5,
"query": "renault"
}
}
},
{
"match": {
"couleur": {
"boost": 2,
"query": "rouge"
}
}
}
]

Mais l'idée c'est que ton algorithme pourrait quasiment être remplacé
par la requête si elle est assez fine.

Cédric Hourcade
c...@wal.fr
> Vous recevez ce message, car vous êtes abonné au groupe Google Groupes
> "Elasticsearch FR".
> Pour vous désabonner de ce groupe et ne plus recevoir d'e-mails le
> concernant, envoyez un e-mail à l'adresse
> elasticsearch-...@googlegroups.com.
> Pour envoyer un message à ce groupe, envoyez un e-mail à l'adresse
> elastics...@googlegroups.com.
> Visitez ce groupe à l'adresse
> http://groups.google.com/group/elasticsearch-fr.
> Cette discussion peut être lue sur le Web à l'adresse
> https://groups.google.com/d/msgid/elasticsearch-fr/CADwgoY5OoOKBF0wVr-x_1hN0BNKTu0q%3DaNJiwLqWSBKgD1r6CQ%40mail.gmail.com.

Joffrey Hercule

unread,
Jun 18, 2014, 11:33:16 AM6/18/14
to elastics...@googlegroups.com
En fait, plus il y a de "should" et plus la requête est longue. Je peux en avoir jusqu'à 10.
Après ça pose pas de soucis, j'extrais celui qui a le plus haut score et je peux faire mon calcul de points dessus.

Pour la partie config, j'ai tout laissé par défaut donc tous les champs sont indexés. J'suis un noob :)


Vous recevez ce message car vous êtes abonné à un sujet dans le groupe Google Groupes "Elasticsearch FR".

Pour vous désabonner de ce sujet, visitez le site https://groups.google.com/d/topic/elasticsearch-fr/u4g6ZGL9wyQ/unsubscribe.
Pour vous désabonner de ce groupe et de tous ses sujets, envoyez un e-mail à l'adresse elasticsearch-...@googlegroups.com.
Pour envoyer un message à ce groupe, adressez un e-mail à elastics...@googlegroups.com.

Visitez ce groupe à l'adresse http://groups.google.com/group/elasticsearch-fr .

Jérôme Mainaud

unread,
Jun 19, 2014, 1:22:13 AM6/19/14
to elastics...@googlegroups.com

Bonjour,

As-tu des mesures précises de la dégradation des performances que tu indiques ?

Vu le type de recherche que tu souhaites faire, il te faut prévoir un travail d'affinage de ton mapping pour garantir de bon résultats à ta requête de dédoublonnage.

Autrement, as-tu essayé les requêtes de type « more like this »  ?
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-more-like-this.html

--
Jérôme Mainaud
jer...@mainaud.com

Joffrey Hercule

unread,
Jun 19, 2014, 3:58:59 AM6/19/14
to elastics...@googlegroups.com
Bonjour Jérôme.
Oui j'ai des chiffres précis. Par exemple avec 2 should, je suis dans les 400 ms. Avec 8, je suis entre 1 et 2 secondes de moyenne. ça me semble assez important comme temps de traitement. Non ?

Que veux-tu dire par "travail d'affinage de mon mapping" ? Indexer moins de champs ? Supprimer des champs dans la partie "source" ?

Les requêtes mlt sont plus pour rechercher une même chaîne dans plusieurs champs non ? Ce que je cherche à faire c'est rechercher une valeur = champs.



Cédric Hourcade

unread,
Jun 19, 2014, 4:53:59 AM6/19/14
to elastics...@googlegroups.com
Ca me parait en effet très lent. Mais là ça dépend beaucoup de la
configuration du cluster, du sharding, des settings et du mapping.

De combien tu as de documents dans l'index, et de combien sont
remontés par ces requêtes.

Cédric Hourcade
c...@wal.fr
> https://groups.google.com/d/msgid/elasticsearch-fr/CADwgoY50cncG%3DbNGANGCYs7%2BXtYsAve%3D6%3DbHNOyVXeX95fiMEA%40mail.gmail.com.

Joffrey Hercule

unread,
Jun 19, 2014, 5:05:40 AM6/19/14
to elastics...@googlegroups.com
niveau config, j'ai un cluster de 2 nœuds (un master et un slave) ainsi qu'un jeu de test de 500.000 indexes.
La requête que je lance contient 8 couples bool/shoud, et me renvoie 10 enregistrements sur un total de 3100. Le tout en 1233 ms.

Pour faire mes tests, j'utilise le plugin marvel/sense mais j'ai des temps d’exécution similaires avec le plugin head.


Jérôme Mainaud

unread,
Jun 19, 2014, 12:57:42 PM6/19/14
to elastics...@googlegroups.com
2s, c'est effectivement très lent. Il doit y avoir un problème quelque part.
Quand tu parles de 500k index, tu veux vraiment dire 500k index ou 500k documents ?

Tu pourras peut-être gagner du temps si tu peux imposer certains champs en "must", mais j'ai l'impression que ce n'est pas ton cas.

Sinon, essaye la requête "more like this", elle semble conçue pour trouver les documents similaires à un exemple donner. Et donc répondre à ton besoin. Une requête spécialisée comme celle là a des chances d'être plus rapide qu'une requête généraliste.

Par "travail d'affinage de ton mapping" je pensais surtout aux analyseurs. Tout me dit que ton usage nécessite de les régler finement.

Bonne soirée.



--
Jérôme Mainaud
jer...@mainaud.com


Joffrey Hercule

unread,
Jun 20, 2014, 3:28:17 AM6/20/14
to elastics...@googlegroups.com
500k d'id.
Au final, j'ai pu solutionner le problème en allégeant la structure de mes documents. Je pense qu'il y avait trop de champs indexés. 
Merci à vous deux pour votre aide :)

Le mercredi 18 juin 2014 12:26:53 UTC+2, Joffrey Hercule a écrit :
Reply all
Reply to author
Forward
0 new messages