Indexer sous plusieurs niveau

49 views
Skip to first unread message

Jérome

unread,
May 9, 2012, 8:11:04 AM5/9/12
to Elasticsearch FR
Bonjour,

Mes fichiers se présentent sous cette forme :

TAG
sousTag : valeur
sousTag : valeur
TAG
sousTag : valeur


Je souhaiterais les indexer de la même manière, il me semble
qu'elasticsearch permet l'indexation sur plusieurs niveaux mais
comment le faire ?

Un exemple en CURL ou en PERL m'aiderait bien.

Merci

David Pilato

unread,
May 9, 2012, 12:53:04 PM5/9/12
to elastics...@googlegroups.com
Salut Jérôme


J'avoue ne pas comprendre ta question.
Tu aurais un exemple avec un ou plusieurs documents que tu souhaites indexer
concrètement ?

David.

> -----Message d'origine-----
> De : elastics...@googlegroups.com [mailto:elasticsearch-
> f...@googlegroups.com] De la part de Jérome
> Envoyé : mercredi 9 mai 2012 14:11
> À : Elasticsearch FR
> Objet : [elasticsearch-fr] Indexer sous plusieurs niveau
> --
> ---
> 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/

Jérome

unread,
May 10, 2012, 4:23:12 AM5/10/12
to Elasticsearch FR
En réalité j'ai résolu mon problème.

Je voulais non pas indexer sur un niveau - tag : value - mais sur
plusieurs - tag { sousTag : valeur, sousTag : valeur } -

Après maintes essais je suis parvenu à le faire. J'ai donc quelque
chose du genre :

for($i=1; $i < 4; $i++){
if($i == 1){
$result = $es->index(
index => "toto",
type => "tata",
id => 1,
data => {
personne => {
nom => "big",
prenom => "muzzy"
},
film => "tutu au pays des titi"
},
);
}
else{

print "tag :
";
chomp($tag = <STDIN>);
print "sous tag : ";
chomp($sousTag = <STDIN>);
print "\n"."value : ";
chomp($value = <STDIN>);

$result = $es->update(
index => "toto",
type => "tata",
id => 1,

script => "?????" ,
params => {$tag => 'ok'}
);
}
}


C'est ici que cela coince, je souhaite un script me permettant de
modifier,si elles existent les données présentent dans l'index, sinon
de les ajouter.

En bref :
1- Si je rentre comme tag "personne" (un tag existant) et comme
sousTag "age" (qui n'existe pas) je souhaite que s'ajoute ce tag à
l'intérieur de l'objet "personne".
2- En revanche si le tag et le sousTag existent je souhaite modifier
la valeur.
3- Et toujours sur le même principe si ni le tag ni le sousTag
n'existent crééer un objet.

____________
Exemples

1 - TAG = personne; sousTag = age; valeur = 19
Alors l'index doit devenir :

personne:{ nom : big, prenom : muzzy, age : 19 }, film : tutu au pays
des titi

2- TAG = personne; sousTag = prenom; valeur = jerome
Alors l'index doit devenir :

personne:{ nom : big, prenom : jerome}, film : tutu au pays des titi

3- TAG = newtag; sousTag = newsstag; valeur = new
Alors l'index doit devenir :

personne:{ nom : big, prenom : muzzy}, film : tutu au pays des titi,
newtag:{newsstag : new}



N'y connaissant absolument rien au langage utilisé pour faire les
scripts j'ai malgré tout fait diverses tentatives, peu fructueuses à
mon grand regret.

Si quelqu'un pouvait m'aider ^^


I'll send an SOS to the world
I hope that someone gets my
Message in a forum
> > le groupe Elasticsearchhttps://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 : @ElasticsearchFRhttps://twitter.com/#!/ElasticsearchFR

Ori Pekelman

unread,
May 10, 2012, 6:26:03 AM5/10/12
to elastics...@googlegroups.com
Jérôme,

Je suis désolé mais votre message n'est toujours pas très claire. Le code que vous avez posté ressemble for à du PHP, est-ce bien le cas? Votre question semble plutôt porter sur ce code php et non pas sur ElasticSearch ce qui me fait penser que vous n'avez pas forcement compris son mode de fonctionnement.


En tout cas: Elastic Search est un moteur de recherche. On lui donne des documents au format JSON et il crée les index qui vont bien. Et en gros, toute la communication passe par HTTP (donc on fait des GET et de POST sur quelque chose comme http://localhost:9201). On peut aussi lui indiquer des règles particulières pour traiter les données pour lui indiquer le type d'index qu'il faut créer et les traitement qu'il faut faire sur la donnée le cas échéant. 

Sa vocation première est donc d'être un moteur de recherche et non pas une base de données -- bien que vous pouvez parfaitement l'utiliser à cet usage. Mais cela implique surtout que vous ne pouvez pas facilement modifier une propriété du document (ce qui est en tout cas pas réellement intéressant dans ce cas de figure.). La méthode est simple: lisez le document, modifier le (avec toute la logique d'insertion ou de remplacement que vous voulez) puis enregistrez le à nouveau.

Pour comprendre comment elastic search marche je vous propose sérieusement de jouer à la ligne de commande avec Curl, ou du moins avec l'interface web proposée par le plugin "head".

Jérome

unread,
May 10, 2012, 7:08:12 AM5/10/12
to Elasticsearch FR
Hum c'est du PERL le langage utilisé et effectivement mon maître de
stage veut que j'utilise ES comme une base de donnée, il veut avoir
sur machines virtuelles certaines bases de données présentes en ligne,
pour cela j'indexe des fichiers contenant les données. Me posez pas la
question du pourquoi je fais ça ça me paraît bizarre...

J'ai pas mal joué avec le CURL et l'interface Web mais le problème
vient du script uniquement du script. ><'

Mais bon je pense que je vais essayer de trouver une méthode pour
retrouver un fichier dans ES, supprimer l'index y correspondant et le
remplacer par le nouveau fichier comme vous l'avez dit.

On 10 mai, 12:26, Ori Pekelman <o...@af83.com> wrote:
> Jérôme,
>
> Je suis désolé mais votre message n'est toujours pas très claire. Le code
> que vous avez posté ressemble for à du PHP, est-ce bien le cas? Votre
> question semble plutôt porter sur ce code php et non pas sur ElasticSearch
> ce qui me fait penser que vous n'avez pas forcement compris son mode de
> fonctionnement.
>
> En tout cas: Elastic Search est un moteur de recherche. On lui donne des
> documents au format JSON et il crée les index qui vont bien. Et en gros,
> toute la communication passe par HTTP (donc on fait des GET et de POST sur
> quelque chose commehttp://localhost:9201). On peut aussi lui indiquer des
> > > > De : elastics...@googlegroups.com [mailto:elasticsearch-

da...@pilato.fr

unread,
May 10, 2012, 7:33:33 AM5/10/12
to elastics...@googlegroups.com

Je ne suis toujours pas certain de comprendre ton cas d'utilisation.

 

Néanmoins, si tu veux faire une MAJ d'un document dans ES :

 

1) GET : récupère le côté client

2) fais les MAJ que tu veux dessus

3) PUT : renvoie le complet à ES

 

Sinon, il y a l'UPDATE :  http://www.elasticsearch.org/guide/reference/api/update.html  mais je ne sais pas si c'est vraiment ton cas d'utilisation.

 

Perso, voilà ce que je fais quand un document est modifié (ou pas) côté utilisateur : je le renvoie SYSTEMATIQUEMENT à ES. Ça ne coûte pas beaucoup dans mon cas et ça m'évite de me traîner des problèmes compliqués. (En gros, ma devise est : n'essaye pas de résoudre des problèmes que tu n'as pas !)

 

Pour utiliser ES comme une base, c'est dans les tuyaux de Shay Banon. Donc, tu peux déjà le faire (il y en a qui le font déjà en PROD) et cela sera encore mieux géré à l'avenir.

 

 

David.

> 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/


--
David Pilato
http://dev.david.pilato.fr/
Twitter : @dadoonet

Ori Pekelman

unread,
May 10, 2012, 8:33:51 AM5/10/12
to elastics...@googlegroups.com, da...@pilato.fr
Donc pour expliciter un peu la réponse de David.. Si ce sont des fichiers que tu indexes, utiliser le nom de fichier est rationnel comme identifiant.  Quand tu récupère un document d'ElasticSearch, dans le document il y aura un identifiant unique donc tu n'a pas besoin de le supprimer, le PUT le remplacera. 

C'est le comportement par défaut d'indexer "les sous champs" ou autrement dit, le document json entier, ce n'est pas un cas particulier.

Pour la question d'utiliser ES comme base de données, ce n'est pas une mauvaise idée du tout, surtout si la source de tes données est déjà persistante, et tu peux toujours "recréer la base". Tu peux trouver un exemple d'implémentation d'indexation des fichiers en ruby ici: https://gist.github.com/2304220


On Thursday, May 10, 2012 1:33:33 PM UTC+2, David wrote:

Je ne suis toujours pas certain de comprendre ton cas d'utilisation.

 

Néanmoins, si tu veux faire une MAJ d'un document dans ES :

 

1) GET : récupère le côté client

2) fais les MAJ que tu veux dessus

3) PUT : renvoie le complet à ES

 

Sinon, il y a l'UPDATE :  http://www.elasticsearch.org/guide/reference/api/update.html  mais je ne sais pas si c'est vraiment ton cas d'utilisation.

 

Perso, voilà ce que je fais quand un document est modifié (ou pas) côté utilisateur : je le renvoie SYSTEMATIQUEMENT à ES. Ça ne coûte pas beaucoup dans mon cas et ça m'évite de me traîner des problèmes compliqués. (En gros, ma devise est : n'essaye pas de résoudre des problèmes que tu n'as pas !)

 

Pour utiliser ES comme une base, c'est dans les tuyaux de Shay Banon. Donc, tu peux déjà le faire (il y en a qui le font déjà en PROD) et cela sera encore mieux géré à l'avenir.

 

 

David.

Jérome

unread,
May 10, 2012, 9:14:57 AM5/10/12
to Elasticsearch FR
Arf je me suis trop éloigné du sujet que je voulais ><.

J'utilise cette fonction d'update non pas pour "updater" à proprement
parler mais plutôt pour ajouter des données dans ES, données issues de
fichiers et pouvant être différentes à chaque fichier.

Je met, si vous le souhaitez, à votre à disposition mon vrai script
ainsi que 2 fichiers afin que vous puissiez bien voir.
Certifié clean de virus etc.

http://dl.free.fr/jyVhHesXY


En effet je souhaite indexer la totalité des fichiers et ce de façon
automatique or il y à des tags toujours présents comme le numéro
d'accession, la description ou la séquence ainsi que des tags qui
peuvent être soit absent soit présent et sous différentes formes, il
est impossible de mettre toutes les possibilités dans l'index d'ou
l'update, comme ça j'ai un modèle général fonctionnant pour chaque
fichier.

J'arrive pas mieux expliquer ce que j'ai voulu faire, pour moi c'est
clair comme de l'eau de roche

Jérome

unread,
May 10, 2012, 9:21:15 AM5/10/12
to Elasticsearch FR
Ah j'ai mis trop longtemps a répondre, bon pas grave, si seulement
j'avais des fichiers JSON...

J'ai pas trouvé comment utiliser les fichiers JSON en PERL même si
cela à l'air biiieeen plus facile, en effet mes fichiers ne sont pas
en JSON et je n'arrive pas les convertir en JSON.
> ...
>
> plus de détails »

Ori Pekelman

unread,
May 10, 2012, 10:47:49 AM5/10/12
to elastics...@googlegroups.com
Ok pour de l'eau de roche... hmm pas très claire la fontaine... voilà la question en forme plus lisible:

Je dois indexer dans ElasticSearch, en utilisant PERL des fichiers au format GenBank Flat File dont la référence est ici: http://www.ncbi.nlm.nih.gov/Sitemap/samplerecord.html Mon problème est donc de représenter ces données en JSON (hé.. et donc pas trop du scope de ce group...). 

Ai-je raison pour comprendre que votre problème est avec le champs FEATURES? Si c'est le cas essaie cette implémentation plus simple d'un parser GB, même si incomplète:  http://biowiki.org/~yam/perl/parse-genbank.pl

Je ne suis pas un monger mais kk chose comme ceci devrait marcher une fois que vous avez un petit objet perl:
$json = JSON->new->allow_nonref;
$json->allow_blessed(1);
$json->convert_blessed(1);
$json_text   = $json->encode( $MyObjectRepresentingTheGeneBankData );

Et pour ce qui est de ton implémentation, il suffira d'utiliser le champs LOCUS comme un id, il est réputé unique à ma connaissance. Actuellement tu utilise le id de ta boucle, qui n'est donc vraiment pas un id stable..

Jérome

unread,
May 10, 2012, 11:12:46 AM5/10/12
to Elasticsearch FR
\o/ Merci !

Oui je me suis rendu compte que je pouvais utiliser l'id en lisant vos
réponse et j'ai directement essayé. Je vous remercie grandement de vos
réponses et je dois dire que malgré une fontaine boueuse j'ai eu les
réponses à mes questions.

Je vous remercie encore une fois cela devrait bien m'aider.


Faut vraiment que google rajoute une balise RESOLU...

On 10 mai, 16:47, Ori Pekelman <o...@af83.com> wrote:
> Ok pour de l'eau de roche... hmm pas très claire la fontaine... voilà la
> question en forme plus lisible:
>
> Je dois indexer dans ElasticSearch, en utilisant PERL des fichiers au
> format GenBank Flat File dont la référence est
> ici:http://www.ncbi.nlm.nih.gov/Sitemap/samplerecord.htmlMon problème est
> ...
>
> plus de détails »
Reply all
Reply to author
Forward
0 new messages