1

使用事例

ユーザーが私の Web サイトにアクセスすると、SO のような検索ボックスが表示されます。プラン テキストを使用して結果を検索できます。「.net の質問」、「クローズドの質問」、「.net と Java」など。検索は、SO とは少し異なります。ストレート全文検索。したがって、「.net の質問」は .net の回答ではなく .net の質問のみを検索します (おそらく SO ケースには適用されません。ここでは例を示します)。 question は、.net と Java に関連する質問のみを返します。

問題

あまり言葉に慣れていませんが、基本的にはSQL駆動型検索にキーワードを入れたいと思っています。データベースのスキーマを知っており、データベースのデータマイニングもできます。これを実装しようとする前に、すでに存在する現在のアプローチを知りたいです。この質問は、述べられた問題に対する優れた設計とは何かについてのものだと思います。

提案された

これまでに提案されたソリューションは次のようになります

  1. 入力をきれいにします。特殊文字を削除するだけです
  2. 入力をデータのチャンクに解析します。"c# java" の入力を c# と java に分割します。また、"'c# java' の質問" のような特殊なケースを 'c# java' と "質問" に分割します。
  3. 入力からツリーを構築する
  4. データをメタデータにバインドします。したがって、クローズドクエスチョンのようなものを変換し、テーブルの isclosed 列に関連付けます。
  5. ツリーを SQL クエリに変換します。

考え/提案/リンク?

4

4 に答える 4

5

私は、出現回数と製品が表示されるスキーマに基づいてキーワードに重みを付ける「単一検索」を使用してデジタルミュージックストアを運営しています。「Artist」、「Title」、「Publisher」などのさまざまな列があります。

製品はアルバムやプレイリストにも関連していますが、簡単に説明するために、製品のキーワードのインデックス作成とクエリについてのみ詳しく説明します。

データベーススキーマ

Keywordstable-検索される可能性のあるすべての単語の加重テーブル(したがって、どこかで参照されます)と、各レコードの次のデータ:

  • キーワードID(単語ではない)、
  • みことばそのもの、
  • WordのSoundexAlpha値
  • 重さ

ProductKeywordstable-製品のフィールド(または列)のいずれかによって参照されるすべてのキーワードの加重テーブルと、各レコードの次のデータ:

  • 製品番号、
  • キーワードID、
  • 重さ

キーワードの重み付け

加重値は、単語が出現する頻度を示します。重みが小さい一致するキーワードは「よりユニーク」であり、検索対象である可能性が高くなります。このようにして、頻繁に発生する単語は自動的に「ダウンウェイト」されます。「the」、「a」または「I」。ただし、インデックスを作成する前に、これらの一般的な単語のアトミックな出現を取り除くのが最善です。

重み付けに整数を使用しましたが、10進数の値を使用すると、より汎用性が高くなり、並べ替えが少し遅くなる可能性があります。

インデックス作成

製品フィールドが更新されるときはいつでも、例えば。アーティストまたはタイトル(それほど頻繁には発生しません)、データベーストリガーは、トランザクション内で次のように製品のキーワードのインデックスを再作成します。

  1. 参照されなくなった場合、すべての製品キーワードは関連付けが解除され、削除されます。
  2. インデックス付けされた各フィールド(Artistなど)の値は、キーワード全体として保存/取得され、ProductKeywordsテーブル内の商品に関連付けられて直接一致します。
  3. 次に、キーワードの重みは、フィールドの重要度に応じた値で増分されます。フィールドの重要度に基づいて重みを加算、減算できます。アーティストがタイトルよりも重要な場合は、ProductKeywordウェイト調整から1または2を引きます。
  4. インデックス付きの各フィールド値から英数字以外の文字が削除され、個別の単語グループに分割されます。「ビリー・ジョエル」は「ビリー」と「ジョエル」になります。
  5. 各フィールド値の個別の単語グループは、手順2と同じ方法で、soundexeedされ、キーワードとして保存/取得され、製品に関連付けられます。キーワードがすでに製品に関連付けられている場合、その重みは単純に調整されます。

クエリ

  1. 入力クエリの検索文字列全体を取得し、直接一致するキーワードを探します。メモリ内のテーブル内のキーワードのすべてのProductKeywordsを、キーワードの重み(ProductKeywordの重みとは異なります)とともに取得します。
  2. 英数字以外の文字をすべて削除し、クエリをキーワードに分割します。既存のすべてのキーワードを取得します(一致するのはごく一部です)。ProductKeywordsを、ProductKeywordの重みとは異なるキーワードの重みとともに、メモリ内のテーブルに一致するキーワードに結合します。
  3. 手順2を繰り返しますが、代わりにsoundex値を使用し、関連性が低くなるように重みを調整します。
  4. 取得したProductKeywordsを関連製品に結合し、人気の尺度である各製品の売上を取得します。
  5. キーワードの重み、ProductKeywordの重み、および売上で結果を並べ替えます。最終的な合計/並べ替えおよび/または均等化は、実装によって異なります。
  6. 結果を制限し、製品の検索結果をクライアントに返します。
于 2010-03-26T12:01:23.463 に答える
3

あなたが探しているのは自然言語処理です。奇妙なことに、これSQL Server 2000 以前ではEnglish Queryとして無料で含まれていました。でも今はなくなった

他のいくつかのソースは次のとおりです。

概念は、単語をテーブル、列、関係などにマッピングするメタ データ ディクショナリと、英文 (または一部のキーワード) を実際のクエリに変換するために組み合わされた英文パーサーです。

一部の人々は、いくつかの本当にクールなデモのために音声認識でEnglish Queryを使用していますが、怒って使用されたことはありません!

于 2010-03-22T21:08:32.780 に答える
0

SQL Server を使用している場合は、問題を解決するために特別に設計された全文検索機能を簡単に使用できます。

于 2010-03-19T00:21:24.240 に答える
0

ハイブリッド アプローチを使用して、全文検索結果を取得し、#4 のメタ データに基づいてさらにフィルター処理することができます。よりインテリジェントなものとして、ユーザーが検索後にクリックしたリンクを追跡し、その選択をキー検索ワードと共に決定木に保存することで、シンプルな教師あり学習ソリューションを作成できます。検索は、この決定木からマイニングされます

于 2010-03-25T04:44:23.563 に答える