このプロジェクトは長期間維持されていません。
Blast は、Bleve 上に構築された Go で書かれた全文検索およびインデックス作成サーバーです。
gRPC (HTTP/2 + プロトコル バッファー) または従来の RESTful API (HTTP/1.1 + JSON) を通じて機能を提供します。
Blast は、bashicorp/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
次のように Blast を構築します。
$ 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_ENABLED | 説明 |
---|---|---|
cld2 | 1 | コンパクト言語検出機能を有効にする |
カゴメ | 0 | 日本語アナライザーを有効にする |
icu | 1 | ICU トークナイザー、タイ語アナライザーを有効にする |
リブステマー | 1 | 言語ステマーを有効にする (デンマーク語、ドイツ語、英語、スペイン語、フィンランド語、フランス語、ハンガリー語、イタリア語、オランダ語、ノルウェー語、ポルトガル語、ルーマニア語、ロシア語、スウェーデン語、トルコ語) |
CGO_ENABLE
が1
ある機能を有効にしたい場合は、上記の「ビルド依存関係のインストール」セクションを参照してインストールしてください。
ビルドが成功すると、次のようにバイナリ ファイルが表示されます。
$ ls ./bin
blast
変更をテストしたい場合は、次のようなコマンドを実行します。
$ make test
ターゲット プラットフォームを指定する場合は、ビルドと同じ方法でGOOS
およびGOARCH
環境変数を設定します。
配布パッケージを作成するには、次のコマンドを実行します。
$ make dist
Blast は、構成ファイル、環境変数、コマンド ライン引数を使用して起動オプションを変更できます。
設定できるオプションについては、次の表を参照してください。
CLIフラグ | 環境変数 | 設定ファイル | 説明 |
---|---|---|---|
--config-ファイル | - | - | 設定ファイル。省略した場合は、/etc およびホームディレクトリ内の blast.yaml が検索されます。 |
--id | BLAST_ID | ID | ノードID |
--raft-アドレス | BLAST_RAFT_ADDRESS | ラフトアドレス | Raft サーバーのリッスン アドレス |
--grpc アドレス | BLAST_GRPC_ADDRESS | grpc_アドレス | gRPC サーバーのリッスン アドレス |
--http アドレス | BLAST_HTTP_ADDRESS | http_アドレス | HTTPサーバーのリッスンアドレス |
--データディレクトリ | BLAST_DATA_DIRECTORY | データディレクトリ | インデックスとRaftログを保存するデータディレクトリ |
--マッピングファイル | BLAST_MAPPING_FILE | マッピングファイル | インデックスマッピングファイルへのパス |
--ピア-grpc-アドレス | BLAST_PEER_GRPC_ADDRESS | ピア_grpc_アドレス | 参加しているクラスター内の既存の gRPC サーバーのリッスン アドレス |
--証明書ファイル | BLAST_CERTIFICATE_FILE | 証明書ファイル | クライアントサーバーのTLS証明書ファイルへのパス |
--キーファイル | BLAST_KEY_FILE | キーファイル | クライアントサーバーのTLSキーファイルへのパス |
--通称 | BLAST_COMMON_NAME | 共通名 | 証明書の共通名 |
--cors-allowed-methods | BLAST_CORS_ALLOWED_METHODS | cors_allowed_methods | CORS で許可されるメソッド (例: GET、PUT、DELETE、POST) |
--cors-allowed-origins | BLAST_CORS_ALLOWED_ORIGINS | cors_allowed_origins | CORS で許可されるオリジン (例: http://localhost:8080,http://localhost:80) |
--cors-allowed-headers | BLAST_CORS_ALLOWED_HEADERS | cors_allowed_headers | CORS で許可されるヘッダー (例: content-type、x-some-key) |
--ログレベル | BLAST_LOG_LEVEL | ログレベル | ログレベル |
--ログファイル | BLAST_LOG_FILE | ログファイル | ログファイル |
--log-最大サイズ | BLAST_LOG_MAX_SIZE | log_max_size | ログ ファイルの最大サイズ (メガバイト単位) |
--log-max-backups | BLAST_LOG_MAX_BACKUPS | log_max_backups | ログファイルの最大バックアップ数 |
--log-max-age | BLAST_LOG_MAX_AGE | log_max_age | ログファイルの最大保存期間(日数) |
--log-compress | 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 .
または次の URL:
$ 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 アクセスをサポートし、クライアントとクラスター間のすべての通信が確実に暗号化されます。
必要なリソースを生成する 1 つの方法は、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
次のコマンドのようなフラグを追加することで、クラスターにアクセスできます。
$ ./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 .