لم يتم الحفاظ على هذا المشروع لفترة طويلة.
Blast عبارة عن خادم للبحث عن النص الكامل وفهرسته مكتوب بلغة Go ومبني فوق Bleve.
يوفر وظائف من خلال gRPC (HTTP/2 + Protocol Buffers) أو 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 | تمكين كاشف اللغة المضغوط |
kagome | 0 | تمكين محلل اللغة اليابانية |
وحدة العناية المركزة | 1 | تمكين رمز ICU، ومحلل اللغة التايلاندية |
libstemmer | 1 | تمكين Stemmer اللغة (الدنماركية، الألمانية، الإنجليزية، الإسبانية، الفنلندية، الفرنسية، المجرية، الإيطالية، الهولندية، النرويجية، البرتغالية، الرومانية، الروسية، السويدية، التركية) |
إذا كنت تريد تمكين الميزة التي يكون CGO_ENABLE
فيها هو 1
، فيرجى تثبيتها بالرجوع إلى قسم تثبيت تبعيات البناء أعلاه.
يمكنك رؤية الملف الثنائي عند نجاح الإنشاء كما يلي:
$ ls ./bin
blast
إذا كنت تريد اختبار تغييراتك، قم بتشغيل الأمر كما يلي:
$ make test
إذا كنت تريد تحديد النظام الأساسي المستهدف، فقم بتعيين متغيرات البيئة GOOS
و GOARCH
بنفس طريقة إنشاء build.gradle.
لإنشاء حزمة توزيع، قم بتشغيل الأمر التالي:
$ make dist
يمكن لـ Blast تغيير خيارات بدء التشغيل باستخدام ملفات التكوين ومتغيرات البيئة ووسائط سطر الأوامر.
راجع الجدول التالي للتعرف على الخيارات التي يمكن تهيئتها.
علم CLI | متغير البيئة | ملف التكوين | وصف |
---|---|---|---|
--ملف التكوين | - | - | ملف التكوين. إذا تم حذفه، فسيتم البحث فيblast.yaml في /etc والدليل الرئيسي |
--بطاقة تعريف | BLAST_ID | بطاقة تعريف | معرف العقدة |
--عنوان الطوافة | BLAST_RAFT_ADDRESS | raft_address | عنوان الاستماع لخادم الطوافة |
--grpc-address | BLAST_GRPC_ADDRESS | grpc_address | عنوان الاستماع لخادم gRPC |
--عنوان http | BLAST_HTTP_ADDRESS | http_address | عنوان الاستماع لخادم HTTP |
--دليل البيانات | BLAST_DATA_DIRECTORY | data_directory | دليل البيانات الذي يقوم بتخزين الفهرس وسجلات الطوافة |
--mapping-file | BLAST_MAPPING_FILE | mapping_file | المسار إلى ملف تعيين الفهرس |
--peer-grpc-address | BLAST_PEER_GRPC_ADDRESS | Peer_grpc_address | الاستماع إلى عنوان خادم gRPC الموجود في مجموعة الانضمام |
--ملف الشهادة | BLAST_CERTIFICATE_FILE | ملف_الشهادة | المسار إلى ملف شهادة TLS لخادم العميل |
--مفتاح الملف | BLAST_KEY_FILE | key_file | المسار إلى ملف مفتاح TLS لخادم العميل |
--الاسم الشائع | BLAST_COMMON_NAME | 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 | log_level | مستوى السجل |
--ملف السجل | BLAST_LOG_FILE | 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 .
يوفر أيضًا واجهات برمجة تطبيقات 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
الانفجار من السهل طرح الكتلة. العقدة قيد التشغيل بالفعل، ولكن هذا لا يسمح بالتسامح مع الأخطاء. إذا كنت بحاجة إلى زيادة التسامح مع الخطأ، فاعرض عقدتي بيانات إضافيتين كما يلي:
$ ./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 عقدة. بهذه الطريقة يمكنك تحمل فشل عقدة واحدة. يمكنك التحقق من المجموعة باستخدام الأمر التالي:
$ ./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 "
}
}
يوصي بثلاثة أو أكثر من عدد فردي من العقد في المجموعة. في سيناريوهات الفشل، يكون فقدان البيانات أمرًا لا مفر منه، لذا تجنب نشر العقد الفردية.
في المثال أعلاه، تنضم العقدة إلى المجموعة عند بدء التشغيل، ولكن يمكنك أيضًا ضم العقدة التي بدأت بالفعل في الوضع المستقل إلى المجموعة لاحقًا، كما يلي:
$ ./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/
تشغيل عقدة بيانات الانفجار على Docker. ابدأ عقدة الانفجار هكذا:
$ 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، مما يضمن تشفير كافة الاتصالات بين العملاء والمجموعة.
إحدى الطرق لتوليد الموارد اللازمة هي عبر opensl. على سبيل المثال:
$ 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 .