Table of Contents
什麼是Havenask?
根據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要求是:
- RAM > 10GB
- CPU core > 2
- 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
建立測試數據
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%,這個結果及速度,比之前試用的搜索引擎快速及準確。