文字,文字,文字——OpenSearchServer 简介

作者:Marcel Gagné

如何创建您自己的搜索引擎,并结合一个爬虫来索引各种文档。

在威廉·莎士比亚的哈姆雷特(我最喜欢的戏剧之一)中,丹麦国王克劳狄斯的首席顾问波洛涅斯走近哈姆雷特王子。克劳狄斯碰巧是哈姆雷特的继父和叔叔,也是他母亲格特鲁德王后的新丈夫。格特鲁德王后最近去世的前夫是前丹麦国王。对于那些可能难以理解的人来说,那是哈姆雷特的生父。他是哈姆雷特国王。我可能应该提一下,波洛涅斯也是哈姆雷特的情人奥菲莉亚的父亲。尽管这个听起来很滑稽的设定,但《哈姆雷特》绝对不是一部喜剧。(注:如果您需要复习,可以在这里阅读哈姆雷特。)

由于我在这里不打算赘述的原因,哈姆雷特正在尽力说服人们他完全疯了,当波洛涅斯走近并问“你在读什么,我的殿下?”时,他假装在读书。

哈姆雷特回答说:“'文字,文字,文字。'”换句话说,嗯,没什么重要的,你这个讨厌的小人。

莎士比亚写了很多文字。事实上,任何规模的作家、企业和组织都倾向于积累大量文字,形式为无数的文件,其中许多文件在撰写时似乎包含大量的重要性,随后存储在一些孤独的企业服务器上。在那里,这些文本被锁在数字监狱中,等待着有人寻求他们的智慧的那一天。问题是,它们太多了,格式各异,标题通常没有告诉你里面的内容。你需要的是一个搜索引擎。

谷歌是一个非常棒的搜索引擎,但它并不适合所有人,特别是如果相关文档并非供公众消费。对于这些时候,你需要你自己的搜索引擎,并结合一个爬虫,它将索引各种文档,从 OpenDocument 格式到旧的 Microsoft Docs,再到 PDF 甚至纯文本。这就是 OpenSearchServer 发挥作用的地方。顾名思义,OpenSearchServer 是一个开源项目,旨在执行以下功能:爬取和索引大型文档集合,例如您在网站上找到的文档。

我将向您展示如何从头开始设置这个文档站点,以便您可以看到所有步骤。当然,您可能已经有一个 Web 服务器在运行,这很好。我已经启动并运行了一个运行 Ubuntu 18.04 LTS 的 Linode 服务器。如果您不想花很多钱,这是一种快速启动并运行服务器的好方法,如果您从未做过,这也很有趣。

首先,您将需要一个 Web 服务器,由于我通常安装 Apache,今天我将改用 nginx


sudo apt install nginx

这将是一个相当简单的设置,因为您将在此服务器上仅运行一个网站。您仍然需要确保服务器的配置是正确的,因为您将有大量的文档要存储在此服务器上。本着本文的精神,我为我的服务器创建了一个 DNS 条目,我将其称为“thebard”,并将其放在我的域名下。因此,为了启动并运行此服务器,我在 /etc/nginx/conf.d 目录下创建了一个主机配置文件,称为“服务器块”,名为 thebard.marcelgagne.com.conf。

使用您最喜欢的文本编辑器(例如,vim),编辑该文件,使其看起来像这样


server {
    listen         80;
    listen         [::]:80;
    server_name    thebard.marcelgagne.com;
    root           /var/www/thebard;
    index          index.html;
    gzip             on;
    gzip_comp_level  3;
    gzip_types       text/plain text/css application/javascript
image/*;
}

如果您正在跟随,您显然要为 server_name 分配与我不同的内容。此外,您可以为您的文件使用任何您想要的文件夹。我在经典的 /var/www 下创建了一个名为 thebard 的目录来存储我的文档。Nginx 在 Ubuntu 上默认的用户是 www-data,因此您需要更改您选择的任何目录的所有权,以便文件属于该用户和组


chown -R www-data:www-data /var/www/thebard

最后一件事,您就可以开始了。为了确保一切正常,为默认目录创建一个小的 index.html 文件


<html>
   <head>
      <title>My Shakespearean Site</title>
   </head>
   <body>
      <H1>You are here and so am I.</H1>
   </body>
</html>

现在,让我们启动/重启 nginx 服务器


service nginx restart

如果到目前为止一切顺利,您可以使用您喜欢的 Web 浏览器访问您的服务器(图 1)。

""

图 1. 目前为止一切顺利。

您将需要一个地方来存放所有这些文档。为此,我在该服务器的根目录下创建了一个名为“Documents”的目录。我知道;这很原创。在该文件夹中,我传输了许多各种格式的经典文档。要查看目录下的文件,您需要在上面创建的服务器块中添加一个小段落。在最后一个括号之前,添加此段落


location /Documents {
        autoindex on;
    }

保存文件并重启 nginx 进程,然后将您的浏览器指向 http://yourserver.dom/Documents。您应该看到如图 2 所示的目录列表。

""

图 2. 吟游诗人的文档

假设一下,您这里有莎士比亚作品的完整目录,而不是我为演示添加的少量作品。再加上几千份其他文档,它开始看起来像是一个很好的理由,需要一个可以索引所有这些东西的搜索引擎。您自己的组织或公司(或您自己,如果您是作家)可能拥有数百甚至数千份文档。此外,这些文档很可能采用多种格式,这就是为什么我上传了 PDF、Microsoft Word 和纯文本版本的文档进行演示。

那么,让我们安装那个搜索引擎,好吗?

从 OpenSearchServer 网站 http://www.opensearchserver.com 下载适合您特定发行版的最新软件包。OpenSearchServer 的代码是用 Java 编写的,因此为了使其全部工作,您还需要最新的 JDK。现在让我们安装这两个


sudo apt install openjdk-8-jdk
sudo dpkg -i opensearchserver-1.5.14-d0d167e.deb

安装完成后,您可以像这样启动服务器


sudo service opensearchserver start

服务器启动需要几秒钟,所以您可能想在这里喝点东西。默认情况下,OpenSearchServer 在端口 9090 上运行,但您可以通过编辑 /etc/opensearchserver 并将 SERVER_PORT=9090 更改为适合您特定网络的内容来更改该默认端口。如果您这样做,请确保在尝试连接之前重启 opensearchserver。假设使用默认端口,将您的浏览器指向 http://yourserver.dom:9090 应该会得到如图 3 所示的内容。

""

图 3. 默认 OpenSearchServer 首页

这是事情变得更加令人兴奋的地方。在第一页上,注意它说“索引名称”的地方,您被邀请“创建新索引”(参见特写图 4)。您可以将您的索引称为任何您喜欢的名称,但我将其称为“ManyWords”,不要与 ManyWorlds 混淆,如果我要创建关于量子力学多世界解释 (MWI) 的所有文档的索引,我会使用 ManyWorlds。但是,我离题了。

""

图 4. 创建索引

在索引名称的正下方,有一个下拉菜单,您可以在其中定义您正在创建的索引类型。选择“网络爬虫”作为类型。单击“创建”,在几秒钟内,您将拥有一个空索引,您可以在其上开始构建您的搜索数据库。您可能还会注意到,现在顶部出现了一些以前没有的其他选项卡(图 5)。

""

图 5. 选项卡,选项卡,选项卡——一旦创建,新索引会生成许多新选项。

继续并单击“爬虫”选项卡。这样做将再次打开另一大组选项卡。此时,您可能开始认为 OpenSearchServer 的内容非常多,您将是对的。我将在这里专注于基础知识,以便您可以快速启动并运行您的搜索引擎。

在最前面和中心位置,有一个标记为“模式列表”的选项卡,您可以在这里告诉爬虫如何以及在哪里爬取。包含几个示例作为指南,但最简单的事情是告诉系统从域根目录向下爬取所有内容。您可以通过输入 http://yourdomain.dom/* 来做到这一点,其中“*”表示“索引所有内容”(图 6)。现在,单击“添加”。如果您不想索引整个站点,或者您想索引多个站点,请仅指定您想要的路径。继续添加路径,直到您定义了所有您想要的内容。我应该指出,由于在我非常简单的网站中,我的 Documents 目录没有链接到我根目录中的任何 HTML 文件,因此我也需要将其添加到模式列表中。

""

图 6. 定义索引的搜索模式

一旦您这样做,您就可以开始神奇之旅了。单击“爬取过程”选项卡,您将在其中看到许多参数,这些参数定义了网络爬虫将如何完成其工作。在这里,您可以指定用户代理的名称(您将在服务器日志中看到的名称)、要爬取的 URL 数量、要使用的并发线程数、网站子目录方面的最大深度、每次访问站点之间等待的时间等等。现在,让我们只使用图 7 中所示的默认值。

""

图 7. 定义您的网络爬虫的参数,然后单击以运行。

注意底部附近标记为“当前状态”的部分。如果这是您的第一个索引,则爬虫尚未运行。查看该部分的右侧,您将看到一个带有“永远运行”字样的下拉框,如果您站点上的内容可能发生更改,这就是您想要的。当您对选择感到满意时,单击“单击以运行”按钮。

一旦爬取开始,可能需要一些时间才能运行。OpenSearchServer 引擎确实需要解析它找到的每个各种文件,并且您的站点越大,所需的时间就越长。您可以通过向下滚动到图 7 中所示的“当前状态”部分下方来密切关注事情的进展情况,在那里显示了爬虫统计信息(图 8)。

""

图 8. 观看索引构建的进度

最终,爬虫将完成其工作,您将想要搜索您的站点,这就是我需要讨论渲染器的地方。单击顶部附近的主选项卡,即带有您创建的索引名称的选项卡。(在我的例子中,那是“ManyWords”。)这将折叠几个选项卡栏,并将您带回到顶部,进入特定于该索引的选项。单击标记为“渲染器”的选项卡。OpenSearchServer 帮助您为“搜索”创建了一个“默认”渲染器(图 9)。

""

图 9. 默认搜索渲染器已存在

正如您很快将看到的,默认渲染器非常简单。它基本上是一个空的搜索框,右侧有一个标记为“搜索”的按钮。要修饰搜索表单,您可以单击“编辑”按钮,稍后我将给您一个您可以在那里做什么的示例。现在,单击“查看”按钮以调出默认搜索表单(图 10),您将在其中要求引擎搜索单词“words”。

""

图 10. 它有效!搜索引擎呈现结果,但它们很普通。

当我写这篇文章时,我的爬虫仍在工作中,所以我只得到少量结果,但索引会随着时间的推移而构建。让我们花时间通过单击“编辑”按钮并填写页眉和页脚的一些内容来修饰渲染器(图 11)。

""

图 11. 编辑渲染器 HTML 以创建更好看的搜索页面。

在底部,在主“编辑”选项卡上,有一个“页眉 HTML”和“页脚 HTML”部分。我不会假装是世界上最好(或第一百个最好)的网站创建者,所以请原谅我对修饰我的网络搜索表单的相当简单的尝试。从页眉开始,我可能会这样做


<header width:100%><h2>%nbsp;</h2></header>
<img src="http://proman-erp.com/sites/default/files/
↪ProMan_logo_150.png" hspace=5 vspace=2>
<p>

HTML 页脚,更简单,看起来像这样


<footer width:100%><h2>Merely this, and nothing
 ↪more.</h2></footer>

就这样。是的,我知道最后一行是坡而不是莎士比亚。

现在的搜索表单看起来像什么?看看图 12,了解最终产品。

""

图 12. 完成的搜索表单

还不错,如果我可以自夸的话。而且,我将在这里结束。正如吟游诗人威廉·莎士比亚可能说过的那样,我向各位王子和公主们道晚安。愿企鹅的飞翔用它们甜美的歌声催你们入睡。

什么?企鹅不会飞?这段来自 BBC 的 视频 不同意你的看法。

""

图 13. 飞翔的企鹅

接下来你会告诉我企鹅既不会唱歌也不会跳舞。下次见!

Marcel Gagné 是一位作家和自由思想家。《与 Linux 一起烹饪》的作者。外表英俊!科学、Linux 和技术爱好者。偶尔固执己见。总是感到困惑。热爱葡萄酒、美食、音乐和偶尔的单一麦芽威士忌。

加载 Disqus 评论