SQL検索のキーワード
-
21-09-2019 - |
質問
使用事例
ユーザーが私の Web サイトにアクセスすると、SO とよく似た検索ボックスが表示されます。計画テキストを使用して結果を検索できます。「.net の質問」、「終了した質問」、「.net と Java」など。検索の機能は SO とは少し異なり、直接の全文検索ではなく、データベースのスキーマを可能な限り検索しようとします。したがって、「.net の質問」は .net の回答ではなく .net の質問のみを検索します (おそらく SO のケースには当てはまりません。ここでは単なる例です)。「クローズされた質問」はクローズされた質問、「.net および java」を返します。質問は、.net と Java に関連する質問を返しますが、それ以外は何も返しません。
問題
言葉にはあまり詳しくありませんが、基本的にキーワードを SQL 駆動検索にしたいのです。私はデータベースのスキーマを知っており、データベースのデータマイニングもできます。これを実装する前に、既存のアプローチを知りたいと思っています。この質問は、述べられている問題に対する適切な設計は何かということだと思います。
提案された
これまでのところ私の提案した解決策は次のようになります
- 入力を掃除してください。特殊文字を削除するだけです
- 入力をデータのチャンクに解析します。「c# java」の入力を c# と java に分割します。また、「'c# java' の質問」を「c# java」と「質問」に分割するなどの特殊なケースも処理します。
- 入力からツリーを構築する
- データをメタデータにバインドします。したがって、クローズド質問などを変換し、テーブルの isclosed 列に関連付けます。
- ツリーを SQL クエリに変換します。
考え/提案/リンク?
解決
私は、キーワードの出現頻度と製品が表示されるスキーマに基づいてキーワードを重み付けする「単一検索」を備えたデジタル音楽ストアを運営しています。「アーティスト」、「タイトル」、「出版社」などのさまざまな列があります。
製品はアルバムやプレイリストにも関連しますが、説明をわかりやすくするために、製品のキーワードのインデックス作成とクエリについてのみ詳しく説明します。
データベーススキーマ
Keywords
table - 各レコードの次のデータを含む、検索できる可能性のあるすべての単語の重み付けされたテーブル (したがって、どこかで参照されます)。
- キーワードID (単語ではありません)、
- 言葉そのもの、
- Word の Soundex Alpha 値
- 重さ
ProductKeywords
table - 製品のフィールド (または列) によって参照されるすべてのキーワードの加重テーブル。各レコードの次のデータが含まれます。
- 製品番号、
- キーワードID、
- 重さ
キーワードの重み付け
重み付け値は、単語が出現する頻度を示します。重みが低い一致キーワードは「よりユニーク」であり、検索される可能性が高くなります。このようにして、頻繁に出現する単語は自動的に「重み付けが低くなります」。「その」、「a」、または「私」。ただし、インデックスを作成する前に、これらの一般的な単語の原子的な出現を削除することが最善です。
重み付けには整数を使用しましたが、10 進数値を使用すると、より汎用性が高く、ソートが若干遅くなる可能性があります。
インデックス作成
製品フィールドが更新されるたびに。アーティストまたはタイトル (これはそれほど頻繁には起こりません)、データベース トリガーは、トランザクション内で次のように商品のキーワードのインデックスを再作成します。
- すべての製品キーワードは関連付けが解除され、参照されなくなった場合は削除されます。
- 各インデックス付きフィールド (例:Artist) の値は、その全体がキーワードとして保存/取得され、製品に関連付けられます。
ProductKeywords
直接一致するテーブル。 - キーワードの重みは、フィールドの重要性に応じた値だけ増加します。フィールドの重要性に基づいて重みを加算または減算できます。アーティストがタイトルよりも重要な場合は、その値から 1 または 2 を引きます。
ProductKeyword
重量調整。 - 各インデックス付きフィールド値は、英数字以外の文字を取り除き、別個の単語グループに分割します。「ビリー・ジョエル」は「ビリー」と「ジョエル」になります。
- 各フィールド値の個別の単語グループは音声処理され、キーワードとして保存/取得され、ステップ 2 と同じ方法で製品に関連付けられます。キーワードがすでに商品に関連付けられている場合、その重みは単純に調整されます。
クエリを実行する
- 入力クエリ検索文字列全体を取得し、直接一致するキーワードを探します。メモリ内テーブル内のキーワードのすべての ProductKeyword を、キーワードの重み (ProductKeyword の重みとは異なります) とともに取得します。
- 英数字以外の文字をすべて削除し、クエリをキーワードに分割します。既存のキーワードをすべて取得します (一致するのは少数のみです)。ProductKeywords を、ProductKeyword の重みとは異なるキーワードの重みとともに、メモリ内テーブルに一致するキーワードに結合します。
- ステップ 2 を繰り返しますが、代わりに soundex 値を使用し、関連性が低くなるように重みを調整します。
- 取得した ProductKeyword を関連する製品に結合し、人気の尺度となる各製品の売上を取得します。
- キーワードの重み、ProductKeyword の重み、売上によって結果を並べ替えます。最終的な合計/並べ替えおよび/または重み付けは実装によって異なります。
- 結果を制限し、製品の検索結果をクライアントに返します。
他のヒント
あなたが探しているのは 自然言語処理. 。不思議なことにこれは 使用済み 無料で含まれる 英語の質問 SQL Server 2000 以前では。でももうなくなってしまった
他のソースは次のとおりです。
- http://devtools.korzh.com/eq/dotnet/
- http://www.easyask.com/products/business-intelligence/index.htm
コンセプトは、単語をテーブル、列、リレーションシップなどにマッピングするメタデータ辞書と、英語の文パーサーを組み合わせて英語の文 (または一部のキーワード) を実際のクエリに変換することです。
非常にクールなデモのために音声認識を備えた English Query を使用している人もいますが、怒りの中で使用されているのを見たことはありません。
、あなたは単にそのフルを使用することができます特にあなたの問題を解決するために設計されたテキスト検索の機能、。
あなたは、ハイブリッドアプローチを使用し、フルテキスト検索結果を取得し、さらにあなたの#4からのメタデータに基づいて、それらをフィルタリングすることができます。よりインテリジェントな何かのためには、ユーザーが検索後にクリックすると決定木でキー検索語とその選択を保存するリンク何追跡することにより、簡単な教師付き学習ソリューションを作成することができます。検索は、この決定木から採掘されるだろう。