web-dev-qa-db-ja.com

最強のLIKEでSQLを注文しますか?

私は次のクエリを持っています:

SELECT * FROM table_name
WHERE (col_1 LIKE '%$keyword%'
    OR col_2 LIKE '%$keyword%'
    OR col_3 LIKE '%$keyword%')
  AND .... <some optional filters> ... 

最も関連性の高い結果に基づいて並べ替える戦略はありますか?

21
Shazam

「関連性」について話すとき、MySQLでサポートされている自然言語検索が本当に必要です 全文検索 。構文は通常のlikeクエリとは異なり、テーブルに特別なインデックスを追加する必要がありますが、この方法で関連性による順序付けが可能です。

MySQLが(リンクから)関連性を計算する方法は次のとおりです。

前に示した例のように、WHERE句でMATCH()を使用すると、返される行は、関連性の高いものから順に自動的に並べ替えられます。関連性の値は、負でない浮動小数点数です。関連性がゼロの場合、類似性がないことを意味します。関連性は、行内の単語数、その行内の一意の単語数、コレクション内の単語の総数、および特定の単語を含むドキュメント(行)の数に基づいて計算されます。

既存のテーブルにフルテキストインデックスを作成する には、[〜#〜]フルテキスト[〜#〜]を使用します修飾子:

CREATE FULLTEXT INDEX index_name
ON table_name (col1, col2, col3)

次に、次のようなクエリを実行して、関連性の高い順に結果を取得できます。

SELECT * FROM table_name
WHERE MATCH (col1,col2,col3)
AGAINST ('keyword' IN NATURAL LANGUAGE MODE);
31
McGarnagle

Col_1がcol_2などよりも関連性が高いことを意味する場合は、次のようにします。

select *
      ,case when col_1 like '%$keyword%' then 1
            when col_2 like '%$keyword%' then 2
            when col_3 like '%$keyword%' then 3
       end as [priority]
  from table_name
 where col_1 like '%$keyword%'
    or col_2 like '%$keyword%'
    or col_3 like '%$keyword%'
 order by [priority]

あなたが最も多くの列の一致を意味したなら:

select *
      ,(case when col_1 like '%$keyword%' then 1 else 0 end) +
      ,(case when col_2 like '%$keyword%' then 1 else 0 end) +
      ,(case when col_3 like '%$keyword%' then 1 else 0 end) as [priority]
  from table_name
 where col_1 like '%$keyword%'
    or col_2 like '%$keyword%'
    or col_3 like '%$keyword%'
 order by [priority] desc
34
Dominic Goulet

できません。 RDBMSに、「LIKE」列の一致が最も多い行で結果を降順に並べ替えるように要求しています。

たとえば、MySQLは、これを [〜#〜] fulltext [〜#〜] インデックスと呼ばれるもので実行します。

3
Aaron