該軟件包提供了一個通用的Laravel Scout驅動程序,該驅動程序使用SQL數據庫作為存儲後端對索引模型數據進行全文搜索。索引數據以歸一化形式存儲,允許不需要完整和/或精確匹配的高效且模糊的搜索。
該驅動程序是teamtnt/laravel-scout-tntsearch-driver的替代方案。主要區別在於,該驅動程序提供的功能較少(例如GEO搜索)。取而代之的是,它與Laravel本身支持的所有數據庫系統(基本上都是PDO驅動程序)一起使用。同樣,搜索算法略有不同。
所有測試均通過以下數據庫系統的PHP 8.0、8.1和8.2的GitHub操作進行:
有關支持數據庫系統的實際限制主要與使用Staudenmeir/Laravel-CTE使用常見表表達式有關。請在使用軟件包之前確保支持您的數據庫系統,否則您可能會遇到數據庫錯誤。
您可以通過作曲家安裝軟件包:
composer require namoshek/laravel-scout-database安裝軟件包後,需要發布配置文件以及遷移:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " config "
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations "如果您想對本軟件包創建的表使用與scout_不同的表前綴,則應相應地更改配置以及復制的遷移。這樣做後,您可以應用數據庫遷移:
php artisan migratev0.x升級到v1.x 有了新版本,數據庫模式已更改,需要使用以下方式發布新的遷移:
php artisan vendor:publish --provider= " NamoshekScoutDatabaseScoutDatabaseServiceProvider " --tag= " migrations "安裝部分中上面提到的同樣提示也適用於新發布的遷移。
該配置已稍微減少,您可能需要將新配置文件與舊配置文件進行比較以刪除過時的設置。不過,跳過這部分不會對童軍駕駛員的性能產生負面影響。
NamoshekScoutDatabaseCommandsCleanWordsTable::class命令已被刪除,如果以前添加,則應將其取消安排。
protected領域和方法的大多數出現已更改為private ,以簡化未來的向後兼容性破壞變化。如果您沒有積極地覆蓋實施的一部分,那麼這根本不會影響您。
為了指示Scout使用此軟件包提供的驅動程序,您需要將config/scout.php中的driver選項更改為database 。如果您沒有更改Scout配置文件,則還可以將SCOUT_DRIVER環境變量設置為database 。
軟件包本身的所有可用配置選項都可以在config/scout-database.php中找到。這些選項在文件本身中徹底描述。默認情況下,該軟件包使用適合英語的UnicodeTokenizer和PorterStemmer 。該搜索在最後一個令牌中添加了一個尾隨的通配符,並不需要找到所有搜索詞才能在結果中顯示文檔(雖然必須至少有一個匹配項)。
您也可以通過在配置文件中啟用wildcard_all_tokens在每個搜索令牌中添加通配符,這不建議出於性能原因。
基本的安裝很可能不需要您更改這些設置中的任何一個。只是為了確保您應該查看connection選項。如果要更改此操作,請在運行遷移之前,或使用錯誤的數據庫連接創建表。
目前,只有一個UnicodeTokenizer 。它將既不是字母的字符,也不是根據p{L}和p{N} Regex模式的數字拆分字符串。這意味著點,結腸,破折號,空格等是分裂標準。
如果您對令牌儀有不同的要求,則可以通過配置提供自己的實現。只需確保它實現Tokenizer界面即可。
當前,所有由wamania/php-stemmer軟件包實施的Stemmers都可以使用。每個人都添加了包裝班:
DanishStemmerDutchStemmerEnglishStemmerFrenchStemmerGermanStemmerItalianStemmerNorwegianStemmerNullStemmer (可用於禁用詞幹)PorterStemmer (默認,與EnglishStemmer相同)PortugueseStemmerRomanianStemmerRussianStemmerSpanishStemmerSwedishStemmer如果您對Stemmer有不同的要求,則可以通過配置提供自己的實現。只需確保它實現Stemmer接口即可。
該軟件包遵循官方偵察文檔中描述的可用用例。但是請注意列出的限制。
搜索驅動程序在內部使用一個表,其中包含術語和與文檔的關聯。索引文檔(即在搜索索引中添加或更新模型)時,引擎將使用配置的令牌器將每列的輸入分為令牌。默認情況下配置的代幣器簡單地將輸入分為由任何Unicode字母或數字組成的單詞,這意味著任何其他字符,例如, . , - , _ ! , ? , / ,Whitespace和所有其他特殊字符被視為令牌的分離器,將由令牌刪除。這樣,這些字符永遠不會最終進入搜索索引本身。
輸入已被令牌化後,每個令牌(在這一點上,我們實際上希望我們的令牌是單詞)都通過配置的詞幹來檢索詞幹(即root Word )。執行此操作使我們以後可以搜索類似的單詞。例如, PorterStemmer將產生intellig和intelligent作為輸入的intelligence 。稍後清楚搜索時,這將如何有所幫助。
最後,此過程的結果存儲在數據庫中。索引表中填充了莖過程的結果以及與索引模型(模型類型和標識符)的關聯。最重要的是,對於索引中的每一行,數據庫還包含文檔中的事件數。我們使用此信息在引擎的搜索部分進行評分。
執行搜索查詢時,將與索引所用的相同的標記化和莖過程應用於搜索查詢字符串。此過程的結果是詞幹(或根單詞)的列表,然後將其用於執行實際搜索。根據軟件包的配置,搜索將返回至少包含一個或全部詞幹的文檔。這是通過基於反向文檔頻率計算索引中每場匹配的分數(即索引文檔和包含一個搜索單詞之一的文檔之間的比率),術語頻率(即文檔中搜索術語中的出現)和術語偏差(僅與通配符搜索相關)。返回的是按照其降序訂單訂購的文件,直到達到所需的限制為止。
可以使用自定義列擴展搜索索引表( scout_index )。在索引期間,這些列可以填充自定義內容,在搜索過程中,可以將搜索範圍範圍範圍(確切的匹配)範圍範圍(確切匹配)。當使用多個租戶使用搜索指數的多租賃應用程序時,此功能特別有用。
在我們的示例中,我們將強制性的tenant_id列添加到搜索索引。
return new class extends Migration {
public function up (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> uuid ( ' tenant_id ' );
});
}
public function down (): void
{
Schema :: table ( ' scout_index ' , function ( Blueprint $ table ) {
$ table -> dropColumn ([ ' tenant_id ' ]);
});
}
};在每個模型的索引期間添加tenant_id :
class User extends Model
{
public function toSearchableArray (): array
{
return [
' id ' => $ this -> id ,
' name ' => $ this -> name ,
' tenant_id ' => new StandaloneField ( $ this -> tenant_id ),
];
}
}tenant_id在搜索過程中根據$tenantId進行過濾,例如,可以從HTTP請求中獲取:
User :: search ( ' Max Mustermann ' )
-> where ( ' tenant_id ' , $ tenantId )
-> get ();顯然,此軟件包沒有提供搜索引擎(甚至是遠程)帶來的性能和質量,例如Elasticsearch提供的專業搜索引擎。該解決方案是針對需要一個相當簡單的解決方案的較小至中型項目。
同樣值得注意的是,目前尚未實施以下偵察功能:
User::search('Mustermann')->within('users_without_admins')User::search('Musterfrau')->orderBy('age', 'desc')該搜索引擎的一個問題是,如果多個隊列工人同時處理單個文檔的索引(數據庫將死去),則可能導致問題。為了避免此問題,可以配置用於交易的嘗試數量。默認情況下,如果發生僵局(或任何其他錯誤),則每次交易最多嘗試三次。
麻省理工學院許可證(麻省理工學院)。請參閱許可證文件以獲取更多信息。