我建立搜索引擎。
我将为您提供 6 个提示以供探索,以便您可以继续学习如何编程并在需要时继续操作。
提示 #1: 专注!
首先定义您要完成的任务。在尝试从头开始构建搜索引擎之前,请考虑一下您真正想做的事情。这可能不是您的最终目标,也就是您真正想做的。
你真的想爬网,有这个想法:“使用 PHP CURL 从 sitemap.xml 中提取所有 url”?
或者您只是想在您的网站上添加一个搜索框,该搜索框从您的产品数据库中获取产品数据并在您的网站上显示该产品数据,您的想法是:“我想在我的网站中实现我自己的搜索功能“?
这很难说。
如果您想向您的网站添加基于产品的“搜索功能”,则无需从XML Sitemap 中提取内容。您只需从以下数据库中检索它: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
由于这看起来像是来自同一个数据库表,那么您可以将其组合如下...其中更改将 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 个不同的表,那么您需要做一些功课来查找称为 inverted index 的概念。概念是一样的:让搜索尽可能简单……让数据库服务器做尽可能少的工作……让搜索体验尽可能快地运行!
虽然更简单意味着更快,但这并不意味着更高的准确性。
提示 #3: 准确性使搜索引擎与用户更相关。将此视为准确性 =“强大”。
让我们看看这些页面标题以及搜索查询如何使用它们:
- 使用 PHP CURL 从 sitemap.xml 中提取所有 url
- 如何使用 PHP CURL 从 sitemap.xml 中提取所有 url
要使这些结果准确匹配,您的数据库中必须有第二页的完整标题。如果您只有第一页的标题(没有“如何”),那么对第二页标题的查询将找不到第一页标题的结果。这就是您在使用网站的搜索功能时注意到的问题。
原因是对第 1 页标题的查询与第 2 页标题内的完全匹配。但是,第二页标题的查询不是完全匹配,甚至不是第一页标题的部分匹配。
为了解决这个问题,搜索引擎根据关键字工作。
提示 #4:了解关键字与停用词以及如何在搜索查询中解析它们。
在搜索查询中,既有相关的 key 词,称为 keywords,也有不相关的 junk 词,称为 stop词。您可能想研究stop words 的概念以及搜索引擎如何使用它们,或者在实际执行搜索查询之前将它们丢弃。
因此,在您的查询中,这些是您独特且有意义的关键字。当您单独考虑每个单词时,它们具有独立的具体含义。
array('extract', 'url', 'sitemap.xml', 'PHP', 'CURL')
具体含义:
这些很可能是停用词,它们本身对它们没有意义或含义模糊。
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 语法。因此,您的搜索机器人需要进行大量微调才能检测到草率的编程,这会使您的搜索机器人崩溃。这是一个巨大的时间承诺!如果您决定构建自己的搜索机器人,请准备好在这个项目上花费数年甚至数十年。建立一个搜索引擎是一个漫长的过程!你的搜索机器人会崩溃成百上千次,然后你才能让它抓取数百万个网址。
所以...您真的要“从 sitemap.xml 中提取所有 url”还是要查询驻留在数据库中的先前上传的产品数据列表?后一种数据库查询想法构建起来要快得多,并且将来更容易维护!
提示#6:如果您不想花大量时间从头开始构建搜索引擎,加上从头开始的搜索机器人,再加上从头开始的相关性评分算法,那么请查看在一些预先构建的搜索引擎解决方案中。这里有一些流行的。和他们一起玩会很有趣!
- Elastic Search
- Lucene
- Solr
结论:搜索引擎并不容易构建!它们可能需要数年才能建成。如果您真的想实现这个目标,请准备好投入大量时间(可能是几个月,实际上是几年,可能是几十年):“我想以所有可能的方式向用户展示结果。”