MySQL Fulltext vs Like

时间:2011-01-13 14:27:07

标签: mysql full-text-search sql-like

背景我有一个最多2000行的表,用户最多可以搜索6列。
我事先并不知道他在寻找什么,我想要一个连锁搜索(search1 AND search2 AND ...)

问题在这些列中,我有一个ID而不是简单的描述(即我有城镇的ID,而不是它的名字)。所以我在想两个解决方案:

  1. 创建另一个表格,我在其中放置关键字(1个键/行),然后我使用 LIKE search1%或LIKE search2%...
  2. 搜索
  3. 在现有表格中添加一个字段,我将所有关键字放入其中,然后对其执行FULLTEXT
  4. 哪一个最好?我知道行数很少,不会有大的性能问题,但我希望它们会越来越多:)

    示例
    这是我的表:

    ID | TOWN | TYPE |地址|
    11 | 14132 | 3 |贝克街220 13 | 45632 | 8 |主要街道12

    14132 =伦敦
    45632 =纽约
    3 =客户
    8 =管理员

    输入“London Customer”的用户应该找到第一行。

3 个答案:

答案 0 :(得分:1)

如果您只是想使用一系列LIKE,那么我认为使用FULLTEXT索引是有意义的,主要原因是它可以让你使用更复杂的布尔查询未来。 (正如@Quassnoi所述,如果您没有使用特定字段,则可以简单地创建索引。)

然而,应该注意的是全文有其局限性 - 所有行中常见的词都有较低的“得分”,因此不会像你执行一系列LIKE一样突出。 (另一方面,您当然可以从FULLTEXT查询中获得“得分”,这可能会有所帮助,具体取决于您希望如何对结果进行排名。)

答案 1 :(得分:0)

您不必创建单独的字段,因为可以在多个字段上创建FULLTEXT索引:

CREATE  fx_mytable_fields ON mytable (field1, field2, field3)

SELECT  *
FROM    mytable
WHERE   MATCH(field1, field2, field3) AGAINST ('+search1 +search2')

这将在任一字段中返回包含search1search2的所有记录,如下所示:

field1   field2     field3
--       --         --
search1  something  search2

或者这个:

field1           field2      field3
--               --          --
search1 search2  something   something else

答案 2 :(得分:0)

鉴于您已在单独的表中获取数据,您必须在每个表中的每个可搜索字段上都有一个FULLTEXT索引。在那之后,只需要使用适当的JOIN构建查询,这样就可以全文匹配字段的文本版本,而不是外键号。

SELECT user.id, user.name, town.name
FROM user
LEFT JOIN town ON user.town = town.id
WHERE MATCH(user.name, town.name) AGAINST (...)