如何设计一个MySQL查询,搜索一个短语表来查找一组单词?

时间:2013-01-09 22:03:34

标签: mysql sql

我有一张约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

我的查询条件是一个或多个单词,按任何特定顺序排列。

结果集应包含包含所有单词的所有句子。

例如,如果条件为the was,则结果应包含第5,6,10行。

理想情况下,我想对此进行改进,以便查询只需要包含单词的 start 。 (请注意,我希望允许用户只输入单词的开头,但不能只输入中间或结尾)。

例如,如果标准为elect sul,则结果将包括第10行。

目前,我正在这样做:

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

这有效(我认为......) - 它找到应有的一切。但是,它很慢。

有更好的方法吗?

对于它的价值 - 我可以灵活地重新设计表格,或创建额外的“帮助”表。

,例如,我考虑创建一个表,其中包含每个唯一单词的行和包含它的句子的每一行的键。

此外 - 查询需要在MySQL中运行。

非常感谢提前。

1 个答案:

答案 0 :(得分: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中的全文搜索功能?