Havenask這個阿里巴巴自研的開源搜索引擎是上星期12月14日正式公開的,當在CSDN之後,立刻就到Github看一看,然後就下載來測試下。事源我手上有一個計劃的搜尋引擎效率不夠高,一直都想改善,在測試幾個開源搜索引擎之後,還是未能達到目標,這次看到阿里巴巴的這個搜索引擎已經應用到淘寶、天貓等等,所以就測試一下。

根據GitHub的介紹,Havenask是阿里巴巴集團自研的搜索引擎,也是阿里巴巴内部廣泛使用的大規模分布式檢索系統,支持了包括淘寶、天貓、菜鳥、高德、餓了麼在内的整個阿里巴巴集團的搜索業務,支持算法快速叠代,幫助客户和開發者量身訂造適合自身業務的智能搜索服務。

Havenask的優點

根據網頁介紹,Havenask有以下的優點:

  • 極致的工程性能:支持千億級數據實時檢索,百萬 QPS 查詢,百萬 TPS 寫入,毫秒級查詢延遲與秒級數據更新。
  • C++ 的底層構建:對性能、內存、穩定性有更高保障。
  • SQL 查詢支持:支持 SQL 語法便捷查詢,查詢體驗更友好。
  • 豐富的插件機制:支持各類業務插件,拓展性強。
  • 支持圖化開發:實現算法分鐘級快速叠代,定制能力豐富,在新一代智能檢索場景下的支持效果優秀。
  • 支持向量檢索:可通過與插件配合實現多模態搜索,滿足更多場景的搜索服務搭建需求(待發布)。

Havenask的技術

該引擎核心使用 C++ 編寫,並採用了 Python 語言去編寫方便調試和掭補功能的script,由於有包含不少舊版本的library(e.g. Python 2.5),所以需要使用 Docker Container運行。

這次測試的版本是0.2.2,該版本的environment要求是:

  1. RAM >  10GB
  2. CPU core > 2
  3. Harddisk > 50GB

Havenask的結構

在線部份主要是search的config,而離線部份,則主要是build index的config,這2部份是改動最多的地方。

Havenask的測試

Install Docker container

Github中有詳細的文檔解說如何安裝runtime版進行測試,我是用VMware去進行測試的,由於是使用Docker去運行,我直接安裝了Photon的minium install去測試。

在clone git library的時候,不知道是設定問題還是什麼,系統表示沒有權限去run:

git clone [email protected]:alibaba/havenask.git

所以我直接clone https://github.com/alibaba/havenask.git 的

git clone https://github.com/alibaba/havenask.git
cd havenask/docker
docker pull havenask/ha3_runtime:0.2.2
./create_container.sh <CONTAINER_NAME> havenask/ha3_runtime:0.2.2

Run container

直接用以下的command login container就可以了:

./<CONTAINER_NAME>/sshme

建立測試數據

這部份要參考文檔中的example:

cd ~/havenask/example/
## <case>代表example下某个case的目录名,如normal
python build_demo_data.py /ha3_install <case>

總數有4個example的:

開始測試

運行以下command就可以了,注意<qrsHttpPort>如果不輸入的話,default port會是45800。

python start_demo_searcher.py /ha3_install <case> <qrsHttpPort>

成功運行之後,就可以使用以下curl command測試:

python curl_http.py <qrsHttpPort> "query=select count(*) from in0"
python curl_http.py <qrsHttpPort> "query=select id,hits from in0 where MATCHINDEX('title', '搜索词典')"
python curl_http.py <qrsHttpPort> "query=select title, subject from in0_summary_ where id=1 or id=2"

或者

curl http://127.0.0.1:<qrsHttpPort>/sql?query=<SQL>

當中的<SQL>就是URL Encode了的上面的SQL query。

Query後可以加上”&&formatType:json”,那麼結果就會return json,而不是一個可示式表格。

注意

關於data格式的部份,wiki上說是:「命令与命令之间用^^\n分隔,每一对key-value之间以^_\n分隔,多值之间以^]分隔」,但我發現這些分隔符號不是肉眼看到的資料,需要直接從example的test.data處複製才可以使用。

試後感

我的計劃是古文字及古文獻資料的資料庫,分詞一直是一個較難解決的問題,因為搜索引擎的運作方式,就是為每個「詞」建立索引,然後於檢索時先將輸入的文字分詞,然後利用索引去提供快速的檢索結果。如果不能正確分詞,就出現2個結果。

一是因為分詞不準確,導致結果缺失或多出很多錯誤的結果。一是因為無法分詞,每個字都是獨立的「詞」,導致速度很慢。由於havenask可以自定義分詞分析器,而且本身的container已配置了jieba 結巴分詞(現時對古文獻分詞準確高達8成多的分詞器),所以結果還是可喜的。

以上檢索結果是以havenask及SQL在同一伺服器及同一古文獻中檢索結果。(havenask的3條結果是因為本身文字有3個相類似的分支,其實是同一條資料。)

havenask總用時是5.545ms,而以SQL去檢索的時間則為70ms,havenask比SQL快了92.08%,這個結果及速度,比之前試用的搜索引擎快速及準確。

Tags: