【问题标题】:PHP/SQL: Multiple fuzzy keyword search based on likeness (Advanced SQL Search)PHP/SQL:基于相似度的多个模糊关键字搜索(高级 SQL 搜索)
【发布时间】:2017-06-11 05:49:29
【问题描述】:

现状:

我目前正在使用 PHP 和 SQL 中的多个关键字进行关键字搜索。我应用搜索的字段是 title 字段,它是一个 250 VARCHAR 字段。

用户可以输入单个关键字,例如“苹果”或多个,例如“苹果香蕉黄”。第一个选项是微不足道的。对于第二个选项,我当前的算法是这样的:

  1. 尝试查找与标题中的整个字符串“applebanana yellow”完全匹配的项目。按索引 ID 对结果进行排序。
  2. 如果找不到更多与整个字符串完全匹配的结果,或者如果一开始就没有找到,请搜索包含“apple”、“banana”或“yellow”的所有标题。按索引 ID 对结果进行排序。

该算法非常基本,但足够有趣,效果很好。


我在找什么:

不过,我现在希望实现一种更智能的搜索算法,而不必依赖像亚马逊服务这样的外部付费脚本。我正在寻找一种方法来实现以下内容:

  • 模糊搜索(我读过关于 SOUNDEX 或 levenshtein 的文章可能会意识到这一点)
  • 更智能的关键字搜索(不要只返回匹配所有字词或仅一个字词的项目,还可以返回 2 个字或 3 个字之前的条目)
  • 按相关性/相似度排序(按搜索与标题的相似度排序,而不仅仅是索引 ID)
  • (奖励:甚至可以实现对精确字符串的搜索,例如在谷歌上使用“”来精确查找引号之间的单词)

开始此类搜索的最佳方式是什么?我正在使用 InnoDB for MySQL。

【问题讨论】:

  • 你在打什么 SQL 系统?你在用 MySQL、ORacle 吗?
  • @Ray 抱歉,我正在使用 InnoDB for MySQL。我会编辑我的帖子。
  • 你可能对sphinxsearch.com感兴趣,它可以位于mysql之上
  • @Mihai 其次。如果您需要超越一些基本搜索或发现自己添加了许多全文索引,那么更具针对性的搜索技术(例如 sphinx、solr 或 elasticsearch)可能适合您的需求

标签: php mysql sql search full-text-search


【解决方案1】:

假设 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)

要了解如何根据自己的需要调整匹配子句,可能需要克服一点学习曲线,但您的示例看起来非常基础(smarter search 除外)。

另外,需要注意的是,您需要一些系统配置来控制要索引的单词/标记的最小/最大字符。您可以阅读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 更易于人类消化)。

如果您需要进行更复杂的搜索,您可以考虑添加其他技术,例如 Solr,但我一直建议您使用现有技术进行基本工作,只有遇到困难才采用新技术墙,或者对现有解决方案有良好的衡量标准,并且知道新技术会以某种方式改进(速度、存储空间、结果质量等)。如果你不能量化,坚持基本直到可以为止。

这里有一个很好的教程:http://www.w3resource.com/mysql/mysql-full-text-search-functions.php

【讨论】:

  • 嗨,谢谢,这看起来很有前途!您认为使用 Solr 而不是 FULL Text Indexes 的主要优势是什么?
  • 对于某些场景来说,可能有太多优势无法在此处列出。 Solr 是一个包含 Lucine 的数据存储,它是围绕搜索构建的。 Mysql 是一个具有一些搜索功能的关系型数据库,但如果它们满足您的需求,则无需采用第二种技术。
  • Amazon Elastisearch 也实现了 Lucene,因此如果您不想维护自己的 Solr 系统,也可以使用它。
  • 感谢您的出色回答,我想我会先尝试使用 Mysql 全文搜索让它工作!
  • @JonasKaufmann 很酷,我添加了一些关于您可能需要为索引处理的配置设置的简介。
猜你喜欢
  • 2015-09-20
  • 2014-08-20
  • 2019-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多