ホームページ >バックエンド開発 >PHPチュートリアル >Laravel Searchy 拡張パッケージを使用して、Laravel に軽量のデータベースベースの検索機能を実装します。

Laravel Searchy 拡張パッケージを使用して、Laravel に軽量のデータベースベースの検索機能を実装します。

WBOY
WBOYオリジナル
2016-06-23 13:07:281080ブラウズ

1. はじめに

Laravel Searchy は、MySQL をサポートする使いやすい軽量の Laravel 検索拡張パッケージです。この拡張パッケージを使用すると、モデルベースのデータ クエリと検索関数を簡単かつ効率的に実装できます。この拡張機能では、有効にした検索エンジンに基づいて、あいまい検索やその他の重み付けメカニズムも有効になります。さらに、拡張パックの使用を開始するためにサーバーに追加のソフトウェアをインストールする必要はありません。

注: Laravel 4 と互換性を持たせたい場合は、https://github.com/TomLingham/Laravel-Searchy/tree/1.0 を参照してください

2. インストール

Composer を使用して、拡張機能パッケージ (composer 内) 次の 2 つの依存関係を .json の require 項目に追加します:

"require": {    "tom-lingham/searchy" : "2.*"}

次に、composer update を実行して、依存関係をベンダー ディレクトリにダウンロードします。

インストールが完了したら、config/app.php のプロバイダーにサービスプロバイダーを登録する必要があります:

TomLingham\Searchy\SearchyServiceProvider::class

ちなみに、対応するファサードを config/app.php のエイリアスに登録します:

'Searchy' => TomLingham\Searchy\Facades\Searchy::class

3. を使用します。

ユーザー (データテーブルのユーザーに対応) の名前と電子メールを検索する場合:

$users = Searchy::users('name', 'email')->query('John Smith')->get();

同じ関数を次のように実装することもできます:

$users = Searchy::search('users')->fields('name', 'email')->query('John Smith')->get();

この例では、検索フィールドを渡します。フィールドメソッドを通じて。

上記のコードは、検索結果を含むオブジェクト配列を返します。データベース クエリ オブジェクト インスタンスを返したい場合は、get() メソッドの代わりに getQuery() を使用できます。たとえば、ユーザーの名前、電子メールを検索したい場合、ユーザー名は次のように呼び出すことができます:

$users = Searchy::search('users')->fields('name', 'email')->query('John Smith')    ->getQuery()->having('relevance', '>', 20)->get();

検索フィールドに動的に渡す必要がある場合は、配列の形式でパラメータを渡すことができます:

$users = Searchy::users('name', 'email', 'username')->query('John Smith')->get();
Query connection/cascade フィールド

場合によっては、カスケード フィールドを検索する必要がある場合があります。たとえば、first_name と last_name 全体を一度に返したい場合は、フィールドを 2 つのコロンで区切ることができます:

$users = Searchy::users(['name', 'email', 'username'])->query('John Smith')->get();

ソフト削除されたレコード

デフォルトでは、論理的に削除されたレコードは検索結果に含まれません。論理的に削除されたレコードを含めたい場合は、テーブルとフィールドを指定した後に withTrashed() を追加することで実行できます:

$users = Searchy::users('first_name::last_name')->query('John Smith')->get();

指定されたフィールドを返します

検索で返されるフィールドを指定できます:

Searchy::users('name')->withTrashed()->query('Batman')->get();

さらに、ここでは入力に関係なく、エイリアスフィールドの関連性を返します。

4. 設定

設定ファイルを config ディレクトリに公開して、デフォルトの設定をオーバーライドできます:

$users = Searchy::users('first_name::last_name')->query('John Smith')->select('first_name')->get();// Or you can swap those around...$users = Searchy::users('first_name::last_name')->select('first_name')->query('John Smith')->get();

生成された設定ファイル searchy.php では、現在、検索に使用されるデフォルトのドライバーを設定できます。 、シンプル、レーベンシュタインがサポートされています。

次の構文を使用して、検索時に検索ドライバーを動的に設定することもできます:
php artisan vendor:publish

5. 検索ドライバー

Searchy は、「ドライバー」を使用して複数条件フィールドの一致を処理します。指定されたグループ「」の「一致」。指定された条件に基づいて文字列を一致させるために使用されます。現在、Searchy は、Simple、Fuzzy、および Levenshtein (実験的) の 3 つのドライバーのみをサポートしています。

Simple

Simple search ドライバーは 3 つのマッチャーのみを使用し、各マッチャーには最適な一致を得るために関連付けられた乗算係数があります 私のテスト環境:

Searchy::driver('fuzzy')->users('name')->query('Batman')->get();

Fuzzy

あいまい検索ドライバーは、もう 1 つのマッチャーの組み合わせです。ここでの乗算係数はすべて私が使用したものであり、手動で変更することもできます:

protected $matchers = [    'TomLingham\Searchy\Matchers\ExactMatcher'                 => 100,    'TomLingham\Searchy\Matchers\StartOfStringMatcher'         => 50,    'TomLingham\Searchy\Matchers\InStringMatcher'              => 30,];

Levenshtein

Levenshtein 検索ドライバーは、Levenshtein Distance (文字列類似性アルゴリズム) を使用して、「文字列間の距離」を計算します。これには、MySQL の levenshtein(string1, string2) に似たストアド プロシージャが必要です (このストアド プロシージャは、拡張機能パッケージのソース コードの res ディレクトリにある SQL ファイルにあります):

protected $matchers = [    'TomLingham\Searchy\Matchers\ExactMatcher'                 => 100,    'TomLingham\Searchy\Matchers\StartOfStringMatcher'         => 50,    'TomLingham\Searchy\Matchers\AcronymMatcher'               => 42,    'TomLingham\Searchy\Matchers\ConsecutiveCharactersMatcher' => 40,    'TomLingham\Searchy\Matchers\StartOfWordsMatcher'          => 35,    'TomLingham\Searchy\Matchers\StudlyCaseMatcher'            => 32,    'TomLingham\Searchy\Matchers\InStringMatcher'              => 30,    'TomLingham\Searchy\Matchers\TimesInStringMatcher'         => 8,];

6. Matcher

ExactMatcher

完全一致

StartOfStringMatcher

「hel」や「Hello World」など、文字列の先頭が一致しているかどうかに一致します

AcronymMatcher

「fb」や「foo bar」、「」などの文字列の省略形に一致しますFred Brown"

ConsecutiveCharactersMatcher

文字列に一貫した連続文字が含まれているかどうかを照合します。さらに、一致する文字の割合も計算し、対応する乗算係数を適用します。たとえば、「fba」を検索すると、「foo bar」または「foo bar」と一致します。 「コウモリを恐れる」、「素晴らしい」とは一致しません

StartOfWordsMatcher

文字列の先頭の単語が一貫しているかどうかを照合します (たとえば、「jo ta」と「John Taylor」または「Joshua B. Takeshi」)。

StudlyCaseMatcher

キャメルケースの一致(たとえば、「hp」と「HtmlServiceProvider」または「HashParser」)。ただし、「hasProvider」とは一致しません

InStringMatcher

文字列包含一致(「smi」や「John Smith」など)または「Smiley Face」

TimesInStringMatcher

含まれる文字列の数 マッチング。たとえば、「tha」を検索すると、「あの猫がそのネズミを捕まえてくれるといいのですが」 (3 回) または「ありがとう、とてもよかったです!」 と一致します。 (1×)

LevenshteinMatcher

レーベンシュタインドライバーを参照。

7. 拡張機能

Driver

独自の検索ドライバーの実装は非常に簡単で、TomLinghamSearchySearchDriversBaseSearchDriver を継承するクラスを作成し、$matchers 属性配列を追加するだけです。

Matchers

独自のマッチャーを作成するには、TomLinghamSearchyMatchersBaseMatcher を継承するクラスを作成し、formatQuery メソッドをオーバーライドして、指定された位置に % ワイルドカードを使用して書式設定された文字列を返します。より高度な拡張機能を実装するには、buildQuery メソッドをオーバーライドする必要があります。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。