1

I have a search query that is able to sort results by relevance according to how many of the words from the query actually show up.

SELECT id, 
       thesis 
FROM   activity p 
WHERE  p.discriminator = 'opinion' 
       AND ( thesis LIKE '%gun%' 
              OR thesis LIKE '%crucial%' ) 
ORDER  BY ( ( CASE 
                WHEN thesis LIKE '%gun%' THEN 1 
                ELSE 0 
              end ) 
          + ( CASE 
                WHEN thesis LIKE '%crucial%' THEN 1 
                ELSE 0 
              end ) ) 
           DESC 

This query however, does not sort according to how many times 'gun' or 'crucial' show up. I want to make it so records with more occurrences of 'gun' show up above records with less occurrences. (I.E, add a point for every time gun shows up rather than adding a point because gun shows up at least once)

4

2 に答える 2

2

間違っているかもしれませんが、ストアド プロシージャまたは UDF を使用しないと、文字列の出現回数をカウントできません。部分文字列をカウントするストアド関数の例を次に示します。

drop function if exists str_count;

delimiter |
create function str_count(sub varchar(255), str varchar(255)) RETURNS INTEGER
DETERMINISTIC NO SQL
BEGIN
    DECLARE count INT;
    DECLARE cur INT;

    SET count = 0;
    SET cur = 0;

    REPEAT
        SET cur = LOCATE(sub, str, cur+1);
        SET count = count + (cur > 0);
    UNTIL (cur = 0)
    END REPEAT;

    RETURN(count);
END|

varchar(255) を varchar(65536) または TEXT に変更したい場合があります。クエリごとに順番に使用できるようになりました。

SELECT id, 
       thesis 
FROM   activity p 
WHERE  p.discriminator = 'opinion' 
       AND ( thesis LIKE '%gun%' 
              OR thesis LIKE '%crucial%' ) 
ORDER  BY STR_COUNT('gun',thesis) + STR_COUNT('crucial', thesis)

データセットが大きく、パフォーマンスが重要な場合は、C でカスタム UDF を作成することをお勧めします。

于 2012-08-12T22:23:43.707 に答える
1

データベースの設定方法によっては、MySQL の全文インデックス作成の方がユース ケースにより適している場合があります。フィールドにインデックスを付けてフィールド内の単語を検索し、出現回数に関連する関連性によって結果を並べ替えることができます。

ここのドキュメントを参照してください: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

これは、いくつかの例を示す便利な質問であり、役立つかもしれません: MySQL のフルテキスト検索の関連性を操作して、あるフィールドを別のフィールドよりも「価値のある」ものにするにはどうすればよいですか?

最後に、全文検索ができない場合は、Andrew Hanna が文字列関数のリファレンスに投稿したコメントが役に立つかもしれません: http://dev.mysql.com/doc/refman/5.0/en/string- functions.html (「Andrew Hanna」のページを検索してください)。彼らは、文字列が出現する回数をカウントできる関数をサーバー上に作成します。

お役に立てれば。

于 2012-08-12T21:40:51.113 に答える