これに追加するのは、full text searching
Rails のアイデアです。検索を実行している場合、実際には DB で全文の「検索」クエリを実行していることに注意する必要があります。これは、使用する SQL エンジンによって異なります。
MYSQL 全文検索
このLIKE %{search}%
メカニズムは MYSQL の非常に基本的な全文検索機能であり、基本的には DB 内のレコード全体からターゲット クエリを探します。これは、クエリが次の場合を意味します。
SELECT * FROM `products` WHERE `name` LIKE '%alligator%'
MYSQL は基本的に、クエリへの参照がないか「name」レコード全体を調べます。結果は、記録に「アリゲーター」という単語が含まれているかどうかに基づいています。このリファレンスでは、これについてさらに説明しています
PostgreSQL 全文検索
私がこの記事を書いた理由は、PSQL が実際にこれを別の方法で行うためです。したがって、提供されたクエリは MYSQL でのみ機能します。PSQL には全文検索を処理するさまざまな機能がありますが、Heroku を使用しているため、Textacular gemを使用してすべてを適切に機能させることができました。
以下に、PSQL が全文検索を処理するいくつかの方法を示します。
PostgreSQL での全文検索は、一致演算子 @@ に基づいており、tsvector (ドキュメント) が tsquery (クエリ) と一致する場合に true を返します。どのデータ型が最初に書き込まれるかは問題ではありません。
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat &
rat'::tsquery; ?column?
---------- t
SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat
rat'::tsvector; ?column?
---------- f
上記の例が示すように、tsquery は単なる生のテキストではなく、tsvector > と同様です。tsquery には、正規化された語彙素である必要がある検索用語が含まれており、AND、OR、および NOT 演算子を使用して複数の用語を組み合わせることができます。(詳細については、セクション 8.11 を参照してください。) ユーザーが記述したテキストを適切な tsquery に変換するのに役立つ関数 to_tsquery および plainto_tsquery があります。たとえば、テキストに表示される単語を正規化します。同様に、to_tsvector はドキュメント文字列の解析と正規化に使用されます。したがって、実際には、テキスト検索の一致は次のようになります。
SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat'); ?column?
---------- t Observe that this match would not succeed if written as
SELECT '太った猫が太ったネズミを食べた'::tsvector @@ to_tsquery('太った & ネズミ'); ?桁?---------- f
全文検索ソフトウェア
全文検索は、特に検索するデータが大量にある場合、DB で本質的に非常にコストがかかります。そのため、 sunspot solrやsphinxなどのソリューションが存在し、データのインデックス作成と検索の両方を行う方法を提供します。
アプリケーションが非常に人気になった場合は、Heroku で実証されているような全文検索システムの 1 つに投資することをお勧めします。
