【问题标题】:PHP Search without entire word/name or misspelt word/name没有整个单词/名称或拼写错误的单词/名称的 PHP 搜索
【发布时间】:2016-01-20 03:58:57
【问题描述】:

我已经做了一个基于名字搜索来查找员工的搜索功能,这里是代码。

search.php

<?php
include ('connect-db.php');
if (isset($_GET ['forename'])){
$forename = $_GET['forename'];

$forename_escaped = mysqli_real_escape_string ($db, $forename);
$userquery = mysqli_query($db, "SELECT * FROM staff WHERE forename = '$forename_escaped'");
if (mysqli_num_rows($userquery) == null ) echo ('NO RESULTS FOUND IN DATABASE');{
    ?>

但我希望这个函数能返回结果,即使在搜索框中的名字被字母拼错或只输入了部分。

例如用户输入 - 搜索:Jennif -->[SEARCH FUNCTION] 返回“Jennifer”的结果或用户输入 - 搜索:Jjennifer --> [SEARCH FUNCTION] 返回“Jennifer”的结果

我怎样才能执行这样的操作?我正在考虑使用 'LIKE' 功能,但到目前为止还没有弄明白。

【问题讨论】:

  • 很高兴你提到实际上我几周前刚刚浏览我的页面添加参数并完全忘记了这个。

标签: php search


【解决方案1】:

您想找出字符串之间的差异,也称为 Levenshtein 距离。

https://en.wikipedia.org/wiki/Levenshtein_distance

对于 mysql 的实现,您可能需要考虑以下帖子:

How to add levenshtein function in mysql?

在链接页面中使用 Levenshtein 实现,您的查询应该如下所示:

$userquery = mysqli_query($db, "SELECT * FROM staff WHERE levenshtein(forename, '".$forename_escaped."') < 2");

这意味着 levenshtein 距离小于 2。

【讨论】:

  • 好的,我已经阅读了 Levenshtein distance 并查看了您分享的其他 SO 帖子,我的下一个问题,如何在当前搜索功能中的 php 中执行?
  • 感谢编辑,最后一个问题(我保证)我仍然看不到如何/在哪里可以从其他链接添加该代码
  • 你只需要复制粘贴代码并在你的mysql服务器上执行一次。这样你就可以向 mysql 服务器添加一个函数。有关这方面的更多信息,您可能需要阅读存储过程的文档...dev.mysql.com/doc/refman/5.0/en/create-procedure.html
  • Levenshtein 是一种运行大量记录的昂贵算法,因此您需要找到一种方法来减少搜索拼写错误的记录数量(例如,按部门进行预过滤)。如果性能成为问题,您需要阅读Levenshtein Automata(有效解决此问题的数据结构 - 需要预索引)
【解决方案2】:

对于任何想要通过搜索获得类似功能的人:

我使用了通配符来允许搜索在不输入全名的情况下获得结果。如下所示:

$userquery = mysqli_query($db, "SELECT * FROM staff WHERE forename LIKE '$forename_escaped%'");

希望这对未来的人们有所帮助。

【讨论】:

    猜你喜欢
    • 2021-10-05
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多