背景我有一个最多2000行的表,用户最多可以搜索6列。
我事先并不知道他在寻找什么,我想要一个连锁搜索(search1 AND search2 AND ...)
问题在这些列中,我有一个ID而不是简单的描述(即我有城镇的ID,而不是它的名字)。所以我在想两个解决方案:
哪一个最好?我知道行数很少,不会有大的性能问题,但我希望它们会越来越多:)
示例
这是我的表:
ID | TOWN | TYPE |地址|
11 | 14132 | 3 |贝克街220
13 | 45632 | 8 |主要街道12
14132 =伦敦
45632 =纽约
3 =客户
8 =管理员
输入“London Customer”的用户应该找到第一行。
答案 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')
这将在任一字段中返回包含search1
和search2
的所有记录,如下所示:
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 (...)