使用PHP MySql进行关键字搜索?
使用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全文搜索不会减慢速度吗?
问题出现的原因:需要在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来进行关键字搜索。
使用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修饰符,可以更快地执行搜索查询,并提高搜索的准确性。
希望这个方法能帮助到你。谢谢提醒,我会认真考虑。谢谢。