我的mysql表中有title(varchar),description(text),keywords(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个字段(标题,关键字,desc)信息并进行全文搜索。据我所知,此表还将包含对myTable主键的引用。
但我的高级搜索可能包括加入mytable与Category表,geographic_location表(用于在10,20英里内搜索等),按其他标准过滤,当然还有搜索结果的排序。你认为使用mysql全文不会减慢速度吗?
答案 0 :(得分:3)
当您的查询失控时,有时最好用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');
答案 1 :(得分:1)
还有一种方式(有时它更好,但它取决于......)
SELECT
id, name, description, keywords
FROM
myTable
WHERE
name REGEXP '.*(word1|word2|word3).*' OR
description REGEXP '.*(word1|word2|word3).*' OR
keywords REGEXP '.*(word1|word2|word3).*'
;
PS:但MATCH(cols) AGAINST('expr')
可能更适合你的情况。
答案 2 :(得分:0)
如果可能,您应该查看fulltext search。
答案 3 :(得分:0)
鉴于扩展的需求,您可能需要考虑使用apache solr(请参阅http://lucene.apache.org/solr/)它是一个分面搜索引擎,专为全文搜索而设计。它有一个RESTful接口,可以返回XML或JSON。我正在使用它与一些项目 - 运作良好。
我看到你遇到一些问题的唯一区域可能是接近搜索,但是有一些额外的逻辑来构建查询它应该有用。