这个项目已经很久没有维护了。
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 .