Плагин TNTSearch предназначен для Grav CMS. Мощные индексированные полные текстовые поисковые системы, работающие на библиотеке TNTSearch, которая обеспечивает быстрый поиск по контенту на основе AJAX. Этот плагин очень гибкий, позволяющий индексам произвольных данных содержимого, а также пользовательские шаблоны веток, чтобы предоставить возможность индексировать модульные и другие динамические типы страниц. TNTSearch предоставляет CLI, а также администрацию и повторную индексацию на основе администрации, а также встроенный инструмент поиска на основе AJAX.
ПРИМЕЧАНИЕ. TNTSearch Версия 3.0.0 теперь требует GRAV 1.6.0 или новее, чтобы функционировать, поскольку она использует новые функции, недоступные в предыдущих версиях.

Установка плагина поиска TNT может быть выполнена одним из двух способов. Метод установки GPM (Grav Package Manager) позволяет быстро и легко устанавливать плагин с помощью простой команды терминала, в то время как ручный метод позволяет сделать это через zip -файл.
Самый простой способ установить этот плагин - через диспетчер пакетов GRAV (GPM) через терминал вашей системы (также называемый командной строкой). Из корня вашего типа установки Grav:
bin/gpm install tntsearch
Это установит плагин TNT Search в свой каталог /user/plugins в GRAV. Его файлы можно найти в /your/site/grav/user/plugins/tntsearch .
Помимо стандартных требований GRAV, этот плагин имеет некоторые дополнительные требования. Из-за сложного характера поисковой системы TNTSearch использует базу данных с плоской файлом для хранения его списка Words, а также отображения для контента. Это автоматически обрабатывается плагином, но вам нужно убедиться, что на вашем сервере установлено следующее:
| PHP по умолчанию поставляется с PDO , а подавляющее большинство систем на основе Linux уже поставляются с SQLite.
SQLite на самом деле предварительно установлен на вашем Mac, но вы можете обновить его до последней версии с Homebrew:
Установите Homebrew
$ /usr/bin/ruby -e " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install ) "Установите SQLite с Homebrew
$ brew install sqliteЗагрузите соответствующую версию SQLite со страницы загрузки SQLite.
Извлеките загруженный Zip -файл и запустите исполняемый файл sqlite3.exe .
Перед настройкой этого плагина вы должны скопировать user/plugins/tntsearch/tntsearch.yaml для user/config/plugins/tntsearch.yaml и только редактировать эту копию.
Вот конфигурация по умолчанию и объяснение доступных параметров:
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 Параметры конфигурации следующие:
enabled - включить или немедленно отключить плагинsearch_route - маршрут, используемый для встроенной страницы поискаquery_route - маршрут, используемый в форме поиска для запроса поисковой системыbuilt_in_css - включить или отключить встроенный стиль CSSbuilt_in_js - включить или отключить встроенный JavaScriptbuilt_in_search_page - включить или отключить встроенную страницу поискаenable_admin_page_events - Включить или отключить события страницы, которые происходят on-save чтобы добавить/обновить/удалить страницу в индексеsearch_type - может быть одним из этих типов:basic - Стандартное сопоставление строкboolean - поддержка or или minus . например, foo -barauto - автоматически обнаруживает, использовать ли basic или booleanfuzzy - соответствует, если слова «близко», но не обязательно точные совпаденияdistance - Левенштейн Расстояние нечеткого поиска. Он представляет количество символов, которые необходимо изменить, удалить или добавить в слово, чтобы соответствовать ключевому слову поиска. Увеличение расстояния дает больше результатов поиска, но снижает точность поиска.phrases - автоматически обрабатывают поддержку фразstemmer - может быть одним из этих типов:no - нет стебляarabic - арабский языкcroatian - хорватский языкgerman - немецкий языкitalian - итальянский языкporter - Портер Stemmer для английского языкаportuguese - португальский языкrussian - русский языкukrainian - украинский языкdisplay_route - отображать маршрут в результатах поискаdisplay_hits - отображать количество ударов в результатах поискаdisplay_time - отображать время выполнения в результатах поискаlive_uri_update - Когда включено built_in_js , живые обновления в панели URI на странице search_routelimit - максимальное количество результатов, которые должны быть показаныminsnippet - количество символов для предварительного просмотра элемента результатаindex_page_by_default - если все страницы будут индексированы по умолчанию, если не переопределяется передняя частьscheduled_index - Новое запланированное задание индекса. Отключено по умолчанию, при включении дефолта запускается каждые 3 часа, и выводит результаты в logs/tntsearch-index.outfilter - Фильтр коллекций страниц, который позволяет выбирать определенные страницы для индекса через коллекцию запросаpowered_by - отображать текст TNTSearch с питаниемsearch_object_type - Позволяет пользовательским классам переопределить поддержку Grave Page по умолчанию. Это позволяет полностью пользовательскому поисковому поиску для любого типа данных. TNTSearch полагается на то, что ваш контент будет индексирован в базу данных индекса SQLite, прежде чем будут выполнены какие -либо запросы поиска. Это очень похоже на другие поисковые системы, такие как Elasticsearch, Solr, Lucene и т. Д., Но использует библиотеку Tntsearch библиотеки поисковых систем PHP, чтобы достичь этого с небольшой настройкой и без проблем.
Первый шаг после установки плагина - индексировать ваш контент. Есть несколько способов сделать это.
Во-первых, если вы можете получить доступ к CLI или просто выбрать не использовать плагин администратора, вы можете использовать встроенную команду CLI:
$ bin/plugin tntsearch indexЭто сканирует все ваши страницы и индексирует контент. Вы должны увидеть какой -то вывод, как это:
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.Это указывает на успешную индексацию вашего контента.
Если вы используете плагин администратора, вы можете индексировать свой контент непосредственно из плагина. TntSearch добавляет новый значок быстрого трейла , который позволяет создавать новый индекс или быстро и удобно повторно индекс всего вашего контента с одним щелчком.

В качестве альтернативы вы можете перейти в раздел конфигурации TNTSearch и нажать кнопку Index Content :

ПРИМЕЧАНИЕ. Любая страница, которая использует атрибут заголовка страницы
redirect, будет пропущена во время индексации.
Вы можете явно пропустить страницу, которая находится в индексном фильтре, добавив этот YAML в заголовок страницы:
tntsearch:
index: false
Благодаря новой версии TNTSearch, поддержки была добавлена для нескольких языков (GRAV 1.6. Внутренне это означает, что, скорее, что хранит индекс как user:://data/tntsearch/grav.index , несколько индексов создаются для языка, настроенного в GRAV. Например, если вы установили поддерживаемые языки в ['en', 'fr', 'de'] , то, когда вы выполняете индекс, вы получите три файла: en.index , fr.index и de.index . При запросе соответствующий активный язык определяет, какой индекс запрашивается. Например, выполнение поиска на странице под названием /fr/search приведет к использованию базы данных fr.index , а также возвращаются французские результаты.
Примечание индексация займет больше времени в зависимости от количества языков, которые вы поддерживаете, поскольку TNTSearch должен индексировать каждую страницу на каждом языке.
Примечание. Хотя в этом выпуске поддерживается символы с акцентами, в настоящее время в базовой библиотеке TNTSearch в настоящее время нет поддержки, чтобы соответствовать неакцентным символам с акцентированными, поэтому требуются точные совпадения.
Одним из замечательных новых функций GRAV 1.6 является встроенный планировщик , который позволяет периодически выполнять функциональность, предоставляемую плагином. TNTSearch-отличный вариант использования этой возможности, так как он позволяет планировать задание индексации каждые несколько часов без необходимости вручную сохранять вещи синхронизированием. Есть несколько вариантов, которые позволяют настроить эту возможность.
Во -первых, отметьте, что эта функция планировщика отключена по умолчанию, поэтому вам сначала необходимо включить функциональность планировщика в настройках плагина TNTSearch. После этого вы можете настроить, как часто должна работать задание индексации. По умолчанию каждые 3 часа. Наконец, вы можете настроить, куда регистрируется любой вывод индексации.
После того, как у вас есть индекс, TNTSearch использует события администратора для Cere , U PDATE и D Elete INDEX, когда вы редактируете страницы. Если ваш индекс когда -либо выглядит так, как будто он не синхронизирован, вы можете просто переоценить весь свой сайт.
По умолчанию плагин TNTSearch будет индексировать title и content вашей страницы. Обычно этого достаточно для большинства случаев, но есть ситуации, когда вы можете индексировать больше полей. Плагин дает пример этого, прослушивая событие 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 ;
}
}Это позволяет добавить автора в индексированные поля, если он установлен на передней части страницы. Вы можете добавить свои собственные поля с очень простым плагином, который слушает это событие.
Плагин TNTSearch, как правило, использует визуализированный контент для индекса. Тем не менее, существуют ситуации, когда ваша страница на самом деле представляет собой модульную страницу или построена на других страницах, где на странице нет фактического содержания, или содержание не является представителем страницы в целом. Чтобы бороться с этой ситуацией, вы можете предоставить пользовательские шаблоны в своей теме, которые TntSearch может использовать для отображения контента перед индексацией.
Например, скажем, у нас есть домашняя страница, которая построена из нескольких модульных подпадений с небольшим содержанием под ней, она называется home.md , поэтому использует файл home.html.twig в templates/ папке вашей темы. Вы можете создать упрощенную версию этого шаблона и сохранить его в виде templates/tntsearch/home.html.twig . Для этого примера этот шаблон выглядит так:
{% for module in page. collection () %}
< p >
{{ module . content | raw }}
</ p >
{% endfor %}
{{ page . content | raw }}Как вы можете видеть, просто гарантирует, что модульные страницы отображаются в коллекции страницы, то отображается фактическое содержание страницы.
Чтобы указать TntSearch индексировать с этим шаблоном, а не просто использовать контент страницы сам по себе, вам просто нужно добавить запись в home.md Frontmatter:
tntsearch :
template : ' tntsearch/home ' Плагин TNTSearch для GRAV поставляется со встроенной страницей запросов, которая доступна по маршруту /search по умолчанию. Эта страница поиска представляет собой простое поле ввода, которое будет выполнять запрос Ajax As You-Type . Поскольку TNTSearch настолько быстр, вы получаете ответ поиска в реальном времени аналогичным образом поиска Google. Кроме того, результаты возвращаются уже выделены для соответствующих условий.
Вы также можете проверить поиск с помощью 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... "
}
]
} Если для маршрута /search будет найдена физическая гравийная страница, TNTSearch будет использовать это, а не страницу, предоставленную плагином. Это позволяет легко добавлять контент на страницу поиска по мере необходимости. Если вы хотите настроить фактический вывод HTML, просто скопируйте templates/search.html.twig из плагина в вашу тему и настройте его.
Фактическое поле ввода также может быть изменено по мере необходимости, копируя и редактируя файл templates/partials/tntsearch.html.twig в вашу тему и изменить его.
По умолчанию плагин TNTSearch для GRAV, ответ JSON отправляется со следующей структурой:
{
"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 "
}
]
}Есть случаи, когда этот выход не желательна или должен быть изменен. TntSearch фактически предоставляет событие плагина, чтобы позволить вам манипулировать этим форматом. Пример этого можно увидеть ниже:
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 ();
}
} Важными вещами, на которые следует отметить, являются 1000 ценой заказа, чтобы убедиться, что это событие запускается до события по умолчанию в файле плагина tntsearch.php . Фактический метод события просто устанавливает массив результатов на полях с маршрутом, что привело к:
{
"number_of_hits" : 3 ,
"execution_time" : " 1.000 ms " ,
"results" : [ '/page-a', '/page-b', '/page-c' ]
} Плагин TNTSearch также может использоваться для отображения поиска в качестве раскрывающегося списка, а не на стандартной странице. Для этого вам нужно embed поиск частично и переопределить его, чтобы соответствовать вашим потребностям. Вы можете просто добавить это в свою тему, где бы вы ни хотели, чтобы выпадал Ajax в раскрывающемся поле:
{% embed ' partials/tntsearch.html.twig ' with { limit : 10 , snippet : 150 , min : 3 , search_type : ' auto ' , dropdown : true } %}{% endembed %} Здесь мы внедряем частичный по умолчанию, но переопределяем options , передав их в оператор with . Важно заметить, что dropdown: true должен быть установлен, чтобы интерпретировать как раскрывающийся список.
Этот плагин не был бы возможно без удивительной библиотеки TNTSearch для PHP. Убедитесь, что вы снимаете этот проект на GitHub.