私は最初の実際の検索機能を構築したいと考えていました。私はしばらくの間グーグルをしてきましたが、本当に決心してすべてを理解することができませんでした.
私のデータベースには、3 つの InnoDB テーブルが存在します。
- Products: 製品情報が含まれます。列:
proID
(プライマリ、自動インクリメント)、(content
最大数百の単語を含む)title
、、、、および検索クエリに関連しない他の多数。行: 100 ~ 2000。author
year
- カテゴリ: カテゴリ情報が含まれます: 列:
catID
(プライマリ、自動インクリメント)catName
、. 行: 5-30 - Productscategories: 上記 2 つの間のリンク。各製品は、複数のカテゴリに関連付けることができます。列:
pcID
(プライマリ、自動インクリメント)catID
、、、proID
。行: 製品の 1 ~ 5 倍の量。
私の検索機能は以下のものを提供します。入力する必要はありません。複数入力すると、最終的なクエリで AND クエリで結合されます。
- 用語: コンテンツとタイトル フィールドを検索します。ランダムな用語で検索します。複数の単語を追加できますが、それぞれを個別に検索します。ほとんどの場合、データベースとの一致は 1 回で十分です (
OR
-query) - 年: 製品の年列で検索します。
- カテゴリ: カテゴリのリストから選択できます。複数可能。フォームは、選択したカテゴリの catID を返します。ヒットにはデータベースとの 1 つの一致で十分です (OR クエリ)
author
作成者:商品の - 列の検索
お気付きかもしれませんが、カテゴリを選択すると、products テーブルと productcategories テーブルが検索クエリ用に結合されます。2 つの間に外部キー セットもあります。
関係を明確にするために、それがどのように解釈されるべきかの例 (年を検索しないでください!):
探すWHERE (products.content = term 1 OR products.content = term 2 OR products.title = term 1 OR products.title = term 2 ......) AND (products.author = author) AND (productscategories.catID = catID1 OR productscategories.catID= catID2 ......)
また、各「ページ」に 10 件の結果のみを表示するページネーション システムを作成したことにも注意してください。
私が立ち往生している質問は次のとおりです。この検索クエリを最適化したいのですが、どの方法が最適かわかりません。
私が見つけたほとんどの場合、グーグルはLIKE %%
mysqli-query を使用していました。ただし、一部はMATCH...AGAINST
. 私は最後のものを本当に気に入っているようです。なぜなら、関連性でソートできることと、クエリの作成がはるかに簡単になるように思われるからですLIKE %%
(多数の と組み合わせるのではなく、用語の値に対して 1 つの一致OR
)。ただし、用語検索フィールドでのみ使用するようです。ただしMATCH...AGAINST
、MyIsam テーブル (右?) が必要になるため、外部キーを使用してデータベースの障害を防ぐことはできません。
MATCH...AGAINST
例 (年フィールド、カテゴリ フィールドなし、製品と製品カテゴリを結合しない):
SELECT *,MATCH (content,title) AGAINST ('search terms' IN BOOLEAN MODE) AS relevance
FROM products WHERE (MATCH (content,title) AGAINST ('search terms' IN BOOLEAN MODE)) AND
author='author' SORT BY relevance LIMIT 10
%LIKE%
例(年フィールド、カテゴリフィールドなし、製品と製品カテゴリを結合していない)と悲しいことに関連性のないソート:
SELECT * FROM products WHERE
(content LIKE '%term1%' OR content LIKE '%term2' OR title LIKE '%term1%' OR title LIKE '%term2%')
AND (author='author') SORT BY title LIMIT 10
を使用して関連性のある並べ替えを行いCASE
、タイトルまたはコンテンツに用語が含まれている場合は「ポイント」を追加できますか? または、パフォーマンスに対してクエリが重くなりすぎますか?
では、この種のクエリを作成する最良の方法は何ですか? Innodb とLIKE
を使用するか、MyIsam に切り替えてMATCH...AGAINST
並べ替えに使用しますか?