Этот проект уже давно не поддерживается.
Blast — это сервер полнотекстового поиска и индексирования, написанный на Go и построенный на базе Bleve.
Он предоставляет функции через gRPC (HTTP/2 + буферы протокола) или традиционный RESTful API (HTTP/1.1 + JSON).
Blast реализует алгоритм консенсуса Raft от hashicorp/raft. Он достигает консенсуса между всеми узлами, гарантируя, что каждое изменение, внесенное в систему, вносится в кворум узлов или не вносится вообще. Blast позволяет программистам легко разрабатывать поисковые приложения с расширенными функциями.
Blast требует наличия некоторых библиотек C/C++, если вам нужно включить cld2, icu, libstemmer или leveldb. В следующих разделах приведены инструкции по удовлетворению зависимостей на конкретных платформах.
$ 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_ENABLED | Описание |
---|---|---|
cld2 | 1 | Включить детектор компактного языка |
кагоме | 0 | Включить анализатор японского языка |
отделение интенсивной терапии | 1 | Включить токенизатор ICU, анализатор тайского языка |
библиотека | 1 | Включить языковой Stemmer (датский, немецкий, английский, испанский, финский, французский, венгерский, итальянский, голландский, норвежский, португальский, румынский, русский, шведский, турецкий) |
Если вы хотите включить функцию, CGO_ENABLE
которой равен 1
, установите ее, следуя разделу «Установка зависимостей сборки» выше.
Вы можете увидеть двоичный файл после успешной сборки следующим образом:
$ ls ./bin
blast
Если вы хотите протестировать свои изменения, выполните следующую команду:
$ make test
Если вы хотите указать целевую платформу, установите переменные среды GOOS
и GOARCH
так же, как при сборке.
Чтобы создать дистрибутив, выполните следующую команду:
$ make dist
Blast может изменить параметры запуска с помощью файлов конфигурации, переменных среды и аргументов командной строки.
В следующей таблице приведены параметры, которые можно настроить.
Флаг CLI | Переменная среды | Файл конфигурации | Описание |
---|---|---|---|
--config-файл | - | - | файл конфигурации. если этот параметр опущен, будет выполняться поиск в файле blast.yaml в /etc и домашнем каталоге. |
--идентификатор | BLAST_ID | идентификатор | идентификатор узла |
--raft-адрес | BLAST_RAFT_ADDRESS | адрес_плота | Адрес прослушивания сервера Raft |
--grpc-адрес | BLAST_GRPC_ADDRESS | grpc_address | адрес прослушивания сервера gRPC |
--http-адрес | BLAST_HTTP_ADDRESS | http_адрес | Адрес прослушивания HTTP-сервера |
--data-каталог | BLAST_DATA_DIRECTORY | каталог_данных | каталог данных, в котором хранятся индекс и журналы Raft |
--mapping-файл | BLAST_MAPPING_FILE | файл_сопоставления | путь к файлу сопоставления индекса |
--peer-grpc-адрес | BLAST_PEER_GRPC_ADDRESS | Peer_grpc_address | адрес прослушивания существующего сервера gRPC в присоединяющемся кластере |
--certificate-file | BLAST_CERTIFICATE_FILE | файл_сертификата | путь к файлу сертификата TLS клиентского сервера |
--key-файл | BLAST_KEY_FILE | ключевой_файл | путь к файлу ключей TLS клиентского сервера |
--common-name | BLAST_COMMON_NAME | общее_имя | общее имя сертификата |
--cors-allowed-методы | 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 (например: тип контента, x-some-key) |
--уровень журнала | BLAST_LOG_LEVEL | уровень_журнала | уровень журнала |
--log-файл | BLAST_LOG_FILE | файл_журнала | файл журнала |
--log-max-size | 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 | 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 .
Также предоставляет следующие API REST
Эта конечная точка всегда возвращает 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, уже зарегистрированный в docker.io, например:
$ docker pull mosuka/blast:latest
См. https://hub.docker.com/r/mosuka/blast/tags/.
Запуск узла данных Blast в Docker. Запустите узел 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 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
Вы можете получить доступ к кластеру, добавив флаг, например, с помощью следующей команды:
$ ./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 .