教義エンティティで使いやすい検索エンジンの実装。
基本的な使用のために、検索されたエンティティとそのプロパティのマップを定義するだけで、検索エンジンが正しくロードされるように手配し、見つかった候補に基づいて検索結果を自動的にソートします。
パッケージの目的は、教義エンティティでの高度なフルテキスト検索のための簡単なAPIを提供することです。リクエストの開始時に、検索スキームが構築され、このパッケージにより、関連性に基づいて最良の結果が見つかり、返されることが自動的に保証されます。
パッケージコールコンポーザーを手動でインストールし、次のコマンドを実行するには。
$ composer require baraja-core/doctrine-fulltext-searchそして、構成neonに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) - カスタムゲッター( versions列に自動的に結合しますが、 getContent()を呼び出してデータを取得します)。
列名の先頭にコロンを使用する場合(たとえば':username' )、タイトルとして自動的に使用されます。
タイトルには、検索ワードが含まれていなくても表示されます。
キャプションは空であり、存在しない場合があります( nullある可能性があります)。
タイトルが存在しない場合、エンジンは、発見されたテキストの最良の発生に従って自動的に計算できます。
検索クエリは自動的に正規化され、ストップワードが削除されますが、検索は意味がありません。
アルゴリズムは、 IQueryNormalizerインターフェイスを実装し、DICコンテナに上書きすることにより、特定のプロジェクトでオーバーライドできます。
search()メソッドの出力は、 SearchResultタイプのエンティティであり、結果を簡単に循環する機能のためにIteratorインターフェイスを実装します。
ヒント:検索結果をすばやく印刷する必要があり、外観要件がそれほど高くない場合、
SearchResultエンティティは、結果をHTMLとして直接レンダリングするために__toString()メソッドを直接実装します。
検索結果は、すべてのエンティティのすべての検索のすべての結果をまとめたものです。すべての結果は、 getItems()メソッドによって取得されます - 出力は、 SearchItem[]タイプのエンティティの配列になります。
ただし、多くの場合、クエリを一括でコンパイルしてから、たとえばカテゴリと製品を個別にリストする必要があります。これを行うには、ヘルパーメソッドgetItemsOfType(string $type)を使用します。これは、合格したパラメーターに従ってエンティティのみの型SearchItem[]を返します。
getItems()またはgetItemsOfType()メソッドを使用して、検索結果を取得しました。しかし、特定の結果を扱う方法は?
この時点で、 __toString()メソッドを使用できなくなり、結果(理想的にはテンプレート)を自分でレンダリングする必要があることに注意することが重要です。
ほとんどの場合、既製のヘルパーで十分です:
getTitle()見つかったエンティティのタイトルを文字列またはnullとして返します。getTitleHighlighted() getTitle()内部的に呼び出し、結果が有効な文字列である場合、 <i class="highlight"> and </i>で各単語の発生を汚します。getSnippet() 、発見されたエンティティのスニペットを返します。これは、元のエンティティで最もよく見つかった領域を要約しています(たとえば、検索ワードが発生する記事のスニペット)。より多くのスニペットを返すことができます(個々の発生はコロンで分割されます)。常に文字列を返します(空にすることができます)。getTitleHighlighted()内部的に呼び出しgetSnippet()と<i class="highlight">および</i>を使用して各単語の発生を色付けします。getScore() 、相対的なもの(各プロジェクトの検索クエリと使用可能なデータに従ってコンテキストで異なる異なる)を返します(このパラメーターによると、結果は自動的にソートされます)。getEntity()教義が内部で生産した元の発見されたエンティティを返します。検索は部分的な選択を使用して実行されるため、すべてのプロパティが常に利用できるわけではありません。entityToArray() 、アレイとして自分自身を返します。文字列は自動的に正規化されます。 結果を取得する方法( getItems()およびgetItemsOfType() )の両方の方法は、パラメーター$limit (デフォルト10 )と$offset (デフォルト0 )を受け入れます。
ページング自体は、Nette Paginationを使用して最適に実装されています。
結果の総数は、 SearchResultエンティティの上のgetCountResults()メソッドによって取得されます。
検索エンジンはPARTIALにデータベースエンティティをロードし、結果のエンティティを検索結果にラップするため、特定の検索結果を上回る->getEntity()を呼び出すことでいつでもロードできます。
結果が見つからない場合、またはそれらの数が「小」である場合(定義は、特定のプロジェクトの分析に従ってアルゴリズム自体によって決定されます)、検索クエリの最良の修正のヒントが利用可能である可能性があります(また)。
ヘルプについては、 SearchResultを介してgetDidYouMean()メソッドを呼び出します。出力は、文字列(より良い検索クエリ)またはnullのいずれかです。
最適な検索クエリ修正は、機械学習方法を使用して各プロジェクト内の高度な検索分析に基づいて、検索エンジン自体によって取得されます。検索ごとに、検索クエリに関する統計、結果とその他の信号の数が自動的に保存され、必要に応じて遡及的に分析されます。
助けを得ることは自然であり、簡単に影響を受けることはできません。検索エンジンは最大の客観性を求めて努力し、他の人を検索する単語をユーザーに提供し、現在のコンテキストに従って可能な限り多くの関連する結果を返します。内部的には、複雑な数学機能が使用されています。これは、すべてのプロジェクトの経験に基づいて常に改善しています。
検索するとき、検索結果の候補者のリストが最初にコンパイルされます。これらの結果は、 0 512範囲で自動「相対」評価を実行する評価アルゴリズムを個別に渡されます(検索クエリ、最近のユーザー履歴、言語、物理的位置、エンティティコンテンツ、タイプなどのさまざまな信号に基づいて)(結果は常にint )。
ポイント評価によれば、結果は自動的にソートされます。
スコアリングアルゴリズムは、 IScoreCalculatorインターフェイスを実装し、DICコンテナに上書きすることでオーバーライドできます。
baraja-core/doctrine-fulltext-search MITライセンスに基づいてライセンスされています。詳細については、ライセンスファイルを参照してください。