使用PHP MySql进行关键字搜索?

时间:2009-06-11 10:26:16

标签: php mysql search

我的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全文不会减慢速度吗?

4 个答案:

答案 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。我正在使用它与一些项目 - 运作良好。

我看到你遇到一些问题的唯一区域可能是接近搜索,但是有一些额外的逻辑来构建查询它应该有用。