当前位置: 首页 > 知识库问答 >
问题:

PHP/SQL:基于相似度的多模糊关键词搜索(高级SQL搜索)

呼延哲
2023-03-14

现状:

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

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

  1. 尝试查找与标题中与整个字符串“苹果香蕉黄”完全匹配的项目。按索引 ID 对结果进行排序。
  2. 如果未找到与整个字符串完全匹配的更多结果,或者首先找不到任何结果,请搜索包含“苹果”、“香蕉”或“黄色”的所有标题。按索引 ID 对结果进行排序。

这个算法非常基本,但很有趣,效果很好。

我在找什么:

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

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

开始这样的搜索的最佳方法是什么?我正在使用InnoDB for MySQL。

共有1个答案

井礼骞
2023-03-14

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

要理解如何调整匹配子句以满足您的需求,可能需要克服一点学习曲线,但您的示例似乎非常基本(除了更智能的搜索)。

另外,需要注意的是,您需要使用html" target="_blank">系统配置来控制要编制索引的单词/标记的最小/最大字符数。您可以阅读 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

 类似资料:
  • 问题内容: 我正在尝试为我的网站创建一个产品搜索,用户可以在其中搜索多种语言的产品,如果没有完全匹配的内容,则(希望)获得模糊的搜索结果。 我有一个带有列的表。 该列指的是其各自表中产品的ID。 这些列具有各种语言的每种产品的翻译后的meta。 元只是由空格分隔的关键字 是搜索词。 指用户选择的语言 因此,首先,我执行一个基本的“ LIKE” SQL查询以查看是否存在匹配项,如果没有结果,则查询所

  • 搜索关键字推荐 调用地址 http://api.bilibili.cn/suggest 参数 字段 必选 类型 说明 term true string 关键字 sponly false int 只显示专题 返回 这个返回非常奇葩,没有数组装数据,我就随便写一下,看不懂自己调用分析结果 返回值字段 字段类型 字段说明 {x} string 第 x 个关键词建议

  • 问题内容: 我正在使用SQL Server 2008 R2 SP1。 我有一张约有36034个客户记录的表。我正在尝试在“客户名称”字段上实施Fuzy搜索。 这是模糊搜索的功能 这是调用该函数的查询 这大约需要2分22秒,可以为我提供所有对象的模糊匹配百分比 我如何解决此问题以在不到一秒钟的时间内运行。关于我的功能的任何建议,以使其更强大。 预期输出为45.34、40.00、100.00、23.0

  • 本文向大家介绍php mysql like 实现多关键词搜索的方法,包括了php mysql like 实现多关键词搜索的方法的使用技巧和注意事项,需要的朋友参考一下 或者叫,分词检索数据库 $res = mysql_query("select * from peter where id like '%中草药%' and '%6%'"); //这样写是报错的; $res = mysql_query

  • 用NSPredicate类写的一个简单的模糊搜素方法,比for循环快并且性能消耗很低。 [Code4App.com]

  • 问题内容: 我有一个包含两个主表和一个数据库。它们之间存在多对多的关系。我想知道的是如何使用SQL使用多个标签搜索笔记? 例如,如果我有一个带有三个标签“一个”,“两个”和“三个”的注释“ test”,而我有一个带有标签“一个”和“两个”的第二个注释“ test2”,那么将执行什么SQL查询找到与标签“一个”和“两个”相关联的所有注释? 问题答案: 要获取 同时 带有标签“ One”和“ Two”

  • 问题内容: 我需要能够使用一个简单的搜索来搜索数据库的SQL查询。这是我的表格现在的样子: 我将如何去做呢?这是我尝试过的一些SQL查询,但是我的问题是它返回了大量数据。例如,如果我搜索像Snoop Dogg这样的艺术家,即使没有专辑名称,它也会为他所拥有的每张专辑和每首歌曲返回一行。 编辑: 这是一个示例数据库; 因此,我想搜索“ snoop”以仅返回艺术家“ Snoop Dogg”。但随后进行