【问题标题】:Best way to build a SMART mySQL & PHP search engine?构建 SMART mySQL 和 PHP 搜索引擎的最佳方式?
【发布时间】:2011-06-06 07:26:57
【问题描述】:

构建 mySQL 和 PHP 搜索的最佳方法是什么?

我目前正在使用类似的东西

%term%

我希望它能够找到结果,即使他们拼写有点错误,例如:

字段值 = "一:Stop Shop:

他们搜索:

一站式服务

一站式服务

等等。我想要一个非常智能的搜索,这样即使他们不搜索确切的内容,他们也能找到信息。

构建这样的智能搜索的最佳方法是什么?

【问题讨论】:

标签: php mysql search


【解决方案1】:

like '%term%' 速度太慢且未优化,您可能想为此专栏添加全文,use boolean mode for this

match(column) against('+One +Shop +Stop' in boolean mode)

注意最小字长是4,所以,你需要考虑把它改成3,全文搜索只适用于myisam

sphinx 等其他开源搜索引擎也适用于此

【讨论】:

  • ajreal 是对的。您需要为要搜索的字段添加全文索引。然后做一个匹配语句来做实际的搜索。您甚至可以按相关性排序。谷歌了解更多详情。
  • 如果是测试全文索引,请确保有足够的测试数据,如果找到的结果大于总记录数的50%,则视为搜索失败。如果您不知道,这可能会干扰您的理智。不过我现在很好。
【解决方案2】:

Ajreal 是对的...只是想我会添加一个示例来帮助您:

$query = sprintf("SELECT *, 
         MATCH(col1, col2) AGAINST('%s' IN BOOLEAN MODE) AS relevance
     FROM my_table
     ORDER BY relevance DESC LIMIT 20", $keyword);
$rs = $conn->query($query);

希望对你有帮助

【讨论】:

    【解决方案3】:

    您无法通过搜索原始数据来提高效率。这种文本搜索取决于数据的索引方式(这就是谷歌机器人为谷歌提供服务的地方)。

    所以,第 1 步是索引。如果您的数据在某些网页中,您可以使用可用的标准爬虫(甚至可以轻松构建自己的爬虫,我建议使用 python 构建爬虫)。如果您的数据在某个文件中(不能通过网络浏览),那么为了进行索引,您需要编写一个程序来读取所有数据并对其进行索引。

    第 2 步是搜索。搜索方法取决于索引策略。

    如果您正在寻找基于 php-mysql 的系统,请查看这些项目的代码:

    http://www.phpdig.net/

    http://sphinxsearch.com/

    如果您想了解更多信息,请在 IEEE Xplore/ACM 出版物档案中搜索。你会得到很多关于这个主题的论文。

    【讨论】:

    • 如果我有 300,000 + 页怎么办?
    • 如果您真的需要索引 300,000 多个页面,您最好阅读诸如“分布式搜索技术”之类的主题。对于大型数据集,使用 MySQL 效率不会很高。您将需要自己的文件系统。幸运的是,您可以使用一些开源文件系统。实际上,我们有一个专门的爬虫(不公开)。我们处理千兆字节的数据。我们有自己的文件系统,我们将整个数据和爬虫放在亚马逊云中。亚马逊云的成本是值得的。
    • 如果您没有心情搜索论文,请至少获得一份“Lucene in Action” (ISBN 1-932394-28-1)。你可以得到一些总结。此外,您可以使用 Lucene(基于 Java)。但是在您的问题中,您要求提供 php-mysql 解决方案。
    【解决方案4】:

    您可以使用 SOUNDEX() 函数,它在 PHP 和 MYSQL 中都可用 SOUNDEX() with MYSQL

    【讨论】:

    • 这在 OP 的情况下可能有用也可能没用。例如,“stop”和“shop”的 soundex 代码是不同的。
    【解决方案5】:

    简单、智能且安全

    正如timpng1 在上面的Ajreal Answer 上举一个例子,我想让它安全

    $conn = new mysqli('server', 'username', 'password', 'dbName');
    $q = $conn->real_escape_string($_GET["query"]);
    $sql = $conn->prepare("SELECT *, MATCH(col1, col2) AGAINST(? IN BOOLEAN MODE) AS relevance FROM my_table ORDER BY relevance DESC LIMIT 20");
    $sql->bind_param("s", $q);
    $sql->execute();
    $rs = $sql->get_result();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 2018-04-24
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多