這個項目已經很久沒有維護了。
Blast 是一個用 Go 寫的全文搜尋和索引伺服器,建構在 Bleve 之上。
它透過gRPC(HTTP/2 + Protocol Buffers)或傳統的RESTful API(HTTP/1.1 + JSON)提供功能。
Blast 實作了 hashcorp/raft 的 Raft 共識演算法。它在所有節點之間達成共識,確保對系統所做的每項更改都針對法定數量的節點進行,或者根本不進行。 Blast 讓程式設計師可以輕鬆開發具有高級功能的搜尋應用程式。
如果您需要啟用 cld2、icu、libstemmer 或 leveldb,Blast 需要一些 C/C++ 函式庫。以下部分是有關滿足特定平台上的依賴性的說明。
$ sudo apt-get update
$ sudo apt-get install -y
libicu-dev
libstemmer-dev
libleveldb-dev
gcc-4.8
g++-4.8
build-essential
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-8 80
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-8 80
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 90
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 90
$ export GOPATH= ${HOME} /go
$ mkdir -p ${GOPATH} /src/github.com/blevesearch
$ cd ${GOPATH} /src/github.com/blevesearch
$ git clone https://github.com/blevesearch/cld2.git
$ cd ${GOPATH} /src/github.com/blevesearch/cld2
$ git clone https://github.com/CLD2Owners/cld2.git
$ cd cld2/internal
$ ./compile_libs.sh
$ sudo cp * .so /usr/local/lib
$ brew install
icu4c
leveldb
$ export GOPATH= ${HOME} /go
$ go get -u -v github.com/blevesearch/cld2
$ cd ${GOPATH} /src/github.com/blevesearch/cld2
$ git clone https://github.com/CLD2Owners/cld2.git
$ cd cld2/internal
$ perl -p -i -e ' s/soname=/install_name,/ ' compile_libs.sh
$ ./compile_libs.sh
$ sudo cp * .so /usr/local/lib
建築爆炸如下:
$ mkdir -p ${GOPATH} /src/github.com/mosuka
$ cd ${GOPATH} /src/github.com/mosuka
$ git clone https://github.com/mosuka/blast.git
$ cd blast
$ make
如果您省略GOOS
或GOARCH
,它將建立您正在使用的平台的二進位檔案。
如果要指定目標平台,請設定GOOS
和GOARCH
環境變數。
$ make GOOS=linux build
$ make GOOS=darwin build
$ make GOOS=windows build
Blast 支援一些 Bleve 擴充 (blevex)。如果您想使用它們進行構建,請設定 CGO_LDFLAGS、CGO_CFLAGS、CGO_ENABLED 和 BUILD_TAGS。例如,建立 LevelDB 以可用於索引存儲,如下所示:
$ make GOOS=linux
BUILD_TAGS=icu
CGO_ENABLED=1
build
$ make GOOS=linux
BUILD_TAGS= " kagome icu libstemmer cld2 "
CGO_ENABLED=1
build
$ make GOOS=darwin
BUILD_TAGS= " kagome icu libstemmer cld2 "
CGO_ENABLED=1
CGO_LDFLAGS= " -L/usr/local/opt/icu4c/lib "
CGO_CFLAGS= " -I/usr/local/opt/icu4c/include "
build
請參閱下表以了解支援的 Bleve 擴充功能的建置標誌:
BUILD_TAGS | CGO_啟用 | 描述 |
---|---|---|
CLD2 | 1 | 啟用緊湊語言偵測器 |
戈薇 | 0 | 啟用日語語言分析器 |
重症加護病房 | 1 | 啟用 ICU Tokenizer、泰語分析器 |
詞幹分析器 | 1 | 啟用語言詞幹分析器(丹麥語、德語、英語、西班牙語、芬蘭語、法語、匈牙利語、義大利語、荷蘭語、挪威語、葡萄牙語、羅馬尼亞語、俄語、瑞典語、土耳其語) |
如果您想要啟用CGO_ENABLE
為1
的功能,請參考上面安裝建置相依性部分進行安裝。
建置成功後,您可以看到二進位文件,如下所示:
$ ls ./bin
blast
如果您想測試您的更改,請執行以下命令:
$ make test
如果要指定目標平台,請按照與建置相同的方式設定GOOS
和GOARCH
環境變數。
若要建立分發包,請執行以下命令:
$ make dist
Blast 可以使用設定檔、環境變數和命令列參數來變更其啟動選項。
有關可配置的選項,請參閱下表。
CLI 標誌 | 環境變數 | 設定檔 | 描述 |
---|---|---|---|
--設定檔 | - | - | 設定檔。如果省略,將搜尋/etc和主目錄中的blast.yaml |
- ID | BLAST_ID | ID | 節點號 |
--raft-地址 | BLAST_RAFT_ADDRESS | 筏位址 | Raft伺服器監聽位址 |
--grpc-位址 | BLAST_GRPC_ADDRESS | grpc_位址 | gRPC伺服器監聽位址 |
--http-網址 | BLAST_HTTP_ADDRESS | http位址 | HTTP伺服器監聽位址 |
--資料目錄 | BLAST_DATA_DIRECTORY | 數據目錄 | data目錄,存放索引和Raft日誌 |
--映射文件 | BLAST_MAPPING_FILE | 映射文件 | 索引映射檔案的路徑 |
--peer-grpc-位址 | BLAST_PEER_GRPC_ADDRESS | 對等 grpc 位址 | 加入叢集中現有 gRPC 伺服器的監聽位址 |
--證書文件 | BLAST_證書_文件 | 證書文件 | 客戶端伺服器 TLS 憑證檔案的路徑 |
--密鑰文件 | BLAST_KEY_FILE | 密鑰檔案 | 客戶端伺服器 TLS 金鑰檔案的路徑 |
--通用名稱 | BLAST_COMMON_NAME | 通用名稱 | 憑證通用名稱 |
--cors-允許的方法 | BLAST_CORS_ALLOWED_METHODS | cors_allowed_methods | CORS 允許的方法(例如:GET、PUT、DELETE、POST) |
--cors-允許-起源 | BLAST_CORS_ALLOWED_ORIGINS | cors_allowed_origins | CORS 允許的來源(例如:http://localhost:8080、http://localhost:80) |
--cors-允許的標頭 | BLAST_CORS_ALLOWED_HEADERS | cors_allowed_headers | CORS 允許的標頭(例如:內容類型、x-some-key) |
--日誌等級 | BLAST_LOG_LEVEL | 日誌等級 | 日誌等級 |
--記錄檔 | BLAST_LOG_FILE | 記錄檔 | 記錄檔 |
--log-最大大小 | BLAST_LOG_MAX_SIZE | 日誌最大大小 | 日誌檔案的最大大小(以兆位元組為單位) |
--log-max-備份 | BLAST_LOG_MAX_BACKUPS | 日誌最大備份數 | 日誌檔案的最大備份數 |
--log-最大年齡 | BLAST_LOG_MAX_AGE | 日誌最大年齡 | 日誌檔案的最長期限(以天為單位) |
--日誌壓縮 | BLAST_LOG_COMPRESS | 日誌壓縮 | 壓縮日誌文件 |
啟動伺服器很簡單,如下所示:
$ ./bin/blast start
--id=node1
--raft-address=:7000
--http-address=:8000
--grpc-address=:9000
--data-directory=/tmp/blast/node1
--mapping-file=./examples/example_mapping.json
可以透過以下命令取得節點資訊:
$ ./bin/blast node | jq .
或以下網址:
$ curl -X GET http://localhost:8000/v1/node | jq .
上述命令的結果是:
{
"node" : {
"raft_address" : " :7000 " ,
"metadata" : {
"grpc_address" : " :9000 " ,
"http_address" : " :8000 "
},
"state" : " Leader "
}
}
您可以檢查節點的健康狀態。
$ ./bin/blast healthcheck | jq .
也提供以下 REST API
此端點始終傳回 200,套用於檢查伺服器運作狀況。
$ curl -X GET http://localhost:8000/v1/liveness_check | jq .
當伺服器準備好服務流量(即回應查詢)時,此端點傳回 200。
$ curl -X GET http://localhost:8000/v1/readiness_check | jq .
若要放置文檔,請執行以下命令:
$ ./bin/blast set 1 '
{
"fields": {
"title": "Search engine (computing)",
"text": "A search engine is an information retrieval system designed to help find information stored on a computer system. The search results are usually presented in a list and are commonly called hits. Search engines help to minimize the time required to find information and the amount of information which must be consulted, akin to other techniques for managing information overload. The most public, visible form of a search engine is a Web search engine which searches for information on the World Wide Web.",
"timestamp": "2018-07-04T05:41:00Z",
"_type": "example"
}
}
' | jq .
或者,您可以使用 RESTful API,如下所示:
$ curl -X PUT ' http://127.0.0.1:8000/v1/documents/1 ' --data-binary '
{
"fields": {
"title": "Search engine (computing)",
"text": "A search engine is an information retrieval system designed to help find information stored on a computer system. The search results are usually presented in a list and are commonly called hits. Search engines help to minimize the time required to find information and the amount of information which must be consulted, akin to other techniques for managing information overload. The most public, visible form of a search engine is a Web search engine which searches for information on the World Wide Web.",
"timestamp": "2018-07-04T05:41:00Z",
"_type": "example"
}
}
' | jq .
或者
$ curl -X PUT ' http://127.0.0.1:8000/v1/documents/1 ' -H " Content-Type: application/json " --data-binary @./examples/example_doc_1.json
若要取得文檔,請執行以下命令:
$ ./bin/blast get 1 | jq .
或者,您可以使用 RESTful API,如下所示:
$ curl -X GET ' http://127.0.0.1:8000/v1/documents/1 ' | jq .
你可以看到結果。上述命令的結果是:
{
"fields" : {
"_type" : " example " ,
"text" : " A search engine is an information retrieval system designed to help find information stored on a computer system. The search results are usually presented in a list and are commonly called hits. Search engines help to minimize the time required to find information and the amount of information which must be consulted, akin to other techniques for managing information overload. The most public, visible form of a search engine is a Web search engine which searches for information on the World Wide Web. " ,
"timestamp" : " 2018-07-04T05:41:00Z " ,
"title" : " Search engine (computing) "
}
}
若要搜尋文檔,請執行以下命令:
$ ./bin/blast search '
{
"search_request": {
"query": {
"query": "+_all:search"
},
"size": 10,
"from": 0,
"fields": [
"*"
],
"sort": [
"-_score"
]
}
}
' | jq .
或者,您可以使用 RESTful API,如下所示:
$ curl -X POST ' http://127.0.0.1:8000/v1/search ' --data-binary '
{
"search_request": {
"query": {
"query": "+_all:search"
},
"size": 10,
"from": 0,
"fields": [
"*"
],
"sort": [
"-_score"
]
}
}
' | jq .
你可以看到結果。上述命令的結果是:
{
"search_result" : {
"facets" : null ,
"hits" : [
{
"fields" : {
"_type" : " example " ,
"text" : " A search engine is an information retrieval system designed to help find information stored on a computer system. The search results are usually presented in a list and are commonly called hits. Search engines help to minimize the time required to find information and the amount of information which must be consulted, akin to other techniques for managing information overload. The most public, visible form of a search engine is a Web search engine which searches for information on the World Wide Web. " ,
"timestamp" : " 2018-07-04T05:41:00Z " ,
"title" : " Search engine (computing) "
},
"id" : " 1 " ,
"index" : " /tmp/blast/node1/index " ,
"score" : 0.09703538256409851 ,
"sort" : [
" _score "
]
}
],
"max_score" : 0.09703538256409851 ,
"request" : {
"explain" : false ,
"facets" : null ,
"fields" : [
" * "
],
"from" : 0 ,
"highlight" : null ,
"includeLocations" : false ,
"query" : {
"query" : " +_all:search "
},
"search_after" : null ,
"search_before" : null ,
"size" : 10 ,
"sort" : [
" -_score "
]
},
"status" : {
"failed" : 0 ,
"successful" : 1 ,
"total" : 1
},
"took" : 171880 ,
"total_hits" : 1
}
}
刪除文檔,執行以下命令:
$ ./bin/blast delete 1
或者,您可以使用 RESTful API,如下所示:
$ curl -X DELETE ' http://127.0.0.1:8000/v1/documents/1 '
若要批量索引文檔,請執行以下命令:
$ ./bin/blast bulk-index --file ./examples/example_bulk_index.json
或者,您可以使用 RESTful API,如下所示:
$ curl -X PUT ' http://127.0.0.1:8000/v1/documents ' -H " Content-Type: application/x-ndjson " --data-binary @./examples/example_bulk_index.json
若要批量刪除文檔,請執行以下命令:
$ ./bin/blast bulk-delete --file ./examples/example_bulk_delete.txt
或者,您可以使用 RESTful API,如下所示:
$ curl -X DELETE ' http://127.0.0.1:8000/v1/documents ' -H " Content-Type: text/plain " --data-binary @./examples/example_bulk_delete.txt
Blast 很容易帶起群集。該節點已經在運行,但不具有容錯能力。如果需要提高容錯能力,請再增加 2 個資料節點,如下圖所示:
$ ./bin/blast start
--id=node2
--raft-address=:7001
--http-address=:8001
--grpc-address=:9001
--peer-grpc-address=:9000
--data-directory=/tmp/blast/node2
--mapping-file=./examples/example_mapping.json
$ ./bin/blast start
--id=node3
--raft-address=:7002
--http-address=:8002
--grpc-address=:9002
--peer-grpc-address=:9000
--data-directory=/tmp/blast/node3
--mapping-file=./examples/example_mapping.json
上面的範例顯示每個 Blast 節點都在同一台主機上運行,因此每個節點必須偵聽不同的連接埠。如果每個節點運行在不同的主機上,則沒有必要這樣做。
這指示每個新節點加入現有節點,每個節點在啟動時識別加入的叢集。所以你有一個 3 節點叢集。這樣你就可以容忍 1 個節點的故障。您可以使用以下命令檢查集群:
$ ./bin/blast cluster | jq .
或者,您可以使用 RESTful API,如下所示:
$ curl -X GET ' http://127.0.0.1:8000/v1/cluster ' | jq .
您可以看到 JSON 格式的結果。上述命令的結果是:
{
"cluster" : {
"nodes" : {
"node1" : {
"raft_address" : " :7000 " ,
"metadata" : {
"grpc_address" : " :9000 " ,
"http_address" : " :8000 "
},
"state" : " Leader "
},
"node2" : {
"raft_address" : " :7001 " ,
"metadata" : {
"grpc_address" : " :9001 " ,
"http_address" : " :8001 "
},
"state" : " Follower "
},
"node3" : {
"raft_address" : " :7002 " ,
"metadata" : {
"grpc_address" : " :9002 " ,
"http_address" : " :8002 "
},
"state" : " Follower "
}
},
"leader" : " node1 "
}
}
在叢集中推薦3個或更多奇數節點。在故障場景下,資料遺失是不可避免的,因此避免部署單節點。
上面的範例中,節點在啟動時加入集群,但您也可以稍後將已經以獨立模式啟動的節點加入集群,如下所示:
$ ./bin/blast join --grpc-address=:9000 node2 127.0.0.1:9001
或者,您可以使用 RESTful API,如下所示:
$ curl -X PUT ' http://127.0.0.1:8000/v1/cluster/node2 ' --data-binary '
{
"raft_address": ":7001",
"metadata": {
"grpc_address": ":9001",
"http_address": ":8001"
}
}
'
若要從叢集中刪除節點,請執行下列命令:
$ ./bin/blast leave --grpc-address=:9000 node2
或者,您可以使用 RESTful API,如下所示:
$ curl -X DELETE ' http://127.0.0.1:8000/v1/cluster/node2 '
以下命令將文件索引到叢集中的任何節點:
$ ./bin/blast set 1 '
{
"fields": {
"title": "Search engine (computing)",
"text": "A search engine is an information retrieval system designed to help find information stored on a computer system. The search results are usually presented in a list and are commonly called hits. Search engines help to minimize the time required to find information and the amount of information which must be consulted, akin to other techniques for managing information overload. The most public, visible form of a search engine is a Web search engine which searches for information on the World Wide Web.",
"timestamp": "2018-07-04T05:41:00Z",
"_type": "example"
}
}
' --grpc-address=:9000 | jq .
因此,您可以從上述命令指定的節點取得文檔,如下所示:
$ ./bin/blast get 1 --grpc-address=:9000 | jq .
你可以看到結果。上述命令的結果是:
value1
您也可以從叢集中的其他節點取得相同的文檔,如下所示:
$ ./bin/blast get 1 --grpc-address=:9001 | jq .
$ ./bin/blast get 1 --grpc-address=:9002 | jq .
你可以看到結果。上述命令的結果是:
{
"fields" : {
"_type" : " example " ,
"text" : " A search engine is an information retrieval system designed to help find information stored on a computer system. The search results are usually presented in a list and are commonly called hits. Search engines help to minimize the time required to find information and the amount of information which must be consulted, akin to other techniques for managing information overload. The most public, visible form of a search engine is a Web search engine which searches for information on the World Wide Web. " ,
"timestamp" : " 2018-07-04T05:41:00Z " ,
"title" : " Search engine (computing) "
}
}
您可以像這樣建立 Docker 容器映像:
$ make docker-build
您也可以使用已在 docker.io 中註冊的 Docker 容器映像,如下所示:
$ docker pull mosuka/blast:latest
請參閱 https://hub.docker.com/r/mosuka/blast/tags/
在 Docker 上運行 Blast 資料節點。像這樣啟動 Blast 節點:
$ docker run --rm --name blast-node1
-p 7000:7000
-p 8000:8000
-p 9000:9000
-v $( pwd ) /etc/blast_mapping.json:/etc/blast_mapping.json
mosuka/blast:latest start
--id=node1
--raft-address=:7000
--http-address=:8000
--grpc-address=:9000
--data-directory=/tmp/blast/node1
--mapping-file=/etc/blast_mapping.json
可以在docker容器中執行命令如下:
$ docker exec -it blast-node1 blast node --grpc-address=:9000
Blast 支援 HTTPS 訪問,確保客戶端和叢集之間的所有通訊都是加密的。
產生必要資源的一種方法是透過 openssl。例如:
$ openssl req -x509 -nodes -newkey rsa:4096 -keyout ./etc/blast_key.pem -out ./etc/blast_cert.pem -days 365 -subj ' /CN=localhost '
Generating a 4096 bit RSA private key
............................++
........++
writing new private key to ' key.pem '
啟動啟用 HTTPS、節點對節點加密並使用上述設定檔的節點。假設 HTTPS X.509 憑證和金鑰分別位於路徑 server.crt 和 key.pem 處。
$ ./bin/blast start
--id=node1
--raft-address=:7000
--http-address=:8000
--grpc-address=:9000
--peer-grpc-address=:9000
--data-directory=/tmp/blast/node1
--mapping-file=./etc/blast_mapping.json
--certificate-file=./etc/blast_cert.pem
--key-file=./etc/blast_key.pem
--common-name=localhost
$ ./bin/blast start
--id=node2
--raft-address=:7001
--http-address=:8001
--grpc-address=:9001
--peer-grpc-address=:9000
--data-directory=/tmp/blast/node2
--mapping-file=./etc/blast_mapping.json
--certificate-file=./etc/blast_cert.pem
--key-file=./etc/blast_key.pem
--common-name=localhost
$ ./bin/blast start
--id=node3
--raft-address=:7002
--http-address=:8002
--grpc-address=:9002
--peer-grpc-address=:9000
--data-directory=/tmp/blast/node3
--mapping-file=./etc/blast_mapping.json
--certificate-file=./etc/blast_cert.pem
--key-file=./etc/blast_key.pem
--common-name=localhost
您可以透過新增flag來存取集群,例如以下命令:
$ ./bin/blast cluster --grpc-address=:9000 --certificate-file=./etc/blast_cert.pem --common-name=localhost | jq .
或者
$ curl -X GET https://localhost:8000/v1/cluster --cacert ./etc/cert.pem | jq .