Bonjour Samak,
Peux-tu m'en dire plus sur ton niveau en ES ? ça permettra de mieu cibler les points à expliquer.
En préanbule, assure toi d'avoir une version elasticsearch 5.X et non la version installé de base par 100% des gestionnaire de packet, à savoir la 2.X. J'ai eu pas mal de souci à cause de ça.
Il ne faut pas résonner en relationnel en effet, en revanche tu peux imbriquer des structures de données entre elle, je te conseil de regarder les deux types de base de ES qui sont :
- object comparable à du OneToOne
-
nested comparable à du OneToMany
Tu peux donc faire un mapping tel que :
Voici un exemple de mapping :{ "myindex": { "mappings": { "document": { "properties": { "fileName": { "type": "text" }, "id": { "type": "integer" }, "dossier": { "type": "nested", "properties": { "id": { "type": "integer" }, "name": { "type": "text" } } } } } } } }
Cela te donnera des sorties du type :
ensuite pour ta query, cela doit être une alliance de MySQL et Elasticsearch, cela doit fonctionner de paire, tu ne feras pas tout avec uniquement Elasticsearch au risque de vraiment t'arracher les cheveux. Garde les rôles suivants :
- MySQL / PHP se charge de formater l'affichage (le nom du document, le nom du dossier d'où provient le document) et de contrôler les droits d'accès pour l'utilisateur courant.
-
Elasticsearch se charge de la recherche à proprement parler.
Cela donnera donc (pour un type object) :
GET /myindex/document/_search { "query": { "bool": { "must": [ { "match": { "fileName": { "query": "keyword" } } }, { "terms": { "dossier.id": [ 1, 2 ] } } ] } }, "_source": [ "id" ], "highlight": { "pre_tags": [ "<strong>" ], "post_tags": [ "<\/strong>" ], "fields": { "fileName": { "number_of_fragments": 100 } } } } Ici tu fais une requête sur l'index "myindex" pour le type : "document"
GET /myindex/document/_search
Cette partie dit retourne moi tout les résultats dont le champ "fileName" match avec "keyword" ET dossier.id vaut 1 ou 2.
ensuite tu veux que le resultat te retourne que l'ID (note: cela equivaut à faire SELECT id FROM [...] plutôt que SELECT *) et enfin tu demandes de mettre en highlight là ou il a match.
Attention la requête ci-dessus fonctionne pour un type object !
pour le mapping soumis ci-dessus préfère cette requête. (plus d'info ici)[https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html]
Enfin une fois les résultats retourné, tu auras une liste d'id de document correspondant à ta recherche ! plus qu'à les retrouver dans ta BDD MySQL et les passer à ta view pour les formater comme tu le souhaites
J'espère t'avoir aidé, hésite pas à compléter si tu as besoin d'autres informations.