私は次のクエリを持っています:
SELECT * FROM table_name
WHERE (col_1 LIKE '%$keyword%'
OR col_2 LIKE '%$keyword%'
OR col_3 LIKE '%$keyword%')
AND .... <some optional filters> ...
最も関連性の高い結果に基づいてソートする戦略はありますか?
私は次のクエリを持っています:
SELECT * FROM table_name
WHERE (col_1 LIKE '%$keyword%'
OR col_2 LIKE '%$keyword%'
OR col_3 LIKE '%$keyword%')
AND .... <some optional filters> ...
最も関連性の高い結果に基づいてソートする戦略はありますか?
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
「関連性」について話すとき、MySQL全文検索でサポートされている自然言語検索が本当に必要です。構文はクエリのように通常とは異なり、テーブルに特別なインデックスを追加する必要がありますが、この方法で関連性による順序付けが可能です。
MySQLが関連性を計算する方法は次のとおりです(リンクから):
MATCH() が WHERE 句で使用されている場合、前に示した例のように、返される行は自動的に最も関連性の高い順に並べ替えられます。関連値は、非負の浮動小数点数です。関連性ゼロは、類似性がないことを意味します。関連性は、行内の単語数、その行内の一意の単語数、コレクション内の単語の総数、および特定の単語を含むドキュメント (行) の数に基づいて計算されます。
既存のテーブルにフルテキスト インデックスを作成するには、 FULLTEXT修飾子を使用します。
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);
できません。RDBMS に、「LIKE」列の一致が最も多い行で結果を降順に並べ替えるように要求しています。
たとえば、MySQL はFULLTEXTインデックスと呼ばれるものを使用してこれを行います。