建立你自己的搜索引擎
(威比安装指南)
概述
安装
控制
缩放
概述
Wiby 是万维网的搜索引擎。根据 GPLv2 许可,截至 2022 年 7 月 8 日,源代码现在是免费的。我一直渴望这一天!您可以在此处观看快速演示。
它包括一个网络界面,允许监护人控制它在何处、多远以及多久爬取网站和跟踪超链接。搜索索引存储在 MySQL 全文索引中。
通过跨多个复制服务器或重复服务器连接并发读取索引的不同部分,从每个连接返回顶部结果列表,然后搜索组合列表以确保正确排序来维护快速查询。失败的副本被自动排除;新的副本很容易包含在内。抓取新页面时,它们会随机存储在索引中,确保每个副本都能获得相关结果。
搜索引擎并不是要索引整个网络,然后使用排名算法对其进行排序。它更喜欢通过客人或搜索引擎的监护人提交的人工提交来为其索引播种。
该软件专为拥有额外计算机(甚至是 Pi)的任何人设计,以托管他们自己的搜索引擎,以满足对他们来说重要的任何利基市场。搜索引擎包括一个简单的 API,供元搜索引擎使用。
我希望这将使任何热爱计算机的人都能以低廉的成本构建和维护自己的搜索引擎。我希望它能培养出自由和独立的搜索引擎,确保思想和信息在万维网上的可访问性。
网络流量
|
|
+-----------+-----------+
| 反向代理(nginx) |
+-----------+-----------+
|
|
+-----------+-----------+
| Wiby 核心服务器 |+----------------+-------------------- -----+
|(Golang 或 PHP 版本)| | |
+-----------+-----------+ +----------+----------+ +---------+---------+
| |复制数据库|+-----+|复制跟踪器|
| +----------+----------+ +-------------------+
+-----------+-----------+ |
| 主数据库 |+----------------+
| (MySQL 或 MariaDB)|
+----+-------------+----+
| |
| |
+----+-----+ +----+----+
| 网页 | | 刷新 |
|爬虫| |调度器|
+----------+ +---------+
安装
我目前只能提供手动安装说明。
请注意,虽然该软件功能完整,但仍处于测试阶段。预计在发布源代码后会发现一些错误。确保将搜索引擎与其他重要服务隔离开来,如果您在家中运行其中的一部分,请将服务器放在单独的 VLAN 上。确保此 VLAN 无法访问您的路由器或交换机接口。即使软件达到“1.0”,也要继续这种做法。
如果您以前创建过“LAMP”,或者更确切地说是“LEMP”服务器,那么这并没有那么复杂。如果您从未这样做过,我建议您找一个“LEMP”教程。
构建 LEMP 服务器
Digital Ocean 教程通常非常好,所以这里是Ubuntu 20和 Ubuntu 22教程的链接。
为了简单起见,假设所有说明都是针对 Ubuntu 20 或 22 的。如果您使用的是不同的发行版,请相应地修改安装步骤以适合您的发行版。
如果您没有物理服务器,您可以通过寻找“VPS 提供商”来租用计算空间。这台虚拟计算机将成为您的反向代理,如果您愿意,它也可以托管其他所有内容。
安装以下附加包:
apt install build-essential php-gd libcurl4-openssl-dev libmysqlclient-dev mysql-server golang git
对于 Ubuntu 20:
去获取-u github.com/go-sql-driver/mysql
对于 Ubuntu 22 或最新的 Golang 版本:
去安装 github.com/go-sql-driver/mysql@latest
去修改初始化mysql
去获取 github.com/go-sql-driver/mysql
获取 Wiby 源文件
直接从此处 的 Wiby或GitHub下载源代码。源代码是在 GPLv2 许可证下发布的。将 Wiby 的源文件复制到您的服务器。
编译爬虫(cr)、刷新调度器(rs)、复制跟踪器(rt):
gcc cr.c -o cr -I/usr/include/mysql -lmysqlclient -lcurl -std=c99 -O3
gcc rs.c -o rs -I/usr/include/mysql -lmysqlclient -std=c99 -O3
gcc rt.c -o rt -I/usr/include/mysql -lmysqlclient -std=c99 -O3
如果出现任何编译错误,可能是由于 mysql 或 libcurl 头文件的路径所致。如果您使用的不是 Ubuntu 20,则可能会发生这种情况。您可能必须找到 curl.h、easy.h 和 mysql.h 的正确路径。
构建核心服务器应用程序:
在 go 文件夹内:
去构建 core.go
去构建 1core.go
如果您刚刚起步,可以使用“1core”。如果您要设置复制服务器或您使用的计算机有很多可用核心,您可以使用“核心”,但请务必阅读缩放部分。也可以使用www目录根目录下的index.php,完全不用Go版本。虽然 PHP 版本主要用于原型制作。
建立数据库:
确保这些行在 /etc/mysql/my.cnf 中,然后重新启动 mysql
[客户]
默认字符集=utf8mb4
[mysql]
默认字符集 = utf8mb4
[mysqld]
最大连接数 = 400
ft_min_word_len=2
sql_mode = "NO_BACKSLASH_ESCAPES"
字符集服务器 = utf8mb4
整理服务器= utf8mb4_0900_ai_ci
跳过字符集客户端握手
默认身份验证插件=mysql_native_password
等待超时 = 800
#内存使用设置,你应该根据你的硬件来调整这个
innodb_buffer_pool_size = 1342177280
innodb_buffer_pool_instances = 2
登录 MySQL 并输入:
创建数据库wiby;
创建数据库 wibytemp;
导入 wiby 和 wibytemp 数据库文件:
mysql -u root -p wiby < wiby.sql
mysql -u root -p wibytemp < wibytemp.sql
登录 MySQL,创建以下帐户并赋予它们正确的访问权限:
创建由“qwer”标识的用户“guest”@“localhost”;
创建由“foobar”标识的用户“approver”@“localhost”;
创建由“seekout”标识的用户“crawler”@“localhost”;
使用维比;
将帐户选择授予“approver”@“localhost”;
将 reviewqueue 上的选择授予 'approver'@'localhost';
将索引队列上的插入授予 'approver'@'localhost';
将 reviewqueue 上的删除授予 'approver'@'localhost';
将 reviewqueue 的更新授予 'approver'@'localhost';
将索引队列上的选择授予 'crawler'@'localhost';
将 windex 上的插入授予 'crawler'@'localhost';
将索引队列上的插入授予 'crawler'@'localhost';
将 windex 的更新授予 'crawler'@'localhost';
将索引队列上的删除授予“crawler”@“localhost”;
将 windex 上的删除授予 'crawler'@'localhost';
将 windex 上的选择授予 'crawler'@'localhost';
将 reviewqueue 上的插入授予 'crawler'@'localhost';
将 windex 上的选择授予 'guest'@'localhost';
将 reviewqueue 上的插入授予 'guest'@'localhost';
将反馈插入到'guest'@'localhost';
将反馈选择授予“approver”@“localhost”;
授予删除反馈给'approver'@'localhost';
将墓地插入授予 'approver'@'localhost';
将墓地更新授予 'approver'@'localhost';
将墓地删除授予 'approver'@'localhost';
将墓地选择授予“批准者”@“本地主机”;
将帐户更新授予“approver”@“localhost”;
将帐户插入授予“approver”@“localhost”;
将帐户删除授权给'approver'@'localhost';
使用 wibytemp;
将 titlecheck 上的选择授予 'crawler'@'localhost';
将 titlecheck 上的插入授予 'crawler'@'localhost';
将 titlecheck 上的删除授予 'crawler'@'localhost';
将拒绝的选择授予“批准者”@“本地主机”;
将拒绝的插入授予 'approver'@'localhost';
授予删除拒绝给'approver'@'localhost';
将 reserve_id 上的选择授予 'crawler'@'localhost';
将 reserve_id 上的插入授予 'crawler'@'localhost';
将 reserve_id 上的删除授予 'crawler'@'localhost';
冲洗特权;
将 HTML 文件和 PHP 脚本复制到您的 Web 服务器
将html目录下的内容复制到nginx的html目录下(/var/www/html)
为 Wiby 配置 nginx
在 /etc/nginx/ 中,创建一个名为“phpcache”的目录,以及另一个名为“cache”的目录。
我不会详细介绍每个细节,而是会提供一个模板供您在源代码的 /etc/nginx/sites-available/ 中作为默认 nginx 配置进行试用。
你应该自己学习 nginx 配置,这个模板只是为了提供帮助。如果您只使用 php 版本,请注释所有“核心应用程序”位置条目以将 Wiby 搜索恢复为仅 php 版本。
确保 ssl_certificate 和 ssl_certificate_key 具有 SSL 文件的路径而不是示例路径。如果您不想使用 SSL,只需删除 SSL 连接的服务器 {} 配置(在端口 443 上)。此外,示例文件引用了 php7.4-fpm.sock,因此如果您使用的是其他版本,请记住也更新它(例如 Ubuntu 22 上的 php8.1-fpm.sock)。
启动刷新计划程序
该程序 (rs) 将确保所有索引的页面至少每周刷新一次(或更快,具体取决于您如何将更新分配给单个网站)。您可能希望在启动时运行它,最简单的设置方法是使用 cron 作业 (crontab -e)。运行“./rs -h”以获取更多参数。
启动爬虫
最好在屏幕会话中运行爬虫,以便您可以监视其输出。您可以运行多个爬虫,只要将它们保存在不同的目录中,包含指向同一机器人文件夹的符号链接,并为每个爬虫设置正确的参数即可。要查看参数,请键入“./cr -h”。如果没有设置任何参数,您只能运行一个爬虫(这可能就是您所需要的)。如有必要,您可以将数据库连接从“localhost”更改为 cr.c 中的不同 IP,然后重建。
请注意,如果您在为某些网站编制索引时遇到问题,则可能需要更改爬虫的用户代理。索引失败的页面会在 abandoned.txt 中注明。
确保机器人文件夹存在。所有 robots.txt 文件都存储在 robots 文件夹中。它们被下载一次,然后在以后的更新中从该文件夹中引用。每隔几周清除一次此文件夹,以确保 robots.txt 文件不时得到刷新。您可以通过注释掉在 cr.c 中调用“checkrobots”函数的行来关闭对 robots.txt 文件的检查。
如果通过页面上的超链接进行抓取,则接受以下文件类型:html、htm、txt、php、asp。包含参数的链接将被忽略。这些限制不适用于人们直接提交的页面。
启动核心服务器
如果您刚刚起步,“1core”或 php 版本是最容易上手的。如果您希望随着索引的增长扩展计算机资源,或者如果您有大量可用的 CPU 内核,请使用“核心”。请务必阅读缩放部分。您可以使用 cron 作业在启动时运行核心服务器。
为 Web 界面设置管理员密码
没有默认的网络登录,您必须在第一次手动设置:
将 /html/hash 文件夹重命名为私有的。
编辑 html/private_folder_name/hashmake.php 并将“secretpassword”更改为您首选的管理员密码。
从浏览器访问 /private_folder_name/hashmake.php 并复制哈希。
复制下来后,从您的网络服务器文件夹中删除或删除 hashmake.php,这样散列就无法被发现。
登录 MySQL 并创建帐户:
使用维比;
INSERT INTO accounts (name,hash,level) VALUES('your_username','your_password_hash','admin');
您现在可以从浏览器访问/accounts/,登录以创建和管理搜索引擎管理员和监护人的所有帐户。
admin - 可以访问搜索引擎的所有 Web 表单并使用 /accounts/ 页面创建和删除帐户。
监护人- 监护人的主要作用是看守搜索引擎的索引。可以访问除/readf/之外的所有表单,并且只能使用/accounts/页面更改自己的密码。
控制搜索引擎
有几种形式可以控制搜索引擎。没有将所有内容链接在一起的中央表格,只有不同文件夹的集合,您可以根据需要重命名这些文件夹。
/提交/
这种面向公众的表单允许搜索引擎的用户提交网站以供索引,前提是它们符合您的提交标准,您可以在 /submit/form.html.php 上修改。
/账户/
这是账户管理页面。管理员可以选择创建、锁定、更改帐户类型、删除和重置密码。监护人可以选择更改密码。
/审查/
这是最重要的表格,旨在供您验证网站提交是否符合您的标准。每个访问表单的监护人或管理员最多分配 10 页。这些页面将保持分配给该帐户长达 30 分钟。从这里您可以控制网络爬虫访问每个提交的数量、深度和频率。以下是网站提交可用选项的示例:
url_that_was_submitted
[Worksafe] [惊喜] [跳过] [埋葬] [否定] [可更新
1周
]
[爬行:深度
页数
类型
当地的
执行规则 重复]
上述选项的解释:
Worksafe - 表示网站是否可以安全工作。由提交网站的用户设置,但您可以根据自己的决定进行更改。
惊喜- 选中此框会将其置于“给我惊喜”功能中,用户在单击“给我惊喜”时会被重定向到随机网站。请注意,此功能不会显示 NSFW 网站,即使它们设置为令人惊讶。
跳过- 选择此选项将跳过对页面的索引,并且在您提交其余页面进行抓取后它将重新出现在评论表单中。
埋葬- 选择此选项会将页面移动到墓地 (/grave/),这是一个与 /review/ 具有相同选项的存放位置,用于可能已停止工作但您怀疑可能会重新上线的网站。爬虫将自动检测到这一点并将页面发回审查。当您单击链接并看到 404 时,您可以确信爬虫在两次更新周期失败后将其发回审核。如果页面标题更改,也会发生这种情况。爬虫只会对人们直接提交的页面执行此操作。对于自动抓取但随后无法正常工作的网站,不会给予这种礼貌。对于那些网站,在两次失败的更新周期后,该页面将被删除。
否定- 选择此选项可将页面从索引中删除。如果页面不符合您的提交标准,这将是将其从队列中删除的选项。
Updatable - 网络爬虫返回页面的更新周期。这仅适用于人们提交的页面,通过链接抓取找到的页面总是以 1 周的更新周期进行。
------------------ 抓取 ------------------
下面列出的选项控制爬虫如何索引超链接网站。默认情况下,爬虫不索引任何超链接,它只会索引提交的页面。
深度 - 要爬过多少层链接。如果要抓取任何超链接,则必须至少将深度设置为 1。设置负值 = 无限制。对此要小心。
页面- 每个链接层(深度)要抓取的页面数。他们将被随机选择。如果要抓取任何超链接,则必须至少设置 1。设置负值 = 无限制。对此要小心。
类型- 表示您是否只想抓取网站本地链接或网站外部链接,或同时抓取两者。
强制执行规则——这是一个简单的工具,用于检查页面是否有两个以上的脚本和/或 css 文件。如果超过限制,该页面将不会被索引。我不使用它,而是更喜欢根据更宽容的标准进行手动检查。
重复- 虽然爬虫将始终返回以更新索引中的每个页面,但除非您告诉它,否则它不会再次爬过超链接。即便如此,它只会在选择重复时抓取页面上深度为 1 的超链接。
/ban/
您可以使用此表单从索引中删除或禁止个别 URL。它非常简单,因为我用得不多。您不能用它删除整个域,因为您可以在 MySQL 控制台中构建自己的查询。
/批量提交/
管理员/监护人可以使用此表单将 URL 列表导入审阅队列。
/反馈/
用户可以使用此表单为您提交反馈。
/阅读/
管理员帐户可以在哪里阅读用户提交的反馈。
/墓穴/
它具有与 /review/ 相同的功能。您还不想编入索引但不想忘记的网站存储在 /grave/ 中,方法是从 /review/ 中选择“埋葬”。网络爬虫将(仅针对人们直接提交的页面)移动 404 页面或标题已更改回 /review/ 的页面在页面未恢复正常的两个更新周期后。因此,几周后您可能会注意到 /review/ 中出现死页,您可以决定删除该页面或将其埋在将移至 /grave/ 的位置。该页面可能会在某个时候恢复正常,您可以检查 /grave/ 以查看它是否复活。
/插入/
这是 2016 年底创建的第一个表格,用于填充 Wiby 索引并查看搜索引擎是否可以作为概念证明。它的目的是手动将页面输入索引,因为还没有爬虫存在。如果您想手动索引拒绝允许爬虫访问它的页面,它仍然有用。在这种情况下,将 updatable 设置为 0。
/标签/
如果你想强制一个网站出现在特定单个词查询(如“天气”)的最高排名,你可以通过将词标记到目标 url 来强制它。
/json/
这是开发人员可以用来将他们的服务连接到搜索引擎的 JSON API。说明位于该位置。
补充说明
如果您需要在意外排队索引无限数量的页面的情况下停止网络爬虫,请先停止爬虫程序,截断索引队列表'truncate indexqueue;',然后重新启动爬虫。
扩展搜索引擎
您可以通过在彼此靠近的本地网络上构建 MySQL 副本服务器、在一个或多个副本服务器上运行核心应用程序和复制跟踪器 (rt) 并指向您的反向代理来使用它来帮助确保随着索引的增长而进行亚秒级搜索查询. 为 rt 编辑 servers.csv 文件以指示所有可用的副本服务器。如果您的机器拥有大量资源和内核,则在 servers.csv 中向同一服务器输入多个重复条目(例如,每个内核一个)也可以。
核心应用程序检查复制跟踪器 (rt) 输出以确定是否有任何副本在线,它将在这些副本上启动连接并为每个副本分配任务以搜索索引的不同部分,从而大大加快搜索速度,尤其是对于多词查询。默认情况下,单词查询不会跨副本发起多个连接。要在单词查询上启用它,注释掉第 373 行的 IF 语句并重建核心应用程序。
可用副本数必须平均分配给每页搜索结果限制 (lim),或者,每页搜索结果限制必须平均分配给可用副本数。如果可用副本过多以至于它们不能平均分配,则这些副本将保持同步但不会用于搜索,除非另一个副本出现故障。您可以将每页搜索结果限制 (lim) 调整为不同的值(默认 12),然后重建以使多余的可用副本平均分配(如果需要)。
反向代理和副本服务器可以通过 wireguard 或 openvpn 等 VPN 连接,但是 servers.csv 的 IP 应该是副本全部连接到的 LAN 的本地 IP。这是设置 MySQL 副本的教程。
完整说明如下:
在主服务器上,将这些行添加到 [mysqld] 下的 my.cnf,但只有在您有 VPN 才能访问您的副本时。将 my.vpn.ip 替换为您自己的。
#在下面设置复制
绑定地址 = 127.0.0.1,my.vpn.ip
服务器 ID = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = wiby
binlog_format = 混合
在主服务器上的 MySQL 中,创建一个用于副本访问的用户:
创建由“d0gemuchw0w”标识的用户“slave_user”@“%”;
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';
冲洗特权;
在副本服务器上,确保以下 my.cnf 配置,将 server-id 设置为每个副本的唯一标识,然后重新启动 mysql:
[客户]
默认字符集=utf8mb4
[mysql]
默认字符集 = utf8mb4
[mysqld]
最大连接数 = 400
ft_min_word_len=2
sql_mode = "NO_BACKSLASH_ESCAPES"
#character-set-client-handshake = FALSE
字符集服务器 = utf8mb4
整理服务器= utf8mb4_0900_ai_ci
跳过字符集客户端握手
默认身份验证插件=mysql_native_password
等待超时 = 800
#内存使用设置,你应该根据你的硬件来调整这个
innodb_buffer_pool_size = 1342177280
innodb_buffer_pool_instances = 2
#在下面设置复制
绑定地址 = 0.0.0.0
服务器 ID = 2
relay_log_info_repository = 表
relay_log_recovery = ON
sync_binlog=1
确保只有 VPN 和 VLAN 地址可以到达您的副本。绑定地址 0.0.0.0 可以替换为“127.0.0.1,replica.vpn.ip”,这样更安全,但如果 VPN 地址在启动时不可用,也更容易崩溃。
要将数据库导出到副本服务器,在主服务器上,停止网络爬虫并隐藏任何可以接受新数据的网络表单,然后打开 MySQL 并执行以下操作。
使用维比;
带读锁的刷新表;
显示主人身份;
+------------------+----------+--------------+------------------+-------------------+
| 文件 | 当前位置 | Binlog_Do_DB | Binlog_Ignore_DB | 已执行_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000055 | 15871269 | 维比 | | |
+------------------+----------+--------------+------------------+-------------------+
保持上面的会话窗口打开(或在屏幕会话中运行它)。
从该表中复制信息。在单独的会话窗口中,导出数据库:
mysqldump -u root -p wiby > wiby.sql
导出数据库并记录所需内容后,您可以解锁表并恢复正常。在显示主状态的会话窗口上:
解锁表;
如果需要,您现在可以关闭该窗口。
在副本服务器上,登录 MySQL 并创建数据库:
创建数据库wiby;
出口;
导入数据库:
mysql -u root -p wiby < wiby.sql
登录到 MySQL 并键入以下内容,但将表中的 primary_server_ip、MASTER_LOG_FILE 和 MASTER_LOG_POS 替换为您的:
将 MASTER 更改为 MASTER_HOST='primary_server_ip',MASTER_USER='slave_user',MASTER_PASSWORD='d0gemuchw0w',MASTER_LOG_FILE='mysql-bin.000055',MASTER_LOG_POS=15871269;
启动奴隶;
要验证副本是否已同步,请在 MySQL 中的副本上键入以下内容:
显示从机状态\G
确保:
Slave_IO_Running:是
Slave_SQL_Running:是
在副本上的 MySQL 中,创建复制跟踪器和核心应用程序所需的帐户:
使用维比;
创建由“d0gemuchw0w”标识的用户“remote_guest”@“%”;
将 windex 上的选择授予 'remote_guest'@'%';
创建由“qwer”标识的用户“guest”@“localhost”;
将 windex 上的选择授予 'guest'@'localhost';
冲洗特权;
负载均衡
您应该在一个或多个副本上运行核心应用程序,并让 nginx 向其发送流量,这样您可以减轻 VPS 的负担。复制跟踪器 (rt) 必须在运行核心应用程序的同一服务器和目录上运行(1core 不需要)。
将副本服务器的 VPN 地址/端口从 nginx 的默认配置添加到上游 remote_core {}(请参阅提供的示例模板)。您可以通过在其地址中添加“备份”来将 VPS 用作备份(例如:服务器 127.0.0.1:8080 备份;)
Wiby数据统计
Wiby数据评估
本站商娱网提供的Wiby介绍和链接都来源于网络,不保证外部链接的准确性和完整性,同时,对于该外部链接的指向,不由商娱网实际控制,在2022年11月22日 23:19收录或编辑或审核时,该网页上的内容,都属于合规合法,后期网页的内容如出现违规,可以直接联系我们进行删除,商娱网不承担任何责任。