私は、出現回数と製品が表示されるスキーマに基づいてキーワードに重みを付ける「単一検索」を使用してデジタルミュージックストアを運営しています。「Artist」、「Title」、「Publisher」などのさまざまな列があります。
製品はアルバムやプレイリストにも関連していますが、簡単に説明するために、製品のキーワードのインデックス作成とクエリについてのみ詳しく説明します。
データベーススキーマ
Keywords
table-検索される可能性のあるすべての単語の加重テーブル(したがって、どこかで参照されます)と、各レコードの次のデータ:
- キーワードID(単語ではない)、
- みことばそのもの、
- WordのSoundexAlpha値
- 重さ
ProductKeywords
table-製品のフィールド(または列)のいずれかによって参照されるすべてのキーワードの加重テーブルと、各レコードの次のデータ:
キーワードの重み付け
加重値は、単語が出現する頻度を示します。重みが小さい一致するキーワードは「よりユニーク」であり、検索対象である可能性が高くなります。このようにして、頻繁に発生する単語は自動的に「ダウンウェイト」されます。「the」、「a」または「I」。ただし、インデックスを作成する前に、これらの一般的な単語のアトミックな出現を取り除くのが最善です。
重み付けに整数を使用しましたが、10進数の値を使用すると、より汎用性が高くなり、並べ替えが少し遅くなる可能性があります。
インデックス作成
製品フィールドが更新されるときはいつでも、例えば。アーティストまたはタイトル(それほど頻繁には発生しません)、データベーストリガーは、トランザクション内で次のように製品のキーワードのインデックスを再作成します。
- 参照されなくなった場合、すべての製品キーワードは関連付けが解除され、削除されます。
- インデックス付けされた各フィールド(Artistなど)の値は、キーワード全体として保存/取得され、
ProductKeywords
テーブル内の商品に関連付けられて直接一致します。
- 次に、キーワードの重みは、フィールドの重要度に応じた値で増分されます。フィールドの重要度に基づいて重みを加算、減算できます。アーティストがタイトルよりも重要な場合は、
ProductKeyword
ウェイト調整から1または2を引きます。
- インデックス付きの各フィールド値から英数字以外の文字が削除され、個別の単語グループに分割されます。「ビリー・ジョエル」は「ビリー」と「ジョエル」になります。
- 各フィールド値の個別の単語グループは、手順2と同じ方法で、soundexeedされ、キーワードとして保存/取得され、製品に関連付けられます。キーワードがすでに製品に関連付けられている場合、その重みは単純に調整されます。
クエリ
- 入力クエリの検索文字列全体を取得し、直接一致するキーワードを探します。メモリ内のテーブル内のキーワードのすべてのProductKeywordsを、キーワードの重み(ProductKeywordの重みとは異なります)とともに取得します。
- 英数字以外の文字をすべて削除し、クエリをキーワードに分割します。既存のすべてのキーワードを取得します(一致するのはごく一部です)。ProductKeywordsを、ProductKeywordの重みとは異なるキーワードの重みとともに、メモリ内のテーブルに一致するキーワードに結合します。
- 手順2を繰り返しますが、代わりにsoundex値を使用し、関連性が低くなるように重みを調整します。
- 取得したProductKeywordsを関連製品に結合し、人気の尺度である各製品の売上を取得します。
- キーワードの重み、ProductKeywordの重み、および売上で結果を並べ替えます。最終的な合計/並べ替えおよび/または均等化は、実装によって異なります。
- 結果を制限し、製品の検索結果をクライアントに返します。