阿里云上為NodeBB論壇配置Apache Solr中文搜索引擎
時(shí)間:2023-03-16 18:58:02 | 來(lái)源:電子商務(wù)
時(shí)間:2023-03-16 18:58:02 來(lái)源:電子商務(wù)
〇、緣起
前短時(shí)間天在本站想法里提到,現(xiàn)在開(kāi)源的論壇程序主力有三個(gè),Discourse,NodeBB,F(xiàn)larum。其中 NodeBB 底層是 NodeJS,相比 Discourse 的 Ruby 和 Flarum 的 PHP,我對(duì) JavaScript 的整個(gè)體系更熟悉一些。雖然 Discourse 和 Flarum 我都自己裝著玩過(guò),但在 NodeBB 上花的時(shí)間最多。
NodeBB 有很多問(wèn)題,其中一個(gè)是中文搜索功能,一直很雞肋,官方甚至都不支持中文搜索,這也極大限制了它在大中國(guó)區(qū)的發(fā)展。
NodeBB 的插件系統(tǒng)中有 db-search, elasticsearch, solr 三種搜索引擎,其中只有 Solr 能夠搜索非拉丁文字符,比如中文、日本、韓文等。
另一個(gè)解決方案是使用Google、百度、Bing等第三方搜索引擎,但這樣你的數(shù)據(jù)全部要開(kāi)放出來(lái),被這些搜索引擎索引,這個(gè)并不是所有人都能接受。被Google索引自由度更大一些,但是中國(guó)用戶又不能用;被百度索引,很多東西都會(huì)被嚴(yán)格審查,如果不小心觸犯紅線,輕則論壇被封掉,重則蹲大牢,這個(gè)誰(shuí)都不愿意看到;至于Bing搜索,用戶太少,而且同樣也面臨 big brother is watching you 的問(wèn)題。
本文介紹如何在阿里云上為 NodeBB 論壇配置好 Apache Solr 中文搜索引擎。
一、軟硬件要求
硬件方面,阿里云和AWS上現(xiàn)在都是ECS彈性伸縮服務(wù)器,可以隨時(shí)調(diào)整CPU和內(nèi)存的配置。但是為了使用 Solr 搜索引擎,至少要準(zhǔn)備2G的內(nèi)存。有些地方甚至建議準(zhǔn)備8G內(nèi)存,服務(wù)器則至少要12G內(nèi)存,對(duì)于普通人來(lái)說(shuō),這個(gè)成本太高了。用戶少的時(shí)候,先用2G-4G的服務(wù)器即可,以后再擴(kuò)充。
系統(tǒng)方面,推薦使用 Ubuntu 14.04,16.04,18.04這些長(zhǎng)期維護(hù)的版本。
Solr 需要一個(gè) Java 的運(yùn)行環(huán)境,至少是 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,就可以用了,再更新一下環(huán)境變量:
sudo apt install oracle-java8-set-default
這樣軟硬件環(huán)境就準(zhǔn)備好了。
參考鏈接:How to Install Oracle Java 8 / 9 in Ubuntu 16.04, Linux Mint 18
二、安裝 solr 插件
有一個(gè)插件是名字叫做 nodebb-plugin-solr, GitHub 鏈接:julianlam/nodebb-plugin-solr
在管理后臺(tái)插件中搜索,找到后安裝好,重新部署一下 NodeBB。也可以通過(guò)命令行安裝:
npm install nodebb-plugin-solr
注意,安裝 Solr 插件之后,停用 dbsearch 和 elasticsearch 這些其他的搜索引擎插件。
三、安裝 Apache Solr 搜索引擎
這是在阿里云服務(wù)器上安裝,會(huì)費(fèi)一些時(shí)間。這部分可以參考 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/
啟動(dòng)并進(jìn)行基礎(chǔ)配置:
./bin/solr start -e cloud
其中有幾個(gè)概念:
Node,搜索引擎的節(jié)點(diǎn)數(shù),填1個(gè)就行。
Port,搜索引擎的連接端口,默認(rèn)是8983,如果有4個(gè)Node,那么每個(gè)Node都要有一個(gè)不同的端口供連接。
Collections,就是準(zhǔn)備搜索的文檔集合的名字,比如你的論壇名字拼音或域名。
Shard,分區(qū),文檔集合被分為幾個(gè)區(qū)塊,這個(gè)是來(lái)自搜索算法中的概念,數(shù)據(jù)不多的話,選1個(gè)就可以了。
Replica,備份,防止系統(tǒng)崩潰,可以設(shè)2個(gè)Replica。
Core,核心,一個(gè)Replica就是一個(gè)核心,這個(gè)之后會(huì)在NodeBB中用到。
其他的填選 default 就可以了。
配置完,Solr 就已經(jīng)在運(yùn)行了,但并不能看到,還需要打開(kāi)防火墻。
四、打開(kāi)阿里云控制臺(tái)和服務(wù)器的8983端口
阿里云的每臺(tái)ECS服務(wù)器,都有一個(gè)安全配置規(guī)則:
如果你不添加這個(gè)配置,8983這個(gè)端口就不能用。同樣的,如果你沒(méi)有打開(kāi)80端口,HTTP就沒(méi)有響應(yīng);不打開(kāi)22端口,SSH就無(wú)法連接。
另外一個(gè)是在服務(wù)器上讓防火墻允許8983端口進(jìn)出數(shù)據(jù):
ufw allow 8983
這一步很多地方也沒(méi)有提到,如果 ufw 啟用了,但沒(méi)有打開(kāi)端口,就無(wú)法交換數(shù)據(jù)。
初期為了配置,先要打開(kāi)這個(gè)Node的端口,以便在瀏覽器中了解Solr的各種信息。后面配置好了,就需要關(guān)掉這個(gè)端口。
現(xiàn)在在網(wǎng)絡(luò)瀏覽器上打開(kāi)“服務(wù)器IP地址:8983/solr”,就可以看到 Solr 的后臺(tái)管理界面:
Solr管理界面五、在 NodeBB 插件中填入 Solr 信息
進(jìn)入 NodeBB 的后臺(tái)管理界面,選“插件-Apache Solr”,填入 Solr 的相關(guān)信息:
其中前三個(gè)都是默認(rèn),第四個(gè)需要注意,填入 Core 的名字,這個(gè)可以在瀏覽器的Solr管理頁(yè)面找到,在左側(cè),點(diǎn)擊“Core selector”,可以看到Solr現(xiàn)在正在運(yùn)行的Core。如果之前配置了2個(gè)Replica,那么就會(huì)有兩個(gè)Core,選填入一個(gè)就行了,比如 test_
shard1_replica1。
保存好后,重新啟動(dòng)一下論壇,看到右側(cè)顯示 Connected,則表示NodeBB和Solr順利連接,然后選擇 Enable Index 以及 Rebuild Index,就可以將論壇中的數(shù)據(jù)都索引一遍,如果連接正常,速度會(huì)很快。
六、關(guān)閉阿里云和服務(wù)器的8983端口
先在阿里云ECS服務(wù)器上刪掉剛才建立的8983端口安全組規(guī)則,然后在服務(wù)器上執(zhí)行
:ufw deny 8983
這樣是為了保證安全。關(guān)閉8983端口之后,瀏覽器中將無(wú)法再看到 Solr 的后臺(tái)管理界面。但是NodeBB是在本機(jī)上連接Solr,所以不需要向外開(kāi)放這個(gè)端口。
如何通過(guò)后臺(tái)管理界面配置 Solr,可以參考官方文檔:Collections API | Apache Solr Reference Guide 6.6
另外專門解釋 Solr 中的一些概念:SolrTerminology - Solr Wiki
NodeBB 上配置好 Solr 搜索引擎之后,就可以順利搜索中文了,而且性能相當(dāng)好:
NodeBB 使用 Solr 實(shí)現(xiàn)本地中文搜索七、其他問(wèn)題
為了使用阿里云的服務(wù)器,域名也必須是在國(guó)內(nèi)備案的,備案過(guò)程需要至少23天。
NodeBB 仍然在熱火朝天的開(kāi)發(fā)之中,各種 bug 在所難免,常會(huì)有版本升級(jí),每次升級(jí)在解決一些問(wèn)題時(shí),也會(huì)帶來(lái)新的問(wèn)題,這個(gè)就需要至少能進(jìn)行 JavaScript 相關(guān)的編程,自己去解決一些問(wèn)題。很大概率你遇到的問(wèn)題,還沒(méi)有人回答過(guò)。這是我將這個(gè)過(guò)程記錄下來(lái)的原因。如果你遇到什么問(wèn)題,歡迎評(píng)論留言。