Le plugin TNTSEARCH est destiné aux CMS Grav. Un moteur de recherche de texte intégral indexé puissant propulsé par la bibliothèque TNTSearch qui fournit des recherches de contenu Grav Fast Ajax. Ce plugin est très flexible, ce qui permet aux index de données de contenu arbitraires ainsi que des modèles de brindilles personnalisées pour fournir la possibilité d'indexer des types de pages modulaires et d'autres dynamiques. TNTSearch fournit une CLI ainsi que l'administration et la réindexation basées sur l'administrateur, ainsi qu'un outil de recherche frontal alimenté par Ajax intégré.
Remarque: TNTSEARCH version 3.0.0 nécessite désormais Grav 1.6.0 ou plus récent pour fonctionner car il utilise de nouvelles fonctionnalités non disponibles dans les versions précédentes.

L'installation du plugin de recherche TNT peut être effectuée de deux manières. La méthode d'installation GPM (Grav Package Manager) vous permet d'installer rapidement et facilement le plugin avec une commande de terminal simple, tandis que la méthode manuelle vous permet de le faire via un fichier zip.
La façon la plus simple d'installer ce plugin est via le GRAVE Package Manager (GPM) via le terminal de votre système (également appelé la ligne de commande). De la racine de votre type d'installation de Grav:
bin/gpm install tntsearch
Cela installera le plugin de recherche TNT dans votre répertoire /user/plugins au sein de Grav. Ses fichiers peuvent être trouvés sous /your/site/grav/user/plugins/tntsearch .
Outre les exigences standard de Grav, ce plugin a des exigences supplémentaires. En raison de la nature complexe d'un moteur de recherche, TNTSearch utilise une base de données à fichiers plates pour stocker sa liste de mots ainsi que la cartographie du contenu. Ceci est géré automatiquement par le plugin, mais vous devez vous assurer que les installations suivantes sont installées sur votre serveur:
| PHP par défaut est livré avec PDO et la grande majorité des systèmes basés sur Linux sont déjà livrés avec SQLite.
SQLite est en fait préinstallé sur votre Mac, mais vous pouvez le mettre à niveau vers la dernière version avec Homebrew:
Installer Homebrew
$ /usr/bin/ruby -e " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install ) "Installez Sqlite avec Homebrew
$ brew install sqliteTéléchargez la version appropriée de SQLite à partir de la page SQLite Downloads.
Extraire le fichier zip téléchargé et exécuter l'exécutable sqlite3.exe .
Avant de configurer ce plugin, vous devez copier l' user/plugins/tntsearch/tntsearch.yaml à user/config/plugins/tntsearch.yaml et modifier uniquement cette copie.
Voici la configuration par défaut et une explication des options disponibles:
enabled : true
search_route : ' /search '
query_route : ' /s '
built_in_css : true
built_in_js : true
built_in_search_page : true
enable_admin_page_events : true
search_type : auto
fuzzy : false
distance : 2
phrases : true
stemmer : ' no '
display_route : true
display_hits : true
display_time : true
live_uri_update : true
limit : 20
min : 3
snippet : 300
index_page_by_default : true
scheduled_index :
enabled : false
at : ' 0 */3 * * * '
logs : ' logs/tntsearch-index.out '
filter :
items :
- [email protected]
powered_by : true
search_object_type : Grav Les options de configuration sont les suivantes:
enabled - Activer ou désactiver instantanément le pluginsearch_route - l'itinéraire utilisé pour la page de recherche intégréequery_route - l'itinéraire utilisé par le formulaire de recherche pour interroger le moteur de recherchebuilt_in_css - Activer ou désactiver le style CSS intégrébuilt_in_js - activer ou désactiver le javascript intégrébuilt_in_search_page - Activer ou désactiver la page de recherche intégréeenable_admin_page_events - Activer ou désactiver les événements de page qui se produisent on-save pour ajouter / mettre à jour / supprimer la page dans l'indexsearch_type - peut être l'un de ces types:basic - correspondance de chaîne standardboolean - supports or ou minus . par exemple foo -barauto - détecte automatiquement s'il faut utiliser basic ou booleanfuzzy - correspond si les mots sont «proches» mais pas nécessairement des correspondances exactesdistance - Levenshtein Distance de la recherche floue. Il représente la quantité de caractères qui doivent être modifiés, supprimés ou ajoutés dans un mot afin de correspondre au mot clé de recherche. L'augmentation de la distance produit plus de résultats de recherche mais diminue la précision de la recherche.phrases - gérer automatiquement le support des phrasesstemmer - peut être l'un de ces types:no - pas de tigearabic - Langue arabecroatian - Langue croategerman - Langue allemandeitalian - langue italienneporter - Porter STEMMER pour la langue anglaiseportuguese - Langue portugaiserussian - Langue russeukrainian - Langue ukrainiennedisplay_route - Affichez l'itinéraire dans les résultats de recherchedisplay_hits - Affichez le nombre de coups dans les résultats de la recherchedisplay_time - affiche le temps d'exécution dans les résultats de la recherchelive_uri_update search_route Lorsque built_in_jslimit - Montant maximum de résultats à affichermin - Mininum Montant des caractères tapés avant d'effectuer la recherchesnippet - quantité de caractères pour prévisualiser un élément de résultatindex_page_by_default - Si toutes les pages sont indexées par défaut, sauf si le frontmatter remplacescheduled_index - nouveau travail d'index planifié. Désactivé par défaut, lorsque vous avez permis d'exécuter par défaut toutes les 3 heures, et la sortie des résultats dans logs/tntsearch-index.outfilter - Un filtre de collections de pages qui vous permet de choisir des pages spécifiques à indexer via une requête de collectionpowered_by - Affichez le texte Powed-By TNTSEARCHsearch_object_type - permet aux classes personnalisées de remplacer la prise en charge par défaut de la page Grav . Cela permet des capacités de recherche entièrement personnalisées pour tout type de données. TNTSearch s'appuie sur le fait que votre contenu soit indexé dans la base de données d'index SQLite avant que toute question de recherche puisse être effectuée. Ceci est très similaire à d'autres moteurs de recherche tels que Elasticsearch, SOLR, Lucene, etc., mais il utilise une bibliothèque TNTearch de la bibliothèque de moteurs de recherche PHP relativement simple pour y parvenir avec peu de configuration et pas de tracas.
La première étape après l'installation du plugin consiste à indexer votre contenu. Il y a plusieurs façons d'accomplir cela.
Tout d'abord, si vous pouvez accéder à la CLI ou simplement choisir de ne pas utiliser le plugin d'administration, vous pouvez utiliser la commande CLI intégrée:
$ bin/plugin tntsearch indexCela analysera toutes vos pages et indexera le contenu. Vous devriez voir une sortie comme ceci:
Re-indexing Search
Added 1 /
Added 2 /blog/classic-modern-architecture
Added 3 /blog/daring-fireball-link
Added 4 /blog/focus-and-blur
Added 5 /blog/just-some-text-today
Added 6 /blog/london-industry
Added 7 /blog/random-thoughts
Added 8 /blog/sunshine-in-the-hills
Added 9 /blog/the-urban-jungle
Total rows 9
Done.Cela indique une indexation réussie de votre contenu.
Si vous utilisez le plugin d'administration, vous pouvez indexer votre contenu directement à partir du plugin. TNTSearch ajoute une nouvelle icône de jeu rapide qui vous permet de créer un nouvel index ou de réindexer tout votre contenu rapidement et commodément en un seul clic.

Alternativement, vous pouvez accéder à la section de configuration TNTSearch et cliquer sur le bouton Index Content :

Remarque: que toute page qui utilise un attribut d'en-tête de page
redirectsera ignorée lors de l'indexation.
Vous pouvez explicitement sauter une page qui se trouve dans le filtre d'index en ajoutant ce YAML à l'en-tête de page:
tntsearch:
index: false
Avec la nouvelle version 3.0 de TNTSearch, la prise en charge a été ajoutée pour plusieurs langues (Grav 1.6 requise). En interne, cela signifie que plutôt que stocker l'index en tant user:://data/tntsearch/grav.index , plusieurs index sont créés par langage configurés dans Grav. Par exemple, si vous avez défini les langues prises en charge sur ['en', 'fr', 'de'] , alors lorsque vous effectuez un index, vous obtiendrez trois fichiers: en.index , fr.index et de.index . Lorsque l'interrogation du langage actif approprié détermine quel index est interrogé. Par exemple, effectuer la recherche sur une page appelée /fr/search entraînera l'utilisation de la base de données fr.index à utiliser et des résultats français à renvoyer.
La note d'indexation prendra plus de temps en fonction du nombre de langues que vous prendre en charge car TNTSearch doit indexer chaque page dans chaque langue.
Remarque: Bien que les caractères accentués soient pris en charge dans cette version, il n'y a actuellement aucun support dans la bibliothèque TNTSearch sous-jacente pour faire correspondre les caractères non accentués à ceux accentués, donc des correspondances exactes sont nécessaires.
L'une des grandes nouvelles fonctionnalités de Grav 1.6 est le planificateur intégré qui permet d'exécuter périodiquement les fonctionnalités fournies par le plugin. TNTSearch est un excellent cas d'utilisation pour cette capacité car il permet à un travail d'indexation d'être exécuté pour être exécuté toutes les quelques heures sans avoir besoin de garder manuellement les choses en synchronisation. Il existe quelques options qui vous permettent de configurer cette capacité.
Première note que cette fonctionnalité de planificateur est désactivée par défaut, vous devez donc d'abord activer la fonctionnalité du planificateur dans les paramètres du plugin TNTSearch. Après cela, vous pouvez configurer la fréquence à laquelle le travail d'indexation doit s'exécuter. La valeur par défaut est toutes les 3 heures. Enfin, vous pouvez configurer où toute sortie d'indexation est enregistrée.
Une fois que vous avez un index, TNTSearch utilise les événements d'administration pour les entrées d'index CAT , U Pdate et D Elete lorsque vous modifiez les pages. Si votre index semble être hors de synchronisation, vous pouvez simplement renoncer à l'ensemble de votre site.
Par défaut, le plugin TNTSearch indexera le title et content de votre page. Cela suffit généralement pour la plupart des cas, mais il existe des situations où vous voudrez peut-être indexer plus de champs. Le plugin en fournit un exemple en écoutant l'événement onTNTSearchIndex :
public static function getSubscribedEvents ()
{
return [
' onTNTSearchIndex ' => [ ' onTNTSearchIndex ' , 0 ]
];
}
public function onTNTSearchIndex ( Event $ e )
{
$ fields = $ e [ ' fields ' ];
$ page = $ e [ ' page ' ];
if ( isset ( $ page -> header ()-> author )) {
$ fields -> author = $ page -> header ()-> author ;
}
}Cela vous permet d'ajouter un auteur aux champs indexés s'il est défini dans la page Frontmatter. Vous pouvez ajouter vos propres champs personnalisés avec un plugin très simple qui écoute cet événement.
Le plugin TNTSEARCH utilise généralement le contenu rendu pour indexer. Cependant, il existe des situations où votre page est en fait une page modulaire, ou construite à partir d'autres pages où il n'y a pas de contenu réel sur la page, ou le contenu n'est pas représentatif de la page dans son ensemble. Pour lutter contre cette situation, vous pouvez fournir des modèles personnalisés dans votre thème que TNTSearch peut utiliser pour rendre le contenu avant l'indexation.
Par exemple, disons que nous avons une page d'accueil qui est construite à partir de quelques sous-pages modulaires avec un peu de contenu en dessous, il s'appelle home.md , donc utilise un fichier home.html.twig dans templates/ dossier de votre thème. Vous pouvez créer une version simplifiée de ce modèle et l'enregistrer en tant que templates/tntsearch/home.html.twig . Pour cet exemple, ce modèle ressemble à ceci:
{% for module in page. collection () %}
< p >
{{ module . content | raw }}
</ p >
{% endfor %}
{{ page . content | raw }}Comme vous pouvez le voir, cela garantit que les pages du module telles que définies dans la collection de la page sont affichées, le contenu de la page réel s'affiche.
Pour demander à TNTSearch d'indexer avec ce modèle plutôt que de simplement utiliser le contenu de la page en soi, il vous suffit d'ajouter une entrée dans le home.md Frontmatter:
tntsearch :
template : ' tntsearch/home ' Le plugin TNTSearch pour Grav est livré avec une page de requête intégrée accessible via la route /search par défaut. Cette page de recherche est un champ de saisie simple qui effectuera une requête AJAX en tant que type . Parce que TNTSearch est si rapide, vous obtenez une réponse de recherche en temps réel d'une manière similaire à une recherche Google. Les résultats sont également renvoyés déjà mis en évidence pour les termes correspondants.
Vous pouvez également tester la recherche avec la CLI:
$ bin/plugin tntsearch query ipsum
{
"number_of_hits" : 3 ,
"execution_time" : " 2.101 ms " ,
"hits" : [
{
"link" : " / blog / classic-modern-architecture " ,
"title" : " Classic Modern Architecture " ,
"content" : " ...sed a odio. Curabitur ut lectus tortor. Sed <em>ipsum< / em> eros, egestas ut eleifend non, elementum vitae eros. Mauris felis diam, pellentesque vel lacinia ac, dictum a nunc. n Lorem <em>ipsum< / em> dolor sit amet, consectetur adipiscing elit. Donec ultricies tristique nulla et mattis. Phasellus id massa eget... "
},
{
"link" : " / blog / focus-and-blur " ,
"title" : " Focus and Blur " ,
"content" : " ...sed a odio. Curabitur ut lectus tortor. Sed <em>ipsum< / em> eros, egestas ut eleifend non, elementum vitae eros. Mauris felis diam, pellentesque vel lacinia ac, dictum a nunc. n Lorem <em>ipsum< / em> dolor sit amet, consectetur adipiscing elit. Donec ultricies tristique nulla et mattis. Phasellus id massa eget... "
},
{
"link" : " / blog / london-industry " ,
"title" : " London Industry at Night " ,
"content" : " ...sed a odio. Curabitur ut lectus tortor. Sed <em>ipsum< / em> eros, egestas ut eleifend non, elementum vitae eros. Mauris felis diam, pellentesque vel lacinia ac, dictum a nunc. n Lorem <em>ipsum< / em> dolor sit amet, consectetur adipiscing elit. Donec ultricies tristique nulla et mattis. Phasellus id massa eget... "
}
]
} Si une page de gravure physique est trouvée pour la route /search , TNTSearch l'utilisera plutôt que la page fournie par le plugin. Cela vous permet d'ajouter facilement du contenu à votre page de recherche dont vous avez besoin. Si vous souhaitez personnaliser la sortie HTML réelle, copiez simplement les templates/search.html.twig du plugin vers votre thème et personnalisez-le.
Le champ de saisie réel peut également être modifié selon les besoins en copier et en modifiant le fichier templates/partials/tntsearch.html.twig sur votre thème et le modifier.
Par défaut, le plugin tNTSearch pour Grav, la réponse JSON est envoyée avec la structure suivante:
{
"number_of_hits" : 3 ,
"execution_time" : " 1.000 ms " ,
"hits" : [
{
"link" : " /page-a " ,
"title" : " Title A " ,
"content" : " highlighted-summary "
},
{
"link" : " /page-b " ,
"title" : " Title B " ,
"content" : " highlighted-summary "
},
{
"link" : " /page-c " ,
"title" : " Title C " ,
"content" : " highlighted-summary "
}
]
}Il y a des cas où cette sortie n'est pas souhaitable ou doit être modifiée. TNTSearch fournit en fait un événement de plugin pour vous permettre de manipuler ce format. Un exemple de cela peut être vu ci-dessous:
public static function getSubscribedEvents () {
return [
' onTNTSearchQuery ' => [ ' onTNTSearchQuery ' , 1000 ],
];
}
public function onTNTSearchQuery ( Event $ e )
{
$ query = $ this -> grav [ ' uri ' ]-> param ( ' q ' );
if ( $ query ) {
$ page = $ e [ ' page ' ];
$ query = $ e [ ' query ' ];
$ options = $ e [ ' options ' ];
$ fields = $ e [ ' fields ' ];
$ fields -> results [] = $ page -> route ();
$ e -> stopPropagation ();
}
} Les éléments importants à noter sont la valeur de commande 1000 pour s'assurer que cet événement s'exécute avant l'événement par défaut dans le fichier de plugin tntsearch.php . La méthode d'événement réelle définit simplement un tableau de résultat sur les champs avec un itinéraire, résultant en:
{
"number_of_hits" : 3 ,
"execution_time" : " 1.000 ms " ,
"results" : [ '/page-a', '/page-b', '/page-c' ]
} Le plugin TNTSEARCH peut également être utilisé pour rendre la recherche comme une liste déroulante plutôt que dans une page standard. Pour ce faire, vous devez embed la recherche partielle et la remplacer pour répondre à vos besoins. Vous pouvez simplement l'ajouter à votre thème où que vous souhaitiez avoir une zone de recherche déroulante Ajax:
{% embed ' partials/tntsearch.html.twig ' with { limit : 10 , snippet : 150 , min : 3 , search_type : ' auto ' , dropdown : true } %}{% endembed %} Ici, nous intégrons le partiel par défaut, mais remplacez les options en les transmettant dans l'instruction with . Il est important de remarquer que la dropdown: true doit être réglé pour être interprété comme une liste déroulante.
Ce plugin ne serait pas possible sans l'incroyable bibliothèque TNTSearch pour PHP. Assurez-vous de jouer ce projet sur GitHub.