嗨,我想在我的网站中实现自己的搜索功能,并希望以所有可能的方式向用户显示结果。
我当前正在使用此查询
$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
时,我不会得到任何结果,那么我该怎么做才能使我的搜索功能更强大。
欢迎使用StackOverflow!
我建立搜索引擎。
我将为您提供6条探索的技巧,以便您可以根据需要继续学习如何编程和继续。
TIP#1:焦点!
首先定义您要完成的任务。在尝试从头开始构建搜索引擎之前,请先考虑一下您真正想做的事情。您的真正想要的可能不是您的最终目标。
您是否真的要爬网,其思路是:“使用PHP CURL从sitemap.xml中提取所有URL”?
或者您只是想向您的网站添加一个搜索框,它会从您的产品数据库中获取产品数据并在您的网站上显示该产品数据,其思路是:“我想在我的网站中实现自己的搜索功能” ?
很难说。
如果要向网站添加基于产品的“搜索功能”,则不需要从XML Sitemap中提取内容。您只需从MySQL,PosgreSQL,Oracle,SQL Server等数据库中检索它,然后将结果显示在搜索结果页面上。人们通常想在他们的网站上添加“搜索功能”时打算这样做。
TIP#2:搜索时,越简单越快。
这在编写代码时要记住:简单总是赢。它被称为“ S.A.W.原则”。
首先,让我们看一下您的SQL。它有2条选择语句,它们与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的概念。概念是相同的:保持搜索尽可能简单...以便数据库服务器尽可能少地执行工作...从而使搜索体验尽可能快地运行!
即使简单意味着更快,也并不意味着更高的准确性。
TIP#3:准确性使搜索引擎与用户更加相关。将其视为准确性=“强大”。
让我们看一下这些页面标题及其搜索查询的工作方式:
为了使这些结果准确匹配,那么您必须在数据库中具有第二页的完整标题。如果您只有第一页标题(没有“如何操作”),那么第二页标题的查询将找不到第一页标题的结果。这就是您在站点的搜索功能中注意到的问题。
原因是,对第一页标题的查询与第二页标题的完全匹配。但是,对第二页标题的查询不是完全匹配,甚至也不是第一页标题的部分匹配。
为了解决这个问题,搜索引擎根据关键字来工作。
TIP#4:了解关键字与停用词以及如何在搜索查询中解析它们。
在搜索查询中,既有相关的key单词,称为keywords,又有不相关的junk单词,称为停用词。您可能想要研究stop words是什么的概念以及搜索引擎如何使用或最常使用它们,在实际执行搜索查询之前将其丢弃。
因此,在您的查询中,这些是您唯一且有意义的关键字。当您单独考虑每个单词时,它们具有独立的具体含义。
array('extract', 'url', 'sitemap.xml', 'PHP', 'CURL')
具体含义:
这些很可能是停用词,它们本身对它们没有任何意义,或者含糊其词。
array('How', 'to', 'all', 'from', 'with');
含糊其词:
搜索引擎通常会删除停用词并查询有意义的关键字以获取结果。关联分数是搜索结果的准确性。
[这里是一个假设的示例(我在撰写本文时从头顶上弥补了):如果查询找到包含5个唯一关键字中的1个的页面,则相关分数将为20%。如果找到包含5个唯一关键字中的4个的页面,则相关性得分将为80%。这是假设的,因为它不是当前任何特定搜索引擎的工作方式。这只是使用一个简单的插图来解释一个点的基本概念。
相关性算法和分数实际上取决于搜索引擎设计者/构建者。相关性算法可以像搜索引擎设计者和/或构建者想要制作的那样简单或复杂。搜索引擎开发人员可能会花费大量时间对相关算法和得分进行微调。它还取决于所使用的搜索算法以及搜索bot查找这些算法的数据的能力。
提示#5:探索建筑物搜索机器人!
如果您确实想完成此操作,则应研究构建搜索机器人:“使用PHP CURL从sitemap.xml中提取所有URL”。
我也写了一个搜索机器人。它已经抓取了超过一百万个网址!
PHP Curl不是提取链接的东西。这就是从1个URL中获取内容的原因。必须编写搜索机器人来解析返回的HTML,以便它可以找出要从这些搜索结果中提取的内容。
只是警告:人们没有在其URL中编写完美的HTML语法。因此,您的搜索引擎需要进行大量的微调,才能检测到草率的编程,这会使您的搜索引擎崩溃。那是一个巨大的时间承诺!如果您决定继续构建自己的搜索机器人,只需准备在该项目上花费数年甚至数十年的时间即可。建立搜索引擎是漫长的旅程!您的搜索机器人会崩溃数百到数千次,然后才能抓取数百万个URL。
所以...您真的要“从sitemap.xml提取所有URL”还是要查询数据库中以前上传的产品数据的列表?后一个数据库查询思想是构建起来更快并且将来更容易维护的地方!
提示#6:如果您不想花费大量时间从头开始构建搜索引擎,从头开始构建搜索机器人,从头开始建立相关性得分算法,那么请看一下内置的搜索引擎解决方案。这里有一些受欢迎的。他们会很有趣!
结论:搜索引擎不容易构建!他们可能需要数年的时间才能建成。如果您确实想实现此目标,请准备好投入大量时间(轻松地花费几个月,实际上是几年,甚至几十年):“我想以各种可能的方式向用户展示结果。”
从情感上来说,这听起来令人兴奋和精彩……但是,对于Stack Overflow(SO)社区,下次尝试将您的热情集中到更具体的事情上。当他们看到类似“所有可能的方式”时,他们通常会否决含糊的问题。由于您是新手,所以我不会。下次:尝试仅关注1件事,您正在寻求每个问题的帮助!
很高兴看到您正在尝试学习如何将与产品相关的搜索框添加到您的网站,或者构建搜索机器人+搜索引擎+相关性算法和得分。很难说出哪一个……因为您的问题正在同时询问所有这些概念。
祝您好运,无论您尝试构建什么!