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
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');Amazing content and i will love to read more. Keep up the good work because this has greatly helped
https://comprarcartasdeconducao.com
https://comprarcartasdeconducao.com
Una patente di guida autentica, registrata sul nostro sito web, senza la necessità di sostenere un esame o superare la prova pratica.
Abbiamo bisogno solo dei tuoi dati, che verranno inseriti nel sistema entro i prossimi otto giorni. https://portaleperlelicenzeautomobilistiche.com
La patente di guida deve seguire la stessa proce
Una patente di guida autentica, registrata sul nostro sito web, senza la necessità di sostenere un esame o superare la prova pratica.
Abbiamo bisogno solo dei tuoi dati, che verranno inseriti nel sistema entro i prossimi otto giorni.
https://portaleperlelicenzeautomobilistiche.com
La patente di guida deve seguire la stessa proce
vUna licencia de conducir auténtica registrada en nuestra página web sin necesidad de realizar un examen ni aprobar el examen práctico.
Solo necesitamos tus datos, que se incorporarán al sistema en los próximos ocho días.
https://licenciaoficialdeladgtgov.com
Permis de conducere real si inregistrat pe site-ul nostru fara a sustine nici un examen sau a sustine proba practica tot ce avem nevoie sunt detaliile dvs. și vor fi conectate în sistem în următoarele opt zile. Permisul de conducere trebuie să treacă prin aceeași procedură de înregistrare ca și cele eliberate la școlile de șoferi,
https://acheterunpermisdeconduireant.com
Egy weboldalunkon regisztrált valódi jogosítvány, vizsga vagy gyakorlati vizsga letétele nélkül.
Csak az adataira van szükségünk, amelyeket a következő nyolc napon belül rögzítünk a rendszerben. https://hivatalosjogositvanyvasarlasa.com
A jogosítványnak ugyanazon a regisztrációs folyamaton kell keresztülmennie, mint az autósiskolák által kiállított jogosítványoknak.
Egy weboldalunkon regisztrált valódi jogosítvány, vizsga vagy gyakorlati vizsga letétele nélkül.
Csak az adataira van szükségünk, amelyeket a következő nyolc napon belül rögzítünk a rendszerben.
https://hivatalosjogositvanyvasarlasa.com
https://hivatalosjogositvanyvasarlasa.com
Carta de condução real e registada no nosso site sem realizar qualquer exame ou prova prática.
tudo o que precisamos são os seus dados e serão registados no sistema nos próximos oito dias https://comprarcartadeconducaoimt.com
Carta de condução real e registada no nosso site sem realizar qualquer exame ou prova prática.
tudo o que precisamos são os seus dados e serão registados no sistema nos próximos oito dias
https://comprarcartadeconducaoimt.com
Una licencia de conducir auténtica registrada en nuestra página web sin necesidad de realizar un examen ni aprobar el examen práctico. Solo necesitamos tus datos, que se incorporarán al sistema en los próximos ocho días.
https://comprarlicenciadeconducirdgt.com
Una licencia de conducir auténtica registrada en nuestra página web sin necesidad de realizar un examen ni aprobar el examen práctico.
Solo necesitamos tus datos, que se incorporarán al sistema en los próximos ocho días.
https://comprarlicenciadeconducirdgt.com
Echter Führerschein und auf unserer Website registriert, ohne eine Prüfung abzulegen oder die praktische Prüfung abzulegen.
Wir benötigen lediglich Ihre Daten und diese werden innerhalb der nächsten acht Tage im System angemeldet.
https://fuhrerscheinekaufen.com
Echt rijbewijs en geregistreerd op onze website zonder enig examen of praktijktest af te leggen. het enige dat we nodig hebben zijn uw gegevens en deze worden binnen acht dagen in het systeem ingelogd.
Het rijbewijs moet dezelfde registratieprocedure doorlopen als die afgegeven door rijscholen,いまし
https://rijbewijskopencbr1.com
Una patente di guida autentica, registrata sul nostro sito web, senza la necessità di sostenere un esame o superare la prova pratica.
Abbiamo bisogno solo dei tuoi dati, che verranno inseriti nel sistema entro i prossimi otto giorni
https://comprarpatente-diguida.com
Carta de condução real e registada no nosso site sem realizar qualquer exame ou prova prática.
tudo o que precisamos são os seus dados e serão registados no sistema nos próximos oito dias.
https://xn--comprarcartadeconduooficial-0jc9i.com
Ett riktigt körkort registrerat på vår webbplats, utan att du behöver göra ett prov eller ett praktiskt prov Vi behöver bara dina uppgifter, som vi kommer att registrera i systemet inom de närmaste åtta dagarna. Körkortet måste genomgå samma registreringsprocess som körkort utfärdade av trafikskolor.いまし
https://kopakorkort0.com
Ett riktigt körkort registrerat på vår webbplats, utan att du behöver göra ett prov eller ett praktiskt prov Vi behöver bara dina uppgifter, som vi kommer att registrera i systemet inom de närmaste åtta dagarna. Körkortet måste genomgå samma registreringsprocess som körkort utfärdade av trafikskolor.いまし
https://kopakorkort0.com
Una patente di guida autentica, registrata sul nostro sito web, senza la necessità di sostenere un esame o superare la prova pratica.
Abbiamo bisogno solo dei tuoi dati, che verranno inseriti nel sistema entro i prossimi otto giorni. La patente di guida deve seguire la stessa procedura di registrazione delle patenti rilasciate dalle scuole guida
https://comprarepatentediguida1.com
Echt rijbewijs en geregistreerd op onze website zonder enig examen of praktijktest af te leggen. het enige dat we nodig hebben zijn uw gegevens en deze worden binnen acht dagen in het systeem ingelogd. Het rijbewijs moet dezelfde registratieprocedure doorlopen als die afgegeven door rijscholen, いまし La patente https://rijbewijskopen1.com
O que nos diferencia é que não acreditamos em perder tempo. Acreditamos que o caminho mais rápido para o sucesso é uma trajetória clara.
Comprar carta de conducao https://carta-de-conducao.com
Het behalen van een rijbewijs vergt maandenlange voorbereiding. Dit omvat rijlessen, toetsen en uiteindelijk een praktijkexamen. Het kan erg vermoeiend zijn, omdat het veel studietijd vereist. Nep Rijbewijs https://rijbewijslegaal.com
Ajouter un commentaire