Cet article a été écrit il y a plus de quatre ans, son contenu n'est peut-être plus d'actualité.
Avec Drupal et Drupal 8 encore plus la recherche passe la plupart du temps par Search API, une interface qui se branche devant plusieurs moteur de base de données (SolR, ElasticSearch, Database...)
Le plus souvent on va faire nos pages de résultats de recherche à l'aide de Views (et du module Search views pour Drupal 7). Mais dans certains cas on va vouloir avoir plus la main sur la recherche et donc aller interroger Search API directement dans le code.
Initialisation de la requête
Chargement de l'index (ici, le nom machine est « contenu »)
// Chargement de l'index « contenu »
$query = Index::load('contenu')->query();
Définition de la requête recherchée
Terme sur lesquels vont être effectués la requête.
// On lancer la recherche sur « hello world »
$query->keys("hello world");
Mode de la requête
// Les différentes possibilités sont
// - « direct » => Requête directe
// - « terms » => Multiple words
// - « phrase » => Single phrase
$parse_mode = \Drupal::service('plugin.manager.search_api.parse_mode')->createInstance('direct');
// Optionnellement, on peut choisir un opérateur spécifique (OR ou AND)
$parse_mode->setConjunction('OR');
// Affectation du mode de la requête
$query->setParseMode($parse_mode);
Définitions des champs sur lesquels rechercher
Évidement c'est optionnel, par défaut la recherche se fera sur l'ensemble des champs « fulltext » contenus dans l'index.
// Recherche uniquement sur le champ « body »
$query->setFulltextFields(['body']);
// Recherche uniquement sur les champs « body » et « title »
$query->setFulltextFields(['body', 'title']);
Ajout de conditions supplémentaires
L'objet retourné par Index::load('contenu')->query(); est une query classique drupal, sur laquelle on peut effectuer les traitement classique que l'on peut faire sur n'importe quelle Query drupal8.
À noter ici que le nom des champs doit être celui que l'on renseigne dans l'index, ils peuvent être différents des noms des champs définis dans nos types de contenu.
Quelques exemples en vrac :
Condition sur un champ boolean
// le champ private doit être « TRUE »
$query->addCondition('private', TRUE);
Condition sur un champ « varchar »
// on veut que le contenu retourné soit un article ou un snippet
$query->addCondition('type', ['article', 'snippet'], 'IN');
Condition sur un champ date
À noter le format de date à utiliser : "Y-m-d\TH:i:s\Z"
$btf = \DateTime::createFromFormat('d/m/Y', '21/10/2015');
$date_formatted = $btf->format("Y-m-d\TH:i:s\Z")
// Date de création de l'article > date définie
$query->addCondition('created', $date_formatted, '>');
// Et l'inverse
$query->addCondition('created', $date_to, '<');
Pagination
Gestion de la pagination identique à une requête classique
// Récupération des 20 premiers résultats.
$query->range(0, 20);
Exécution de la requête et récupération des résultats
$results_set = $query->execute();
//Nombre de résultats retournés
$nb_results = $results_set->getResultCount()
// Récupération des entités
foreach ($results_set->getResultItems() as $item) {
$resultat = $item->getOriginalObject()->getValue();
}
Sources
Pas trouvé grand chose sur le sujet à part cette page dans la documentation sur drupal.org : https://www.drupal.org/docs/8/modules/search-api/developer-documentatio…
Si vous avez d'autres liens pouvant aider, je suis preneur.
Commentaires (19)
Comments
Bonjour,
Je vous remercie pour votre explication,
Je voulais faire une requête solr pour que je puisse afficher les villes les plus proches à celle saisie par l'internaute,j'ai trouvé une fonction qui calcule la distance en utilisant latitude et longitude,par contre dans la requête je ne sais pas quoi mettre, pour la comparaison.
merci d'avance
u
Très bon article ! la couche d'abstraction proposée pour la requête est sympathique, par contre je me pose la question des limites, chaque moteur ayant ensuite ses propres fonctionnalités je pense que dès que tu veux faire du très spé tu risque de te heurter à des limites, sais tu comment depuis Drupal 8, on pourrait par exemple écrire une requête Solr ?
De mémoire search api solr utiliser solarium https://solarium.readthedocs.io/en/master/ mais je n'ai pas vu comment récupérer la config et l'injecter facilement ?
Juste pour te signaler sur le dernier exemple
$nb_results = $results_set->getResultCount()
Il te manque ";" en fin de ligne.
Bonjour,
Très pratique merci beaucoup.
Comment je peux faire une requête de type start by, end by ou contain.
J'ai tenté addcondition('field_name','%value%','LIKE')
addcondition('field_name','*value*','LIKE')
Un petit ajout, si on souhaite faire de la recherche approximative pour autoriser par exemple "baffouiller" à trouver le résultat "bafouiller":
$parse_mode_manager = \Drupal::service('plugin.manager.search_api.parse_mode');$parse_mode_manager->createInstance('fuzzy_terms');Vi offriamo l’opportunità di ottenere la patente di guida senza dover affrontare la solita procedura semplificata. Ci bastano i vostri dati e ci occuperemo di tutto noi. Non è necessario sostenere l’esame di guida; organizzeremo tutto per voi e la vostra patente sarà pronta in meno di 7 giorni. La patente verrà registrata presso il Dipartimento dei Veicoli a Motore e tutte le vostre informazioni saranno inserite nel database per evitare qualsiasi problema con le forze dell’ordine.
https://comprarelapatentediguida.com/
Koop een geregistreerd rijbewijs. Zoekt u een plek om een rijbewijs te kopen? Geen examen, geen rijbewijs. Koop uw rijbewijs online. Het legaal verkrijgen van een rijbewijs in Europa is voor velen een lastige opgave geworden, omdat het moeilijk is om een rijbewijs te krijgen zonder examen. Wij bieden u de mogelijkheid om zorgeloos een echt, geregistreerd Nederlands rijbewijs te kopen. Koop uw geregistreerde rijbewijs online.
https://rijbewijss-kopen.com/
Pružamo vam mogućnost kupnje vozačke dozvole bez potrebe za uobičajenim jednostavnim postupkom. Sve što nam treba su vaši podaci, a mi ćemo se pobrinuti za sve umjesto vas. Nema potrebe za polaganjem vozačkog ispita; mi ćemo sve organizirati za vas, a vaša će dozvola biti spremna za manje od 7 dana. Vaša će dozvola biti registrirana u Odjelu za motorna vozila, a svi vaši podaci bit će uneseni u sustav baze podataka kako bi se izbjegli problemi s policijom. Kupite vozačku dozvolu.
https://legalna-vozacka-dozvola.com/
Kupte si řidičský průkaz v České republice bez teoretických nebo praktických zkoušek. Jsme si vědomi obtíží, s nimiž se mnoho lidí setkává u teoretických zkoušek, zatímco praktické zkoušky pro mnohé nepředstavují velký problém. Většina testů pod 60 % vždy potvrdí řidičský test, čímž se zvyšuje počet řidičů bez řidičského oprávnění na našich komerčních silnicích. Vytvořili jsme systém, kde si můžete koupit řidičský průkaz přímo od Úřadu pro civilní motorizaci ČR bez nutnosti absolvovat zkoušky nebo jakékoli praktické zkoušky.
https://xn--idiskprkazonline-4zb9zm5c3m.com/
Kúpte si vodičský preukaz na Slovensku bez teoretických alebo praktických skúšok. Uvedomujeme si ťažkosti, s ktorými sa stretáva toľko ľudí pri teoretických skúškach, zatiaľ čo praktické skúšky pre mnohých nie sú veľkým problémom. Väčšina testov pod 60 % vždy potvrdí vodičský test, čím sa zvyšuje počet vodičov bez vodičského preukazu na našich komerčných cestách. Vytvorili sme systém, v ktorom si môžete kúpiť vodičský preukaz priamo od Slovenského úradu pre databázy bez absolvovania skúšok alebo akéhokoľvek praktického testu.
https://kupitvodicskypreukaz-online.com/
Goethe-Zertifikat kaufen. Unser Netzwerk von Agenten, die beim Erwerb des Goethe-Zertifikats und anderer anerkannter Zertifikate helfen, hat sich über die Jahre stetig verbessert. Zudem wächst unser Kundenstamm wöchentlich, da unsere Kunden uns regelmäßig weiterempfehlen. Wir genießen einen hervorragenden Ruf bei Kunden in ganz Europa, darunter auch Kunden, die ein Goethe-Zertifikat erwerben.
https://goethe-zertifikatkaufen.com/
Un permis de conduire authentique, enregistré sur notre site web, sans examen ni épreuve pratique.
Il nous suffit de vos coordonnées ; elles seront enregistrées dans notre système sous huit jours.
Le permis de conduire suit la même procédure d'enregistrement que ceux délivrés par les auto-écoles.
https://acheterun-permisduconduire.com/
Ceadúnas tiomána fíor agus cláraithe ar ár suíomh gréasáin gan aon scrúdú ná tástáil phraiticiúil a dhéanamh. Níl de dhíth orainn ach do shonraí agus logálfar isteach sa chóras iad laistigh den ocht lá atá romhainn. Caithfidh an ceadúnas tiomána dul tríd an nós imeachta clárúcháin céanna leis na cinn a eisítear i scoileanna tiomána,
https://ceannaighceadunastiomana.com/
Diese Seite dient ausschließlich der Welpenvermittlung. Interessenten werden gebeten, die Provinz anzugeben, in der sich der Welpe befindet, um die Suche zu erleichtern. Welpen zu verkaufen. Die Welpen sind zwei bis drei Monate alt. Sie sind alle verträglich mit Hunden, Katzen und Kindern.
https://welpenundhundekaufen.com/
Mit uns müssen Sie nicht nach Deutschland reisen, um Ihren Führerschein zu bekommen. Wir machen Ihnen das Leben leichter und Sie können Ihren Führerschein von zu Hause aus machen, ohne Reiseantrag, Fahrschule, Gesundheitschecks und mindestens 6 Monate Aufenthalt. Vertrauen Sie uns, unsere deutschen Führerscheine sind in Datenbanken registriert und Sie können mit Ihrem neuen Führerschein in der gesamten EU frei fahren. Führerschein Kaufen.
https://echtenfuhrerscheinkaufen.com/
Prava vozačka dozvola i registrirana na našoj web stranici bez polaganja ispita ili praktičnog ispita.
sve što trebamo su vaši podaci i bit će prijavljeni u sustav u sljedećih osam dana.
Vozačka dozvola mora proći isti postupak registracije kao i ona koja se izdaje u autoškolama,
https://kupitivozackudozvolu-online.com/
Pravo vozniško dovoljenje, registrirano na naši spletni strani brez opravljanja izpita ali praktičnega preizkusa.
Potrebujemo le vaše podatke, ki bodo vneseni v sistem v naslednjih osmih dneh.
Vozniško dovoljenje mora iti skozi enak postopek registracije kot dovoljenja, izdana v avtošolah.
https://xn--kupiti-voznikodovoljenje-cve.com/
Tikras vairuotojo pažymėjimas, užregistruotas mūsų svetainėje nelaikant jokio egzamino ar praktinio testo.
Mums tereikia jūsų duomenų, ir jie bus užregistruoti sistemoje per ateinančias aštuonias dienas.
Vairuotojo pažymėjimas turi būti registruojamas pagal tą pačią procedūrą, kaip ir vairavimo mokyklose išduodami pažymėjimai.
https://nusipirkti-vairuotojo-pazymejima.com/
Ekte førerkort registrert på nettsiden vår uten å ta noen eksamen eller praktisk prøve.
Alt vi trenger er dine opplysninger, og de vil bli logget inn i systemet innen de neste åtte dagene.
Førerkortet må gå gjennom samme registreringsprosedyre som de som utstedes på kjøreskoler,
https://kjop-lovligforerkort.com/