2011-01-13 120 views
0

背景我有一张最大2000行的表,用户应该搜索最多6列。
我不事先知道他要寻找的,我想级联搜索(搜索1 AND搜索2 AND ...)MySQL Fulltext vs Like

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

  1. 创建一个表,这里我把关键字(1个钥匙/排),然后我搜索存在用LIKE搜索1%或类似搜索2%...
  2. 添加一个字段到现有的表格,我把所有的关键字,然后做一个FULLTEXT那

哪一个是最好的?我知道,行是如此的饥荒早期预警系统是不会有大的性能比较的问题,但我希望他们会得到越来越多的:)


这是我的表:

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

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

用户输入 “伦敦客户” 应在第一行。

+0

我不了解情况。你可以显示你的表结构和一个例子行吗?使用搜索引擎的 –

+0

不是一个选项吗? (如lucene;只是不知道你使用的是什么服务器环境) – Maxym

回答

1

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

但是,应该指出fulltext有其局限性 - 所有行中通用的单词都有一个低的“分数”,因此不会像突出显示的那样匹配,就像您执行了一系列LIKE一样。 (另一方面,当然你可以从FULLTEXT查询中得到一个“得分”,根据你想要如何对结果进行排名,这可能是有用的。)

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 
+0

是的,但我没有在这个表中的查询字符串,我只有ID进行加入 – tampe125

+1

@ tampe125:在这种情况下,你应该使用'LIKE'或'REGEXP'(这很慢),使用外部'FULLTEXT'引擎,比如'Sphinx'(需要安装它)或者创建一个额外的非规范化表格,索引它并且及时填充它。 – Quassnoi

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 (...)