现状:
我目前正在使用PHP和SQL中的多个关键字进行关键字搜索。我应用搜索的字段是title字段,它是一个250 VARCHAR字段。
用户可以输入一个关键字,例如“苹果”或多个关键字,例如“苹果香蕉黄”。第一个选项是微不足道的。对于第二个选项,我当前的算法是这样的:
这个算法非常基本,但很有趣,效果很好。
我在找什么:
然而,我现在正在寻找一种更智能的搜索算法,而不必依赖亚马逊服务等外部付费脚本。我正在寻找一种实现以下内容的方法:
开始这样的搜索的最佳方法是什么?我正在使用InnoDB for MySQL。
假设使用MySQL,您可以添加一个FULL Text索引。然后,有许多功能可以让您进行基本搜索,以满足您列出的所有需求:https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html
您最终会使用以下语法:
SELECT * FROM table_name WHERE MATCH(column_with_fulltext_index_on_it)
AGAINST('apple banana yellow' IN NATURAL LANGUAGE MODE)
查看比赛比分
SELECT column_with_fulltext_index_on_it, MATCH(column_with_fulltext_index_on_it)
AGAINST('apple banana yellow' IN NATURAL LANGUAGE MODE) AS score FROM table_name WHERE MATCH(column_with_fulltext_index_on_it)
AGAINST('apple banana yellow' IN NATURAL LANGUAGE MODE)
要理解如何调整匹配子句以满足您的需求,可能需要克服一点学习曲线,但您的示例似乎非常基本(除了更智能的搜索)。
另外,需要注意的是,您需要使用系统配置来控制要编制索引的单词/标记的最小/最大字符数。您可以阅读 https://dev.mysql.com/doc/refman/5.7/en/fulltext-fine-tuning.html 以更深入地了解索引选项。Percona也是一个很好的资源 https://www.percona.com/blog/2013/02/26/myisam-vs-innodb-full-text-search-in-mysql-5-6-part-1/(通常比MySQL Doc的更容易被人类消化)。
如果您需要进行更复杂的搜索,您可以考虑添加其他技术,如< code>Solr,但我一直建议,使用现有的技术进行基本的工作,只有在遇到困难时才采用新技术,或者对现有的解决方案有良好的衡量标准,并知道新技术会以某种方式提高(速度、存储空间、结果质量等)...).如果你不能量化,坚持基本,直到你可以。
这里有一个很好的教程:http://www.w3resource.com/mysql/mysql-full-text-search-functions.php