いくつかのオブジェクトの説明によって全文検索用のスクリプトを作成します。しかし、ブールモードでのデフォルトの全文検索アルゴリズムに満足できなかったので、何らかの方法で変更しようとしました。3つの検索を1つにまとめたい。最初のクエリで「正確なフレーズ」を検索し、2番目(フレーズのすべての単語が存在する)、3番目(少なくとも1つの単語が存在する)を検索します。そして、それを優先的に返します。私はこのようなことをしなければなりません:
SELECT
description,
MATCH(description) AGAINST ('"my search"' in boolean mode) FROM search
WHERE MATCH(description) AGAINST ('"my search"' in boolean mode)
UNION DISTINCT
SELECT
description,
MATCH(description) AGAINST ('+my +search' in boolean mode) FROM search
WHERE MATCH(description) AGAINST ('+my +search' in boolean mode)
UNION
SELECT
description,
MATCH(description) AGAINST ('my* search*' in boolean mode) FROM search
WHERE MATCH(description) AGAINST ('my* search*' in boolean mode)
ご覧のとおり、行の最初のブロックには、最も関連性の高い結果、つまり正確なフレーズが含まれます。2番目のブロックには関連性の低い行が含まれ、3番目のブロックには残りのすべての行が含まれます。
ただし、このクエリは重複した行を返します。つまり、UNION DISTINCTを使用している場合でも、最初のブロックに存在する行が2番目のブロックまたは3番目のブロックで再び繰り返される可能性があります。しかし、3つのサブ選択すべてに対してグローバルに異なる行のセットを取得したいと思います。行が最初のブロックに表示される場合、それは秒と3番目に存在してはなりません。これどうやってするの?それとも、そのような種類の検索のためのよりエレガントな解決策を私に与えることができますか?