我的 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 加入到其他一些表中。
So
感谢
EDIT
@Peter Stuifzand 建议我创建一个 search_index 表并存储所有 3 个字段(标题、关键字、desc)信息并进行全文搜索。据我所知,此外该表还将包含对 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');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)