如何在 php 中搜索类似 google 的数据库

您好,我想在我的网站中实现我自己的搜索功能,并且我想以所有可能的方式向用户显示结果。

我目前正在使用这个查询

$rs = $conn->query("SELECT * FROM search_engine WHERE soundex(keyword) LIKE soundex('%$q%') UNION SELECT * FROM search_engine WHERE title LIKE '%$q%' OR link LIKE '%$q%' ORDER BY `clicks` DESC");

我知道这个查询不好。此查询仅在参数与标题、关键字或链接匹配时显示结果,例如,当我搜索Extract all url from sitemap.xml with PHP CURL查询时,我得到了结果,但是当我尝试此查询时,How to Extract all url from sitemap.xml with PHP CURL我无法获得任何结果,所以我该怎么做才能进行搜索功能强大。


慕慕森
浏览 148回答 1
1回答

慕的地10843

我建立搜索引擎。我将为您提供 6 个探索技巧,以便您可以继续学习如何编程并在需要时继续进行。提示#1:专注!首先定义你想要完成的事情。在尝试从头开始构建搜索引擎之前,想想你真正想做什么。这可能不是您的最终目标,也就是您真正想做的事情。你真的想用这个想法爬网吗:“使用 PHP CURL 从 sitemap.xml 中提取所有 url”?或者您只是想在您的网站上添加一个搜索框,从您的产品数据库中获取产品数据并在您的网站上显示该产品数据,想法是:“我想在我的网站中实现我自己的搜索功能”?这很难说。如果您想向您的网站添加基于产品的“搜索功能”,则无需从XML 站点地图中提取内容。您只需从以下数据库中检索它:MySQL、PosgreSQL、Oracle、SQL Server等...,然后将结果显示在您的搜索结果页面上。当人们想在他们的网站中添加“搜索功能”时,这通常是人们想要做的。提示#2:对于搜索,越简单越快。在编写代码时最好记住这一点:简单永远赢。它被称为“SAW 原理”。首先,让我们看看您的 SQL。它有 2 个 select 语句,用关键字连接在一起UNION。SELECT * FROM search_engineWHERE soundex(keyword) LIKE soundex('%$q%') UNION     SELECT * FROM search_engine     WHERE title LIKE '%$q%' OR link LIKE '%$q%'ORDER BY `clicks` DESC由于这看起来像是来自同一个数据库表,因此您可以按如下方式组合它......其中更改替换UNION SELECT * FROM search_engine WHERE为OR:SELECT * FROM search_engineWHERE soundex(keyword) LIKE soundex('%$q%') OR title LIKE '%$q%' OR link LIKE '%$q%'ORDER BY `clicks` DESC因此,如果您可以删除 UNION 关键字并将 2 个 select 语句合并为 1 个 select 语句,那么数据库引擎可以做更少的工作来完成搜索查询请求。如果您使用 2 个不同的表,那么您需要做一些功课来查找称为倒排索引的概念。概念是一样的:让搜索尽可能简单……让数据库服务器做尽可能少的工作……让搜索体验运行得尽可能快!尽管更简单意味着更快,但并不意味着更准确。提示#3:准确性使搜索引擎与用户更相关。将此视为准确性 =“强大”。让我们看看这些页面标题以及搜索查询如何与它们一起使用:使用 PHP CURL 从 sitemap.xml 中提取所有 url如何使用 PHP CURL 从 sitemap.xml 中提取所有 url为了使这些结果准确匹配,您必须在数据库中包含第二页的完整标题。如果您只有第一页的标题(没有“如何”),那么对第二页标题的查询将找不到第一页标题的结果。这就是您在网站的搜索功能中注意到的问题。原因是对第一页标题的查询是第二页标题内的部分完全匹配。然而,对第二页标题的查询不是完全匹配,甚至也不是第一页标题的部分匹配。为了解决这个问题,搜索引擎以关键字为基础工作。提示 #4:了解关键字与停用词以及如何在搜索查询中解析它们。在搜索查询中,既有称为关键字的相关关键字,也有称为停用词的不相关垃圾词。您可能想研究停用词的概念以及搜索引擎如何使用它们,或者最常见的是,在实际执行搜索查询之前将它们丢弃。因此,在您的查询中,这些是您独特且有意义的关键字。当您单独考虑每个词时,它们具有独立的具体含义。array('extract', 'url', 'sitemap.xml', 'PHP', 'CURL')具体含义:Extract = 拉、抓住、从一组中抓取某物。URL = 超链接。sitemap.xml = XML 站点地图文件。PHP = 编程语言名称。CURL = 命令行 URL 提取。这些很可能是停用词,它们本身没有意义或含义模糊。array('How', 'to', 'all', 'from', 'with');含糊的意思:How = 问题的简单引导。那么搜索引擎用这个做什么呢?它把它扔掉了。To = 连接词。它指向一组东西。也许有用。也许不会。扔了它。全部 = 一组所有的东西。可能有用,但对搜索引擎来说似乎很模糊。扔了它。From = 另一个连接词。它指向一组其他东西。又是含糊不清。扔了它。有=包括。另一个连接词。也很模糊。计算机不知道在 with 关键字后添加“PHP”或“PHP CURL”。无赖!扔了它。搜索引擎通常会去除停用词并查询有意义的关键字以获得结果。相关性得分是搜索结果的准确程度。这是一个假设的例子(我在写这篇文章时凭空想出来的):如果一个查询发现一个页面包含 5 个唯一关键字中的 1 个,那么相关性得分将为 20%。如果它找到一个包含 5 个唯一关键字中的 4 个的页面,则相关性分数将为 80%。这是假设的,因为这不是任何特定搜索引擎当前的工作方式。它只是一个基本概念,用一个简单的例子来解释一个观点。相关性算法和分数实际上取决于搜索引擎设计者/构建者来创建。相关性算法可以像搜索引擎设计者和/或构建者想要的那样简单或复杂。搜索引擎开发人员可能会花费大量时间来微调相关性算法和评分。它还取决于所使用的搜索算法以及搜索机器人为这些算法找到数据的效果。提示 #5:探索构建搜索机器人!如果你真的想完成这个,你应该考虑构建搜索机器人:“使用 PHP CURL 从 sitemap.xml 中提取所有 url”。我也写了一个搜索机器人。它已经抓取了超过 100 万个 URL!PHP Curl 不是提取链接的工具。这是从 1 个 URL 获取内容的原因。必须编写搜索机器人来解析返回的 HTML,以便它可以找出从这些搜索结果中提取的内容。只是一个警告:人们不会在他们的 URL 中编写完美的 HTML 语法。因此,您的搜索机器人需要进行大量微调才能检测草率的编程,这会使您的搜索机器人崩溃。这是一个巨大的时间承诺!如果您决定继续构建自己的搜索机器人,请准备好在这个项目上花费数年甚至数十年。构建搜索引擎是一个漫长的旅程!您的搜索机器人将崩溃数百至数千次,然后您才能让它抓取数百万个 URL。所以...您真的要“从 sitemap.xml 中提取所有 url”还是要查询驻留在数据库中的以前上传的产品数据列表?后一种数据库查询的想法构建起来要快得多,而且将来更容易维护!提示 #6:如果您不想花很多时间从头开始构建搜索引擎,从头开始构建搜索机器人,从头开始构建相关性评分算法,那么请查看一些预构建的搜索引擎解决方案。这里有一些流行的。和他们一起玩会很有趣!弹性搜索Lucene太阳能结论:搜索引擎不容易建立!他们可能需要数年时间才能建成。如果您真的想实现这个目标:“我想以所有可能的方式向用户展示结果”,请准备好投入大量时间(很简单是几个月,实际上是几年,可能是几十年)。
打开App,查看更多内容
随时随地看视频慕课网APP