0

関連性によってデータベースを調べる「スマート」検索エンジンを作成しています。私のシステムは、テキストを含むデータベースフィールド「tag_clean」に対応する文の単語数を計算し、適切な結果を取得しようとします(調査ごとに1つ)。

たとえば、tag_cleanフィールドに「searchyoupla boom」を取得し、「search youpla bim」のような別のエントリを取得すると、「searchbim」に2番目のエントリが表示されます。

私のシステムは単語ごとに1ポイントを設定し、結果として最も関連性の高いものを取得します。すべてが機能しますが、私の大きな問題は、単語の順序を完全に無視することです!

「googleimagetest」と「googletest」があり、私のシステムで「google test image」を検索した場合、最も関連性の高いものが最初のものになりますが、それは正しい2番目のものです。

語順の重要性を理解したシステムが欲しいのですが、SQLでどうやってやるのかわかりません。

私のSQLリクエストのサンプル(重要な部分は最後にCASE WHENです):

SELECT * 
FROM keywords 
WHERE tag_clean LIKE 'google%' 
    AND (static = 0) 
    AND 
    (
        tag_clean LIKE '%google%' 
        OR tag_clean LIKE '%test%' 
        OR tag_clean LIKE '%image%'
    )
    OR 
    (
        tag_clean = 'google test image' 
        AND static = 1
    ) 
ORDER BY 
    ((CASE WHEN tag_clean LIKE '%google%' THEN 1 ELSE 0 END) 
        + (CASE WHEN tag_clean LIKE '%test%' THEN 1 ELSE 0 END) 
        + (CASE WHEN tag_clean LIKE '%image%' THEN 1 ELSE 0 END)) 
DESC LIMIT 0, 1;

ありがとうございます:)

4

1 に答える 1

1

まず、生のSQLがこれに最適なツールかどうかはわかりません。使用しているエンジンの全文機能を調べる必要があります。テキストの検索はかなり解決された問題であり、データベースはこの機能をサポートしています(基本言語の拡張機能を介して)。

あなたが続けたいと仮定すると、問題はあなたの構造です。'%google test%'や他のすべての双方向の組み合わせのようなタグクリアの句を追加し始めることができます。それは迅速で汚い解決策かもしれません。

あなたの本当の問題は、リレーショナルデータを単一のフィールドに格納していることです。各ドキュメントのキーワードごとに個別の行を持つキーワードテーブルが必要です。これには、documentID、KeyWord、KeyWordPositionなどの列があります。KeyWordPositionを使用すると、必要な近接検索を開始できます。

ただし、既存のソフトウェアの全文機能を調査することをお勧めします。

于 2012-09-14T15:51:58.400 に答える