在學說實體中實施易於使用的搜索引擎。
為了基本用途,您要做的就是定義搜索實體及其屬性的地圖,搜索引擎將安排正確加載它們,並根據所找到的候選者自動對搜索結果進行分類。
包裝的目的是為學說實體中的高級全文搜索提供簡單的API。在請求開始時,建立了搜索方案,該軟件包自動確保根據相關性找到並返回最佳結果。
手動安裝軟件包調用作曲家並執行以下命令:
$ composer require baraja-core/doctrine-fulltext-search然後在配置霓虹燈中註冊DoctrineFulltextSearchExtension :
extensions :
doctrineFulltextSearch : BarajaSearchDoctrineFulltextSearchExtension或者,您可以手動創建BarajaSearchSearch的實例。
搜索是通過構建查詢(映射實體和列)來執行的:
$ results = $ this -> search -> search ( $ query , [
Article ::class => [ ' :title ' ],
User ::class => ' :username ' , // it can also be an ordinary string for a single column
UserLogin ::class => [ ' :ip ' , ' hostname ' , ' userAgent ' ],
]);
echo $ results ; // Uses the default HTML renderer或者,您可以使用具有完整類型驗證和提示方法的SelectorBuilder來構建查詢:
$ results = $ this -> search -> selectorBuilder ( $ query )
-> addEntity ( Article ::class)
-> addColumnTitle ( ' title ' )
-> addEntity ( User ::class)
-> addColumnTitle ( ' username ' )
-> addEntity ( UserLogin ::class)
-> addColumnTitle ( ' ip ' )
-> addColumn ( ' hostname ' )
-> addColumnSearchOnly ( ' userAgent ' )
-> search ();
echo $ results ;無需逃脫輸出,所有邏輯都是由引擎自動解決的。
:username - 該列將用作標題
!slug該列將用於搜索,但在Perex輸出中被忽略。
_durationTime該列將加載到實體中,但在計算相關性時不會考慮,並且不會包含在perex中。
content.versions.haystack實體之間的關係會自動創建一個聯接並加載最後一個屬性。
versions(content) - 自定義getter(自動加入versions列,但請致電getContent()獲取數據)。
如果我們在列名的開頭(例如':username' )使用結腸,則將自動用作標題。
即使不包含搜索詞,標題也將顯示。
標題可能是空的,可能不存在(可能為null )。
如果標題不存在,則引擎可以根據發現的文本中的最佳出現自動對其進行計算。
搜索查詢將自動歸一化並刪除停止詞,為此搜索沒有意義。
通過實現IQueryNormalizer界面並將其覆蓋DIC容器中的算法可以在特定項目中覆蓋該算法。
search()方法的輸出是SearchResult類型的實體,它實現了Iterator界面的實現,以便容易循環循環結果。
提示:如果您只需要快速打印搜索結果並且外觀要求不是很高,則
SearchResult實體直接實現__toString()方法,以簡化結果直接作為HTML。
搜索結果總結了所有實體中所有搜索的所有結果。所有結果均通過getItems()方法獲得 - 輸出將是SearchItem[]類型實體的數組。
但是,我們通常需要批量編譯查詢,然後單獨列表,例如類別和產品。為此,請使用助手方法getItemsOfType(string $type) ,該horter返回type SearchItem[]的截斷陣列[]僅根據傳遞的參數來返回實體。
我們使用getItems()或getItemsOfType()方法來獲取我們經歷的搜索結果。但是如何處理特定結果呢?
重要的是要注意,在這一點上,我們不再擁有可用的__toString()方法,並且必須自己渲染結果(理想情況下是模板中)。
對於大多數情況,現成的助手就足夠了:
getTitle()將發現實體的標題返回為字符串或null。getTitleHighlighted()呼叫內部呼叫getTitle() ,如果結果是有效的字符串,則用<i class="highlight">和</i>染色每個單詞的出現。getSnippet()返回找到的實體的摘要,該片段總結了原始實體中最佳的區域(例如,在發生搜索單詞的地方片段)。可以返回更多的片段(單個出現由結腸劃分)。始終返回字符串(可以為空)。getTitleHighlighted()內部調用getSnippet() ,並用<i class="highlight">和</i>為每個單詞的出現著色。getScore()返回相對(根據搜索查詢和每個項目中的可用數據在上下文上不同)結果評估(根據此參數,結果將自動排序)。getEntity()返回原則在內部產生的原始發現的實體。搜索是使用部分選擇執行的,因此並非所有屬性都可以始終可用。entityToArray()作為數組返回自己。字符串自動歸一化。 這兩種方法都獲得結果( getItems()和getItemsOfType() )接受參數$limit (默認為10 )和$offset (默認為0 )。
最好使用Nette分頁來實施分頁本身。
結果總數是通過SearchResult實體上方的getCountResults()方法獲得的。
搜索引擎使用PARTIAL來加載數據庫實體並將結果實體包裝到搜索結果中,因此您可以隨時通過在特定的搜索結果上調用->getEntity()來加載它們。
如果找不到結果,或者它們的數字為“小”(根據特定項目的分析,定義由算法本身確定),則可以(並且可能無法)提供最佳校正查詢的提示。
為了幫助您,請通過SearchResult來調用getDidYouMean()方法。輸出是字符串(更好的搜索查詢)或NULL。
最佳的搜索查詢校正是通過搜索引擎本身基於每個項目中的高級搜索分析來獲得的,該搜索引擎使用機器學習方法分別在每個項目中。每次搜索,有關搜索查詢的統計信息,結果和其他信號的數量在必要時會自動保存和回顧性分析。
獲得幫助是自然的,不能容易受到影響。搜索引擎努力提高客觀性,並為用戶提供搜索他人的單詞,並根據當前上下文返回盡可能多的相關結果。在內部,使用了複雜的數學功能,我們會根據所有項目的經驗不斷改進。
搜索時,首先彙編了搜索結果的候選人列表。這些結果分別通過評估算法512 0內執行自動“相對”評估(基於諸如搜索查詢,最近的用戶歷史記錄,語言,物理位置,實體內容和類型的各種信號(結果始終是int )。
根據點評估,結果會自動分類。
可以通過實現IScoreCalculator接口並在DIC容器中覆蓋評分算法。
baraja-core/doctrine-fulltext-search已獲得MIT許可證的許可。有關更多詳細信息,請參見許可證文件。