TNTSearch插件适用于GRAV CMS。功能强大的基于索引的全文搜索引擎由TNTSearch库提供动力,该库提供了基于快速的AJAX GRAV内容搜索。该插件非常灵活,允许索引任意内容数据以及自定义的树枝模板,以提供索引模块化和其他动态页面类型的机会。 TNTSearch提供CLI以及基于管理员的管理和重新索引,以及内置的AJAX驱动的前端搜索工具。
注意:TNTSearch版本3.0.0现在需要GRAV 1.6.0或更新才能起作用,因为它使用了以前版本中不可用的新功能。

安装TNT搜索插件可以通过两种方式之一完成。 GPM(GRAV软件包管理器)安装方法使您可以通过简单的终端命令快速轻松地安装插件,而手动方法使您可以通过zip文件进行操作。
安装此插件的最简单方法是通过系统终端(也称为命令行)通过GRAV软件包管理器(GPM)。从坟墓安装类型的根部:
bin/gpm install tntsearch
这将将TNT搜索插件安装到GRAV内的/user/plugins目录中。它的文件可以在/your/site/grav/user/plugins/tntsearch下找到。
除了标准的GRAV要求外,此插件确实有一些额外的要求。由于搜索引擎的复杂性质,TNTSearch利用扁平文件数据库存储其单词列表以及内容的映射。该插件会自动处理此操作,但是您确实需要确保服务器上安装以下内容:
|默认情况下,PHP伴随PDO ,并且绝大多数基于Linux的系统已经带有SQLite。
SQLite实际上是在Mac上预装的,但是您可以将其升级到Homebrew的最新版本:
安装自制
$ /usr/bin/ruby -e " $( curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install ) "安装与自制的SQLite
$ 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启用或禁用内置CSS样式built_in_js启用或禁用内置的JavaScriptbuilt_in_search_page启用或禁用内置搜索页面enable_admin_page_events启用或禁用在索引on-save添加/更新/删除页面的页面事件search_type可以是以下类型之一:basic - 标准字符串匹配boolean - 支持or或minus 。例如foo -barauto - 自动检测是使用basic还是booleanfuzzy - 匹配单词“关闭”,但不一定是确切的匹配distance - 模糊搜索的Levenshtein距离。它表示需要在单词中更改,删除或添加的字符数量以匹配搜索关键字。增加距离会产生更多的搜索结果,但降低了搜索的准确性。phrases - 自动处理短语支持stemmer可以是以下类型之一:no - 没有stemmerarabic - 阿拉伯语croatian - 克罗地亚语german - 德语italian - 意大利语porter - 搬运工的英语portuguese - 葡萄牙语russian - 俄罗斯语ukrainian - 乌克兰语display_route在搜索结果中显示路由display_hits在搜索结果中显示命中次数display_time在搜索结果中显示执行时间live_uri_update启用built_in_js时,实时更新search_route页面中的uri barlimit - 最大结果量min - 执行搜索之前键入的小型字符数量snippet - 预览结果项目的字符数量index_page_by_default默认情况下应索引所有页面,除非frontMatter覆盖scheduled_index新的计划索引作业。默认情况下禁用时,当启用默认设置每3小时运行一次时,将结果输出到logs/tntsearch-index.outfilter - 页面收集过滤器,可让您通过集合查询选择特定页面索引powered_by显示驱动的by tntsearch文本search_object_type允许自定义类覆盖默认的GRAV页面支持。这允许对任何数据类型进行完全自定义的搜索功能。 tntsearch依靠您的内容被索引到SQLite索引数据库,然后才能进行任何搜索查询。这与其他搜索引擎(例如Elasticsearch,Solr,Lucene等)非常相似,但是它使用了相对简单的PHP搜索引擎库TNTSearch库来实现这一目标,而无需设置和麻烦。
安装插件后的第一步是为您的内容索引。您可以通过多种方法来实现这一目标。
首先,如果您能够访问CLI或只是选择不使用Admin插件,则可以使用内置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
借助新的3.0版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将使用管理事件在编辑页面时使用admin Everte, c Reate, u pdate和d elete索引条目。如果您的索引看起来像是不同步的,那么您可以简单地重新索引整个网站。
默认情况下,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 ;
}
}如果将作者设置在页面FrontMatter中,则可以将作者添加到索引字段中。您可以使用非常简单的插件添加自己的自定义字段,该插件会聆听此事件。
TNTSearch插件通常使用渲染内容来索引。但是,在某些情况下,您的页面实际上是一个模块化页面,或者是从页面上没有实际内容的其他页面中构建的,或者内容并不代表整个页面的代表。为了应对这种情况,您可以在主题中提供自定义模板,TNTSearch可以在索引之前用来渲染内容。
例如,假设我们有一个由几个模块化子页面构建的主页,其下面的内容很少,它称为home.md ,因此在您的主题templates/文件夹中使用home.html.twig文件。您可以创建此模板的简化版本,并将其保存为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 'GRAV的TNTSearch插件附带一个内置查询页面,默认情况下可以通过/search路由访问。此搜索页面是一个简单的输入字段,它将按照您的类型执行Ajax查询。由于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文件,也可以根据需要修改实际输入字段,并将其修改。
默认情况下,GRAV的TNTSearch插件,响应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 %}在这里,我们嵌入了默认部分,但是通过with语句将选项传递给了options 。重要的是要注意dropdown: true才能将其解释为下拉。
没有PHP的惊人TNTSearch库,这个插件将是不可能的。确保您在Github上饰演该项目。