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

29 浏览
0 Comments

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

我在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与Category表、geographic_location表(用于在10、20英里范围内搜索等)进行连接,通过其他一些条件进行过滤,当然还有搜索结果的排序。你认为使用mysql全文搜索不会减慢速度吗?

0
0 Comments

问题出现的原因:需要在PHP和MySQL中进行关键字搜索。

解决方法:使用MySQL的正则表达式函数REGEXP进行关键字搜索。在SELECT语句中使用WHERE子句,对name、description和keywords列进行正则表达式匹配。通过使用'word1|word2|word3'的形式,可以匹配包含任一关键字的记录。

示例代码如下:

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).*'
;

另外,根据具体情况,也可以考虑使用MySQL的全文搜索函数MATCH AGAINST来进行关键字搜索。

0
0 Comments

使用PHP和MySQL进行关键字搜索的原因是,当查询变得复杂时,有时在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');

这种方法可以有效地在数据中进行关键字搜索,并返回与搜索查询匹配的记录。通过将数据存储在一个表中,并使用FULLTEXT修饰符,可以更快地执行搜索查询,并提高搜索的准确性。

希望这个方法能帮助到你。谢谢提醒,我会认真考虑。谢谢。

0
0 Comments

原因:原文中提到,作者曾经使用过MySQL的全文搜索(fulltext search)方法,但是在阅读了一些资料后,发现如果在全文搜索的同时还要使用其他索引和连接操作,会导致查询变慢。

解决方法:作者建议尽可能使用MySQL的全文搜索方法,可以通过查询MySQL官方文档了解更多关于全文搜索的内容。

0