阿里云上为NodeBB论坛配置Apache Solr中文搜索引擎
时间:2023-03-16 18:58:02 | 来源:电子商务
时间:2023-03-16 18:58:02 来源:电子商务
〇、缘起
前短时间天在本站想法里提到,现在开源的论坛程序主力有三个,Discourse,NodeBB,Flarum。其中 NodeBB 底层是 NodeJS,相比 Discourse 的 Ruby 和 Flarum 的 PHP,我对 JavaScript 的整个体系更熟悉一些。虽然 Discourse 和 Flarum 我都自己装着玩过,但在 NodeBB 上花的时间最多。
NodeBB 有很多问题,其中一个是中文搜索功能,一直很鸡肋,官方甚至都不支持中文搜索,这也极大限制了它在大中国区的发展。
NodeBB 的插件系统中有 db-search, elasticsearch, solr 三种搜索引擎,其中只有 Solr 能够搜索非拉丁文字符,比如中文、日本、韩文等。
另一个解决方案是使用Google、百度、Bing等第三方搜索引擎,但这样你的数据全部要开放出来,被这些搜索引擎索引,这个并不是所有人都能接受。被Google索引自由度更大一些,但是中国用户又不能用;被百度索引,很多东西都会被严格审查,如果不小心触犯红线,轻则论坛被封掉,重则蹲大牢,这个谁都不愿意看到;至于Bing搜索,用户太少,而且同样也面临 big brother is watching you 的问题。
本文介绍如何在阿里云上为 NodeBB 论坛配置好 Apache Solr 中文搜索引擎。
一、软硬件要求
硬件方面,阿里云和AWS上现在都是ECS弹性伸缩服务器,可以随时调整CPU和内存的配置。但是为了使用 Solr 搜索引擎,至少要准备2G的内存。有些地方甚至建议准备8G内存,服务器则至少要12G内存,对于普通人来说,这个成本太高了。用户少的时候,先用2G-4G的服务器即可,以后再扩充。
系统方面,推荐使用 Ubuntu 14.04,16.04,18.04这些长期维护的版本。
Solr 需要一个 Java 的运行环境,至少是 Java 8 以上。
安装 Java 8:
sudo add-apt-repository ppa:webupd8team/javasudo apt update; sudo apt install oracle-java8-installer
然后检查一下:
java -version
1.8以上就代表是 Java 8,就可以用了,再更新一下环境变量:
sudo apt install oracle-java8-set-default
这样软硬件环境就准备好了。
参考链接:How to Install Oracle Java 8 / 9 in Ubuntu 16.04, Linux Mint 18
二、安装 solr 插件
有一个插件是名字叫做 nodebb-plugin-solr, GitHub 链接:julianlam/nodebb-plugin-solr
在管理后台插件中搜索,找到后安装好,重新部署一下 NodeBB。也可以通过命令行安装:
npm install nodebb-plugin-solr
注意,安装 Solr 插件之后,停用 dbsearch 和 elasticsearch 这些其他的搜索引擎插件。
三、安装 Apache Solr 搜索引擎
这是在阿里云服务器上安装,会费一些时间。这部分可以参考 Solr 的官方教程:Apache Solr Reference Guide 7.6
下载 Solr:
wget http://ftp.jaist.ac.jp/pub/apache/lucene/solr/7.6.0/solr-7.6.0.zip
解压:
~$ ls solr*solr-7.6.0.zip~$ unzip -q solr-7.6.0.zip~$ cd solr-7.6.0/
启动并进行基础配置:
./bin/solr start -e cloud
其中有几个概念:
Node,搜索引擎的节点数,填1个就行。
Port,搜索引擎的连接端口,默认是8983,如果有4个Node,那么每个Node都要有一个不同的端口供连接。
Collections,就是准备搜索的文档集合的名字,比如你的论坛名字拼音或域名。
Shard,分区,文档集合被分为几个区块,这个是来自搜索算法中的概念,数据不多的话,选1个就可以了。
Replica,备份,防止系统崩溃,可以设2个Replica。
Core,核心,一个Replica就是一个核心,这个之后会在NodeBB中用到。
其他的填选 default 就可以了。
配置完,Solr 就已经在运行了,但并不能看到,还需要打开防火墙。
四、打开阿里云控制台和服务器的8983端口
阿里云的每台ECS服务器,都有一个安全配置规则:
如果你不添加这个配置,8983这个端口就不能用。同样的,如果你没有打开80端口,HTTP就没有响应;不打开22端口,SSH就无法连接。
另外一个是在服务器上让防火墙允许8983端口进出数据:
ufw allow 8983
这一步很多地方也没有提到,如果 ufw 启用了,但没有打开端口,就无法交换数据。
初期为了配置,先要打开这个Node的端口,以便在浏览器中了解Solr的各种信息。后面配置好了,就需要关掉这个端口。
现在在网络浏览器上打开“服务器IP地址:8983/solr”,就可以看到 Solr 的后台管理界面:
Solr管理界面五、在 NodeBB 插件中填入 Solr 信息
进入 NodeBB 的后台管理界面,选“插件-Apache Solr”,填入 Solr 的相关信息:
其中前三个都是默认,第四个需要注意,填入 Core 的名字,这个可以在浏览器的Solr管理页面找到,在左侧,点击“Core selector”,可以看到Solr现在正在运行的Core。如果之前配置了2个Replica,那么就会有两个Core,选填入一个就行了,比如 test_
shard1_replica1。
保存好后,重新启动一下论坛,看到右侧显示 Connected,则表示NodeBB和Solr顺利连接,然后选择 Enable Index 以及 Rebuild Index,就可以将论坛中的数据都索引一遍,如果连接正常,速度会很快。
六、关闭阿里云和服务器的8983端口
先在阿里云ECS服务器上删掉刚才建立的8983端口安全组规则,然后在服务器上执行
:ufw deny 8983
这样是为了保证安全。关闭8983端口之后,浏览器中将无法再看到 Solr 的后台管理界面。但是NodeBB是在本机上连接Solr,所以不需要向外开放这个端口。
如何通过后台管理界面配置 Solr,可以参考官方文档:Collections API | Apache Solr Reference Guide 6.6
另外专门解释 Solr 中的一些概念:SolrTerminology - Solr Wiki
NodeBB 上配置好 Solr 搜索引擎之后,就可以顺利搜索中文了,而且性能相当好:
NodeBB 使用 Solr 实现本地中文搜索七、其他问题
为了使用阿里云的服务器,域名也必须是在国内备案的,备案过程需要至少23天。
NodeBB 仍然在热火朝天的开发之中,各种 bug 在所难免,常会有版本升级,每次升级在解决一些问题时,也会带来新的问题,这个就需要至少能进行 JavaScript 相关的编程,自己去解决一些问题。很大概率你遇到的问题,还没有人回答过。这是我将这个过程记录下来的原因。如果你遇到什么问题,欢迎评论留言。