0

いくつかのオブジェクトの説明によって全文検索用のスクリプトを作成します。しかし、ブールモードでのデフォルトの全文検索アルゴリズムに満足できなかったので、何らかの方法で変更しようとしました。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番目に存在してはなりません。これどうやってするの?それとも、そのような種類の検索のためのよりエレガントな解決策を私に与えることができますか?

4

1 に答える 1

0

OK再読問題。すべてを結合するとすべての結果が得られ、結合すると個別の結果が得られるはずです

または、単に使用できます

`Select distinct * from 
(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)) B`
于 2012-10-19T00:12:33.280 に答える