我的 mysql 表中有标题 (varchar)、描述 (text)、关键字 (varchar) 字段。
我保留了关键字字段,因为我认为我只会在这个字段中搜索。但我现在需要在所有三个字段中进行搜索。因此,对于关键字“word1 word2 word3”,我的查询变为
SELECT * FROM myTable
WHERE (
name LIKE '%word1%' OR description LIKE '%word1%' OR keywords LIKE '%word1%'
OR name LIKE '%word2%' OR description LIKE '%word2%' OR keywords LIKE '%word2%'
OR name LIKE '%word3%' OR description LIKE '%word3%' OR keywords LIKE '%word3%')
AND status = 'live'
看起来有点乱,但这可行。但现在我需要实现同义词搜索。因此,对于给定的单词,假设有一些可用的同义词,当我循环遍历所有单词时,此查询会变得更加困惑。随着需求变得越来越清晰,我还需要将此 myTable 加入到其他一些表中。
所以
您是否觉得上面的方式很乱,并且随着数据的增长会出现问题?
如何避免上述困惑?我可以采用更清洁的解决方案吗?任何例子都会对我有帮助。
- 您可以向我推荐其他方法/技术吗?
感谢
编辑
@Peter Stuifzand 建议我创建一个 search_index 表并存储所有 3 个字段(标题、关键字、描述)信息并进行全文搜索。据我所知,此外该表还将包含对 myTable 主键的引用。
但是我的高级搜索可能包括将 mytable 与类别表、地理位置表(用于在 10、20 英里等范围内搜索)连接、按其他条件进行过滤,当然还有对搜索结果进行排序。你认为使用mysql fulltext不会减慢速度吗?
最佳答案
当您的查询失去控制时,有时最好用 SQL 编写部分查询,而用您选择的编程语言编写其他部分。
您还可以使用全文搜索进行搜索。您可以创建包含要搜索的所有字段的单独表,并添加 FULLTEXT
修饰符。
CREATE TABLE `search_index` (
`id` INT NOT NULL,
`data` TEXT FULLTEXT,
);
SELECT `id` FROM `search_index` WHERE MATCH(`data`) AGAINST('word1 word2 word3');
关于php - 使用 PHP MySql 进行关键字搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/980376/