2

私は最初の実際の検索機能を構築したいと考えていました。私はしばらくの間グーグルをしてきましたが、本当に決心してすべてを理解することができませんでした.

私のデータベースには、3 つの InnoDB テーブルが存在します。

  • Products: 製品情報が含まれます。列: proID(プライマリ、自動インクリメント)、(content最大数百の単語を含む) title、、、、および検索クエリに関連しない他の多数。行: 100 ~ 2000。authoryear
  • カテゴリ: カテゴリ情報が含まれます: 列: 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並べ替えに使用しますか?

4

1 に答える 1

5

MyIsam に切り替える必要はありません。フルテキスト インデックス作成は、Mysql 5.6 以降でサポートされています。

私は通常、フルテキスト インデックスを使用することをお勧めします。列のタイトル、著者、年に全文索引を作成します

次に、3 つすべてに対して同時にフルテキスト クエリを実行し、IN BOOLEAN MODE を適用して検索を本当に絞り込むことができます。もちろん、これは自分で決めなければならないことですが、全文のオプションはもっとあります。

ただし、範囲、たとえば日付または単純な文字列の間で生成されるクエリを実行している場合。その場合、標準のインデックスの方が優れていますが、異なる列での tekst 検索には、フルテキスト インデックスが適しています。

これを読んでください:http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

于 2013-10-20T13:05:05.317 に答える