이 프로젝트는 오랫동안 유지되지 않았습니다.
Blast는 Bleve 위에 구축된 Go로 작성된 전체 텍스트 검색 및 인덱싱 서버입니다.
gRPC(HTTP/2 + 프로토콜 버퍼) 또는 기존 RESTful API(HTTP/1.1 + JSON)를 통해 기능을 제공합니다.
Blast는 hashicorp/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 토크나이저, 태국어 분석기 활성화 |
libstemmer | 1 | 언어 형태소 분석기 활성화(덴마크어, 독일어, 영어, 스페인어, 핀란드어, 프랑스어, 헝가리어, 이탈리아어, 네덜란드어, 노르웨이어, 포르투갈어, 루마니아어, 러시아어, 스웨덴어, 터키어) |
CGO_ENABLE
이 1
인 기능을 활성화하려면 위의 빌드 종속성 설치 섹션을 참조하여 설치하세요.
다음과 같이 빌드가 성공하면 바이너리 파일을 볼 수 있습니다.
$ ls ./bin
blast
변경 사항을 테스트하려면 다음과 같은 명령을 실행하십시오.
$ make test
대상 플랫폼을 지정하려면 빌드와 동일하게 GOOS
, GOARCH
환경 변수를 설정합니다.
배포 패키지를 생성하려면 다음 명령을 실행하십시오.
$ make dist
Blast는 구성 파일, 환경 변수 및 명령줄 인수를 사용하여 시작 옵션을 변경할 수 있습니다.
구성할 수 있는 옵션은 다음 표를 참조하세요.
CLI 플래그 | 환경변수 | 구성 파일 | 설명 |
---|---|---|---|
--구성 파일 | - | - | 구성 파일. 생략하면 /etc 및 홈 디렉터리의 blast.yaml을 검색합니다. |
--ID | BLAST_ID | ID | 노드 ID |
--뗏목 주소 | BLAST_RAFT_ADDRESS | 뗏목_주소 | Raft 서버 수신 주소 |
--grpc 주소 | BLAST_GRPC_ADDRESS | grpc_address | gRPC 서버 수신 주소 |
--http-주소 | BLAST_HTTP_ADDRESS | http_주소 | HTTP 서버 수신 주소 |
--데이터 디렉토리 | BLAST_DATA_DIRECTORY | data_directory | 인덱스와 Raft 로그를 저장하는 데이터 디렉터리 |
--매핑 파일 | BLAST_MAPPING_FILE | 매핑_파일 | 인덱스 매핑 파일 경로 |
--peer-grpc-주소 | BLAST_PEER_GRPC_ADDRESS | Peer_grpc_address | 가입 클러스터에 있는 기존 gRPC 서버의 수신 주소 |
--인증서 파일 | BLAST_CERTIFICATE_FILE | 인증서_파일 | 클라이언트 서버 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 허용 헤더(예: content-type,x-some-key) |
--로그 수준 | BLAST_LOG_LEVEL | 로그레벨 | 로그 수준 |
--로그 파일 | BLAST_LOG_FILE | 로그 파일 | 로그 파일 |
--로그-최대-크기 | BLAST_LOG_MAX_SIZE | log_max_size | 로그 파일의 최대 크기(MB) |
--로그-최대-백업 | BLAST_LOG_MAX_BACKUPS | log_max_backups | 로그 파일의 최대 백업 수 |
--로그-최대-나이 | BLAST_LOG_MAX_AGE | 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 .
또는 다음 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 액세스를 지원하여 클라이언트와 클러스터 간의 모든 통신이 암호화되도록 보장합니다.
필요한 리소스를 생성하는 한 가지 방법은 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 .