El complemento TNTSearch es para Grav CMS. Potente motor de búsqueda de texto completo basado en indexado alimentado por la biblioteca TNTSearch que proporciona búsquedas rápidas de contenido de grav basados en AJAX. Este complemento es altamente flexible que permite que los índices de datos de contenido arbitrarios, así como plantillas de ramas personalizadas, brinden la oportunidad de indexar los tipos de páginas modulares y otros. TNTSearch proporciona CLI, así como administración basada en administración y reintegración, así como una herramienta de búsqueda front-end con motor AJAX incorporada.
Nota: TNTSearch Versión 3.0.0 ahora requiere Grav 1.6.0 o más nuevo para funcionar, ya que hace uso de una nueva funcionalidad no disponible en versiones anteriores.

La instalación del complemento de búsqueda TNT se puede hacer de una de dos maneras. El método de instalación de GPM (Grav Package Manager) le permite instalar rápida y fácilmente el complemento con un comando de terminal simple, mientras que el método manual le permite hacerlo a través de un archivo zip.
La forma más sencilla de instalar este complemento es a través del Grav Package Manager (GPM) a través del terminal de su sistema (también llamado línea de comando). Desde la raíz de su tipo de instalación de grav:
bin/gpm install tntsearch
Esto instalará el complemento de búsqueda TNT en su directorio /user/plugins dentro de Grav. Sus archivos se pueden encontrar en /your/site/grav/user/plugins/tntsearch .
Además de los requisitos estándar de Grav, este complemento tiene algunos requisitos adicionales. Debido a la naturaleza compleja de un motor de búsqueda, TNTSearch utiliza una base de datos de archivo plano para almacenar su lista de palabras, así como el mapeo de contenido. El complemento maneja esto automáticamente, pero debe asegurarse de tener lo siguiente instalado en su servidor:
| PHP por defecto viene con PDO y la gran mayoría de los sistemas basados en Linux ya vienen con SQLite.
SQLite en realidad viene preinstalado en su Mac, pero puede actualizarlo a la última versión con HomeBrew:
Instalar Homebrew
$ /usr/bin/ruby -e " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install ) "Instale SQLite con HomeBrew
$ brew install sqliteDescargue la versión apropiada de SQLite desde la página de descargas de SQLite.
Extraiga el archivo zip descargado y ejecute el ejecutable sqlite3.exe .
Antes de configurar este complemento, debe copiar el user/plugins/tntsearch/tntsearch.yaml a user/config/plugins/tntsearch.yaml y solo edite esa copia.
Aquí está la configuración predeterminada y una explicación de las opciones 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 Las opciones de configuración son las siguientes:
enabled : habilitar o deshabilitar el complemento instantáneamentesearch_route : la ruta utilizada para la página de búsqueda incorporadaquery_route : la ruta utilizada por el formulario de búsqueda para consultar el motor de búsquedabuilt_in_css - Habilitar o deshabilitar el estilo CSS incorporadobuilt_in_js - Habilitar o deshabilitar el JavaScript incorporadobuilt_in_search_page - habilitar o deshabilitar la página de búsqueda incorporadaenable_admin_page_events : habilitar o deshabilitar los eventos de la página que ocurren on-save para agregar/actualizar/eliminar la página en el índicesearch_type - puede ser uno de estos tipos:basic - Cadena de cadena estándarboolean - soportes or minus . por ejemplo, foo -barauto : detecta automáticamente si usar basic o booleanfuzzy : coincide si las palabras están "cercanas" pero no necesariamente coincidencias exactasdistance - Levenshtein Distancia de búsqueda difusa. Representa la cantidad de caracteres que deben cambiar, eliminar o agregar en una palabra para que coincida con la palabra clave de búsqueda. El aumento de la distancia produce más resultados de búsqueda pero disminuye la precisión de la búsqueda.phrases : manejar automáticamente las frases de soportestemmer - puede ser uno de estos tipos:no - No Stemmerarabic - idioma árabecroatian croatagerman - alemánitalian - Italianoporter - Porter Stemmer para el idioma inglésportuguese - Idioma portuguésrussian - idioma rusoukrainian - idioma ucranianodisplay_route : muestre la ruta en los resultados de búsquedadisplay_hits : visualice el número de éxitos en los resultados de la búsquedadisplay_time : visualice el tiempo de ejecución en los resultados de búsquedalive_uri_update : cuando built_in_js está habilitado, en vivo actualiza la barra URI en la página search_routelimit : la cantidad máxima de resultados a mostrarmin - Mininum Cantidad de caracteres escrito antes de realizar la búsquedasnippet : cantidad de caracteres para obtener una vista previa de un elemento de resultadosindex_page_by_default : si todas las páginas se indexan de forma predeterminada a menos que la mapa frontal anulescheduled_index - Nuevo trabajo de índice programado. Desactivado de forma predeterminada, cuando se habilita el valor predeterminado para ejecutar cada 3 horas, y los resultados de salida a logs/tntsearch-index.outfilter : un filtro de colecciones de página que le permite elegir páginas específicas para indexar a través de una consulta de recolecciónpowered_by - Muestra el texto TNTSearch poweredsearch_object_type : permite que las clases personalizadas anulen el soporte de página de grav predeterminado. Esto permite capacidades de búsqueda completamente personalizadas para cualquier tipo de datos. TNTSearch se basa en que su contenido se indexe en la base de datos de SQLite Index antes de que se pueda hacer cualquier consulta de búsqueda. Esto es muy similar a otros motores de búsqueda, como Elasticsearch, Solr, Lucene, etc., pero utiliza una biblioteca de biblioteca de motores de búsqueda de búsqueda relativamente simple para lograr esto con poca configuración y sin problemas.
El primer paso después de la instalación del complemento es indexar su contenido. Hay varias formas de lograr esto.
Primero, si puede acceder a la CLI o simplemente elegir no usar el complemento de administración, puede usar el comando CLI incorporado:
$ bin/plugin tntsearch indexEsto escaneará todas sus páginas e indexará el contenido. Deberías ver alguna salida como esta:
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.Esto indica una indexación exitosa de su contenido.
Si está utilizando el complemento de administración, puede indexar su contenido directamente desde el complemento. TNTSearch agrega un nuevo icono de bandeja rápida que le permite crear un nuevo índice o reintegrar todo su contenido de manera rápida y conveniente con un solo clic.

Alternativamente, puede navegar a la sección Configuración de TNTSearch y hacer clic en el botón Index Content :

Nota: Que cualquier página que use un atributo de encabezado de página
redirectse omitirá durante la indexación.
Puede omitir explícitamente una página que está en el filtro de índice agregando este YAML al encabezado de la página:
tntsearch:
index: false
Con la nueva versión 3.0 de TNTSearch, se ha agregado soporte para varios idiomas (se requiere Grav 1.6). Internamente, esto significa que más bien que almacene el índice como user:://data/tntsearch/grav.index , se crean múltiples índices por idioma configurado en Grav. Por ejemplo, si ha establecido los idiomas compatibles en ['en', 'fr', 'de'] , luego, cuando realice un índice, obtendrá tres archivos: en.index , fr.index de.index . Al consultar el lenguaje activo apropiado determina qué índice se consulta. Por ejemplo, realizar la búsqueda en una página llamada /fr/search dará como resultado que se utilizará la base de datos fr.index
La indexación de nota llevará más tiempo dependiendo de la cantidad de idiomas que admite, ya que TNTSearch tiene que indexar cada página en cada idioma.
Nota: Si bien los caracteres acentuados se admiten en este lanzamiento, actualmente no hay soporte en la biblioteca TNTSearch subyacente para que coincidan con los personajes no acentuados con los acentuados, por lo que se requieren coincidencias exactas.
Una de las grandes características nuevas de Grav 1.6 es el programador incorporado que permite que la funcionalidad proporcionada por complementos se ejecute periódicamente. TNTSearch es un gran caso de uso para esta capacidad, ya que permite que un trabajo de indexación se ejecute cada pocas horas sin la necesidad de mantener las cosas en forma manualmente sincronizada. Hay algunas opciones que le permiten configurar esta capacidad.
Primera nota, que esta funcionalidad del planificador se deshabilita de forma predeterminada, por lo que primero debe habilitar la funcionalidad del planificador en la configuración del complemento TNTSearch. Después de eso, puede configurar con qué frecuencia debe ejecutarse el trabajo de indexación. El valor predeterminado es cada 3 horas. Por último, puede configurar dónde se registra cualquier salida de indexación.
Una vez que tenga un índice, TNTSearch utiliza eventos de administración para ceate , U PDate y D Electe las entradas de índice cuando edita páginas. Si su índice parece que está fuera de sincronización, simplemente puede reindexar todo su sitio.
Por defecto, el complemento TNTSearch indexará el title y content de su página. Esto generalmente es suficiente para la mayoría de los casos, pero hay situaciones en las que es posible que desee indexar más campos. El complemento proporciona un ejemplo de esto escuchando el evento 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 ;
}
}Esto le permite agregar un autor a los campos indexados si está configurado en la casa de primera plana de la página. Puede agregar sus propios campos personalizados con un complemento muy simple que escucha este evento.
El complemento TNTSearch generalmente usa el contenido renderizado para indexar. Sin embargo, hay situaciones en las que su página es en realidad una página modular, o construida a partir de otras páginas donde no hay contenido real en la página, o el contenido no es representativo de la página en su conjunto. Para combatir esta situación, puede proporcionar plantillas personalizadas en su tema que TNTSearch puede usar para representar el contenido antes de indexar.
Por ejemplo, digamos que tenemos una página de inicio que se construye a partir de algunas subpáginas modulares con un poco de contenido debajo, se llama home.md , por lo que usa un archivo home.html.twig en templates/ carpetas de su tema. Puede crear una versión simplificada de esta plantilla y guardarla como templates/tntsearch/home.html.twig . Para este ejemplo, esta plantilla se ve así:
{% for module in page. collection () %}
< p >
{{ module . content | raw }}
</ p >
{% endfor %}
{{ page . content | raw }}Como puede ver, esto simplemente garantiza que se muestren las páginas del módulo como se definen en la colección de la página, luego se muestra el contenido real de la página.
Para instruir a TNTSearch que indexe con esta plantilla en lugar de solo usar el contenido de la página por sí solo, solo necesita agregar una entrada en el home.md
tntsearch :
template : ' tntsearch/home ' El complemento TNTSearch para Grav viene con una página de consulta incorporada a la que se puede acceder a través de la ruta /search de forma predeterminada. Esta página de búsqueda es un campo de entrada simple que realizará una consulta Ajax As-Type . Debido a que TNTSearch es muy rápido, obtienes una respuesta de búsqueda en tiempo real de manera similar a una búsqueda en Google. Además, los resultados ya se devuelven para los términos coincidentes.
También puede probar la búsqueda con 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 se encuentra una página de grav física para la ruta /search , TNTSearch lo usará en lugar de la página proporcionada por el complemento. Esto le permite agregar fácilmente contenido a su página de búsqueda como sea necesario. Si desea personalizar la salida HTML real, simplemente copie las templates/search.html.twig desde el complemento a su tema y lo personalice.
El campo de entrada real también se puede modificar según sea necesario mediante la copia y la edición de las templates/partials/tntsearch.html.twig a su tema y modificarlo.
Por defecto, el complemento TNTSearch para Grav, la respuesta JSON se envía con la siguiente estructura:
{
"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 "
}
]
}Hay casos en los que no es deseable esta salida o debe cambiarse. TNTSearch en realidad proporciona un evento de complemento para permitirle manipular este formato. Un ejemplo de esto se puede ver a continuación:
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 ();
}
} Las cosas importantes a tener en cuenta son el valor de pedido 1000 para garantizar que este evento se ejecute antes del evento predeterminado en el archivo de complemento tntsearch.php . El método de evento real simplemente establece una matriz de resultados en los campos con una ruta, lo que resulta en:
{
"number_of_hits" : 3 ,
"execution_time" : " 1.000 ms " ,
"results" : [ '/page-a', '/page-b', '/page-c' ]
} El complemento TNTSearch también se puede utilizar para representar la búsqueda como un desplegable en lugar de en una página estándar. Para hacer esto, debe embed la búsqueda parcial y anularla para que se ajuste a sus necesidades. Simplemente puede agregar esto a su tema donde quiera tener un cuadro de búsqueda desplegable Ajax:
{% embed ' partials/tntsearch.html.twig ' with { limit : 10 , snippet : 150 , min : 3 , search_type : ' auto ' , dropdown : true } %}{% endembed %} Aquí incrusimos el parcial predeterminado, pero anulamos las options pasándolas en la declaración with la declaración. Es importante notar que el dropdown: true se establece para ser interpretado como desplegable.
Este complemento no sería posible sin la sorprendente biblioteca TNTSearch para PHP. Asegúrese de protagonizar ese proyecto en GitHub.