如何在 php 中搜索像 google 这样的数据库

How to search database like google in php

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

我目前正在使用这个查询

$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");

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

我建立搜索引擎。

我将为您提供 6 个探索技巧,以便您可以继续学习如何编程并在需要时继续。

提示 #1:重点!

首先定义您要完成的任务。在尝试从头开始构建搜索引擎之前,想想你真正想做什么。这可能不是您的最终目标,也就是您真正想要做的事情。

你真的想爬网,用这个想法:“用PHP CURL从sitemap.xml中提取所有url”?

或者你只是想在你的网站上添加一个搜索框,从你的产品数据库中获取产品数据并在你的网站上显示该产品数据,想法是:“我想将我自己的搜索功能实现到我的网站"?

有点不好说

如果您想向您的网站添加 product-based“搜索功能”,则无需从 XML Sitemap. You'd simply retrieve it from a database like: MySQL, PosgreSQL, Oracle, SQL Server 等中提取内容并将结果显示到您的搜索结果页面。当人们想在他们的网站中添加“搜索功能”时,这通常是他们想要做的。

提示 #2:搜索越简单越快

写代码时最好记住这一点:简单永远赢。它被称为“S.A.W。原则”。

首先,让我们看看您的SQL。它有 2 个 select 语句,用 UNION 关键字连接在一起。

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

因为这看起来像是来自同一个数据库 table,那么您可以按如下方式组合它...其中更改是将 UNION SELECT * FROM search_engine WHERE 替换为 OR

SELECT * FROM search_engine
WHERE soundex(keyword) LIKE soundex('%$q%') 
OR title LIKE '%$q%' OR link LIKE '%$q%'
ORDER BY `clicks` DESC

因此,如果您可以删除 UNION 关键字并将 2 个 select 语句合并为 1 个 select 语句,那么数据库引擎可以做更少的工作来完成搜索查询请求。

如果您使用 2 个不同的 table,那么您需要做一些功课来查找一个称为 inverted index 的概念。概念是一样的:让搜索尽可能简单...让数据库服务器做尽可能少的工作...让搜索体验尽可能快!

尽管更简单意味着更快,但并不意味着更准确。

提示 #3: 准确性使搜索引擎与用户更相关。将此视为准确性 =“强大”。

让我们看看这些页面标题以及搜索查询如何使用它们:

  1. 使用PHP CURL
  2. 从sitemap.xml提取所有url
  3. 如何使用 PHP CURL
  4. 从 sitemap.xml 中提取所有 url

要使这些结果准确匹配,您的数据库中必须有第 2 页的完整标题。如果您只有第一页的标题(没有“如何”),那么对第二页标题的查询将找不到第一页标题的结果。这就是您在网站的搜索功能中发现的问题。

原因是对第一页标题的查询与第二页标题内部的部分完全匹配。然而,对第二页标题的查询不是完全匹配,甚至不是第一页标题的部分匹配。

为了解决这个问题,搜索引擎以关键字为基础。

提示 #4:了解关键字与停用词以及如何在搜索查询中解析它们。

在搜索查询中,有两个相关的 key 词,称为 keywords & non-relevant 垃圾个词,称为停用词。您可能想研究什么是 stop words 的概念以及搜索引擎如何使用它们,或者最常见的是,在实际执行搜索查询之前将它们扔掉。

所以在您的查询中,这些是您独特且有意义的关键字。当您单独考虑每个词时,它们具有 self-contained 具体含义。

array('extract', 'url', 'sitemap.xml', 'PHP', 'CURL')

具体含义:

  • 提取 = 拉,抓住,从一组中抓取某物。
  • URL = 超链接。
  • sitemap.xml = 一个XML Sitemap file.
  • PHP = 编程语言名称。
  • CURL = Command-line URL 获取。

这些很可能是停用词,它们本身没有意义或意义模糊。

array('How', 'to', 'all', 'from', 'with');

模糊含义:

  • 如何=一个简单的lead-off问题。那么搜索引擎用这个做什么呢?它把它扔掉了。
  • To = 连接词。它指向一组东西。也许有用。也许不会。扔了。
  • 全部 = 全部的一组。可能有用,但对搜索引擎来说似乎很模糊。扔了。
  • From = 另一个连接词。它指向一组其他东西。又是含糊不清。扔了。
  • 有=包括。另一个连接词。也很模糊。计算机不知道添加“PHP”或“PHP CURL” af呃 with 关键字。无赖!扔了。

搜索引擎通常会去除停用词并查询有意义的关键字以获得结果。相关性得分是搜索结果的准确程度。

这里是一个假设的例子(我在写这篇文章时凭空想出来的):如果一个查询发现一个页面包含 5 个唯一关键字中的 1 个,那么相关性分数将为 20%。如果它找到一个包含 5 个唯一关键字中的 4 个的页面,则相关性分数将为 80%。这是假设的,因为这不是任何特定搜索引擎当前的工作方式。只是用一个简单的图来说明一个点的基本概念。

相关性算法和评分完全取决于搜索引擎 designer/builder 来创建。相关性算法可以像搜索引擎设计者 and/or 构建者想要的那样简单或复杂。搜索引擎开发人员可以花费大量时间 fine-tuning 相关性算法和分数。它还取决于所使用的搜索算法以及搜索机器人为这些算法找到数据的效果。

提示 #5:探索构建搜索机器人!

如果你真的想完成这个,你应该考虑构建搜索机器人:“使用 PHP CURL 从 sitemap.xml 中提取所有 url”。

我也写过一个搜索机器人。它已经抓取了超过 100 万 URLs!

PHP Curl 不是提取链接的东西。这是从 1 URL 中获取内容的原因。必须编写搜索机器人来解析返回的 HTML,以便它可以找出从这些搜索结果中提取的内容。

只是一个警告:人们不会在他们的 URL 中写出完美的 HTML 语法。因此,您的搜索机器人需要进行大量微调才能检测草率的编程,这会使您的搜索机器人崩溃。这是一个巨大的时间承诺!如果您决定继续构建自己的搜索机器人,请准备好在这个项目上花费数年甚至数十年。构建搜索引擎是一个漫长的旅程!您的搜索机器人将崩溃数百到数千次,然后您才能让它爬行数百万 URLs。

所以...您真的要“从 sitemap.xml 中提取所有 url”还是要查询以前上传的产品数据列表,这些数据驻留在您的数据库中?后一种数据库查询的想法构建起来要快得多,而且将来更容易维护!

提示#6:如果你不想花很多时间从头开始构建搜索引擎,再加上从头开始的搜索机器人,再加上相关性评分算法从头开始,然后查看一些 pre-built 搜索引擎解决方案。这里有一些流行的。和他们一起玩会很有趣!

  1. Elastic Search
  2. Lucene
  3. Solr

结论:搜索引擎不容易建立!他们可能需要数年时间才能建成。如果你真的想实现这个目标:“我想以所有可能的方式向用户展示结果。”