web-dev-qa-db-ja.com

MySQL-単語の部分一致と関連性スコアを使用した効率的な検索(FULLTEXT)

部分的な単語に一致するが、正確な関連性ソートも提供するMySQL検索を実行するにはどうすればよいですか?

SELECT name, MATCH(name) AGAINST ('math*' IN BOOLEAN MODE) AS relevance
FROM subjects
WHERE MATCH(name) AGAINST ('math*' IN BOOLEAN MODE)

ブールモードの問題は、関連性が常に1を返すため、結果の並べ替えがあまり良くないことです。たとえば、検索結果に5の制限を課した場合、返される結果が最も関連性が高いとは思えない場合があります。

自然言語モードで検索した場合、関連性スコアは有用ですが、部分的な単語を照合することはできません。

これらの基準をすべて満たすクエリを実行する方法はありますか?

  • 部分的な単語と一致できます
  • 結果は正確な関連性で返されます
  • 効率的です

私がこれまでに得た最高のものは:

SELECT name
FROM subjects
WHERE name LIKE 'mat%'
UNION ALL
SELECT name
FROM subjects
WHERE name LIKE '%mat%' AND name NOT LIKE 'mat%'

しかし、私はLIKEを使用したくないと思います。

17
BadHorsie

私は1年後にこの(やや)重複した質問で良い解決策を得ました:

MySQL-正確な関連性を持つ検索結果を取得する方法

3
BadHorsie

この場合、MySQL 5.6の新しいInnoDB全文検索機能が役立ちます。次のクエリを使用します。

SELECT MATCH(column) AGAINST('(Word1* Word2*) ("Word1 Word1")' IN BOOLEAN MODE) score, id, column 
FROM table
having score>0
ORDER BY score 
DESC limit 10;

どこ ( )は、単語を部分式にグループ化します。最初のグループにはlike Word%意味; 2番目は完全に一致する語句を探します。スコアは浮動小数点数として返されます。

7
Seeghor7