2

約100,000行のテーブルがあります。

各行には、文、文の断片、または句が含まれます。

基準内の単語の順序が文とは異なる場合でも、すべての単語セットを含むすべての行を検索するクエリを作成したいと思います。

たとえば、私のテーブルが次のようになっている場合:

id sentence
-- ---------------------------------------------------------------------------
 1 How now brown cow
 2 Alas, poor Yorick! I knew him
 3 Call me Ishmael
 4 A screaming comes across the sky
 5 It was a bright cold day in April, and the clocks were striking thirteen
 6 It was the best of times, it was the worst of times
 7 You don't know about me without you have read a book
 8 In the late summer of that year we lived in a house in a village
 9 One summer afternoon Mrs. Oedipa Maas came home from a Tupperware party
10 It was a queer, sultry summer, the summer they electrocuted the Rosenbergs

私のクエリ基準は、特定の順序で1つ以上の単語になります。

結果セットには、すべての単語を含むすべての文が含まれている必要があります。

たとえば、基準がの場合the was、結果には行5、6、10が含まれる必要があります。

理想的には、これを改善して、クエリに単語の先頭のみを含める必要があるようにします。(ユーザーが単語の先頭のみを入力できるようにし、途中または末尾だけは入力できないようにしたいことに注意してください)。

たとえば、基準がの場合elect sul、結果には行10が含まれます。

現在、これを行う方法は次のとおりです。

SELECT
    id, sentence
WHERE
    (sentence LIKE 'elect%' OR sentence LIKE '% elect%')
AND
    (sentence LIKE 'sul%' OR sentence LIKE '% sul%')

これは機能します(私は思います...)-それはそれがすべきすべてを見つけます。ただし、非常に遅いです。

これを行うためのより良い方法はありますか?

価値があるのは-テーブルを再設計したり、追加の「ヘルパー」テーブルを作成したりする柔軟性があります。

たとえば、すべての一意の単語の行と、それを含む文の各行のキーを含むテーブルを作成することを考えました。

また、クエリはMySQLで機能する必要があります。

よろしくお願いします。

4

1 に答える 1

2

あなたの方法は大丈夫です。複数の単語を処理したい場合は、次のようにすることができます。

select s.id, s.sentence
from sentence s join
     (select 'elect' as word union all
      select 'sul' as word
     ) words
     on s.sentence like concat(word, '%') or
        s.sentence like concat('% ', word, '%')
group by s.id, s.sentence
having count(*) = (select count(*) from words)

これは速くなりません(追加があるためgroup by)。しかし、それはもう少し柔軟性を提供します。

ちなみに、MySQLの全文検索機能を調べましたか?

于 2013-01-10T00:36:20.797 に答える