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上飾演該項目。