답변:
이 답변은 MongoDB, Elasticsearch 및 AngularJS를 사용하여 기능 검색 컴포넌트 빌드에 대한 이 학습서를 따르도록 설정하기에 충분해야합니다 .
API의 데이터로 패싯 검색을 사용하려는 경우 Matthiasn의 BirdWatch Repo가보고 싶을 것입니다.
다음은 새로운 EC2 Ubuntu 14.04 인스턴스의 NodeJS, Express 앱에서 사용하기 위해 MongoDB를 인덱싱하도록 단일 노드 Elasticsearch "cluster"를 설정하는 방법입니다.
모든 것이 최신인지 확인하십시오.
sudo apt-get update
NodeJS를 설치하십시오.
sudo apt-get install nodejs
sudo apt-get install npm
MongoDB 설치 -이 단계는 MongoDB 문서에서 간단합니다. 편안한 버전을 선택하십시오. v2.4.9를 고수하고 있습니다 .MongoDB -River 가 문제없이 지원하는 최신 버전 인 것 같습니다 .
MongoDB 공개 GPG 키를 가져옵니다.
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
소스 목록을 업데이트하십시오.
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
10gen 패키지를 받으십시오.
sudo apt-get install mongodb-10gen
최신 버전을 원하지 않으면 버전을 선택하십시오. Windows 7 또는 8 시스템에서 환경을 설정하는 경우 서비스로 실행할 때 버그가 발생할 때까지 v2.6에서 멀리 떨어져 있습니다.
apt-get install mongodb-10gen=2.4.9
업데이트 할 때 MongoDB 설치 버전이 충돌하지 않도록하십시오.
echo "mongodb-10gen hold" | sudo dpkg --set-selections
MongoDB 서비스를 시작하십시오.
sudo service mongodb start
데이터베이스 파일의 기본값은 / var / lib / mongo이고 로그 파일은 / var / log / mongo입니다.
mongo 쉘을 통해 데이터베이스를 작성하고 더미 데이터를 푸시하십시오.
mongo YOUR_DATABASE_NAME
db.createCollection(YOUR_COLLECTION_NAME)
for (var i = 1; i <= 25; i++) db.YOUR_COLLECTION_NAME.insert( { x : i } )
이제 독립형 MongoDB를 복제 세트로 변환합니다 .
먼저 프로세스를 종료하십시오.
mongo YOUR_DATABASE_NAME
use admin
db.shutdownServer()
이제 MongoDB를 서비스로 실행하고 있으므로 mongod 프로세스를 다시 시작할 때 명령 행 인수의 "--replSet rs0"옵션을 전달하지 않습니다. 대신 mongod.conf 파일에 넣습니다.
vi /etc/mongod.conf
이 줄을 추가하여 db 및 로그 경로를 지정하십시오.
replSet=rs0
dbpath=YOUR_PATH_TO_DATA/DB
logpath=YOUR_PATH_TO_LOG/MONGO.LOG
이제 mongo 쉘을 다시 열어 복제 세트를 초기화하십시오.
mongo DATABASE_NAME
config = { "_id" : "rs0", "members" : [ { "_id" : 0, "host" : "127.0.0.1:27017" } ] }
rs.initiate(config)
rs.slaveOk() // allows read operations to run on secondary members.
이제 Elasticsearch를 설치하십시오. 이 유용한 Gist를 따르고 있습니다.
Java가 설치되어 있는지 확인하십시오.
sudo apt-get install openjdk-7-jre-headless -y
Mongo-River 플러그인 버그가 v1.2.1에서 수정 될 때까지 v1.1.x를 사용하십시오.
wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.1.1.deb
sudo dpkg -i elasticsearch-1.1.1.deb
curl -L http://github.com/elasticsearch/elasticsearch-servicewrapper/tarball/master | tar -xz
sudo mv *servicewrapper*/service /usr/local/share/elasticsearch/bin/
sudo rm -Rf *servicewrapper*
sudo /usr/local/share/elasticsearch/bin/service/elasticsearch install
sudo ln -s `readlink -f /usr/local/share/elasticsearch/bin/service/elasticsearch` /usr/local/bin/rcelasticsearch
현재 단일 노드에서만 개발중인 경우 /etc/elasticsearch/elasticsearch.yml에 다음 구성 옵션이 활성화되어 있는지 확인하십시오.
cluster.name: "MY_CLUSTER_NAME"
node.local: true
Elasticsearch 서비스를 시작하십시오.
sudo service elasticsearch start
작동하는지 확인하십시오.
curl http://localhost:9200
이와 같은 것을 본다면 좋습니다.
{
"status" : 200,
"name" : "Chi Demon",
"version" : {
"number" : "1.1.2",
"build_hash" : "e511f7b28b77c4d99175905fac65bffbf4c80cf7",
"build_timestamp" : "2014-05-22T12:27:39Z",
"build_snapshot" : false,
"lucene_version" : "4.7"
},
"tagline" : "You Know, for Search"
}
이제 Elasticsearch 플러그인을 설치하여 MongoDB와 함께 재생할 수 있습니다.
bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/1.6.0
bin/plugin --install elasticsearch/elasticsearch-mapper-attachments/1.6.0
이 두 플러그인은 필요하지 않지만 쿼리를 테스트하고 색인 변경 사항을 시각화하는 데 유용합니다.
bin/plugin --install mobz/elasticsearch-head
bin/plugin --install lukas-vlcek/bigdesk
Elasticsearch를 다시 시작하십시오.
sudo service elasticsearch restart
마지막으로 MongoDB에서 컬렉션을 인덱싱하십시오.
curl -XPUT localhost:9200/_river/DATABASE_NAME/_meta -d '{
"type": "mongodb",
"mongodb": {
"servers": [
{ "host": "127.0.0.1", "port": 27017 }
],
"db": "DATABASE_NAME",
"collection": "ACTUAL_COLLECTION_NAME",
"options": { "secondary_read_preference": true },
"gridfs": false
},
"index": {
"name": "ARBITRARY INDEX NAME",
"type": "ARBITRARY TYPE NAME"
}
}'
인덱스가 Elasticsearch에 있는지 확인
curl -XGET http://localhost:9200/_aliases
클러스터 상태를 확인하십시오.
curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
할당되지 않은 샤드가있는 노란색 일 것입니다. 우리는 Elasticsearch에게 작업하고자하는 것을 알려 주어야합니다.
curl -XPUT 'localhost:9200/_settings' -d '{ "index" : { "number_of_replicas" : 0 } }'
클러스터 상태를 다시 확인하십시오. 이제 녹색이어야합니다.
curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
가서 놀아
강을 사용하면 작업 규모가 커질 때 문제가 발생할 수 있습니다. 리버는 무거운 작업을 할 때 많은 메모리를 사용합니다. 자체 탄성 검색 모델을 구현하는 것이 좋습니다. 몽구스를 사용하는 경우 바로 탄성 검색 모델을 만들거나 기본적으로이를 수행 하는 몽 고사 스틱 을 사용할 수 있습니다.
Mongodb River의 또 다른 단점은 mongodb 2.4.x 브랜치와 ElasticSearch 0.90.x를 사용한다는 것입니다. 당신은 정말 멋진 기능을 많이 놓치고 있음을 알게 될 것입니다. mongodb river 프로젝트는 안정을 유지할만큼 충분히 유용한 제품을 생산하지 않습니다. Mongodb River는 분명히 제가 제작에 참여한 것이 아닙니다. 그것은 가치보다 더 많은 문제를 제기했습니다. 과부하가 걸리면 쓰기가 임의로 중단되고 많은 메모리가 소비되며이를 제한 할 설정이 없습니다. 또한 강은 실시간으로 업데이트되지 않고 mongodb의 oplog를 읽으며 내 경험에서 5 분 동안 업데이트를 지연시킬 수 있습니다.
우리는 최근 프로젝트의 많은 부분을 다시 작성해야했습니다. 매주 ElasticSearch에 문제가 발생했기 때문입니다. 우리는 Dev Ops 컨설턴트를 고용하기까지했으며, 또한 리버에서 멀어 지도록 최선을 다한다는 데 동의합니다.
최신 정보: Elasticsearch-mongodb-river는 이제 ES v1.4.0 및 mongodb v2.6.x를 지원합니다. 그러나이 플러그인은 mongodb의 oplog를 동기화하려고 시도하므로 대량 삽입 / 업데이트 작업에서 여전히 성능 문제가 발생할 수 있습니다. 잠금 (또는 래치) 잠금이 해제 된 후 많은 작업이있는 경우 elasticsearch 서버에서 메모리 사용량이 매우 높다는 것을 알 수 있습니다. 대규모 운영을 계획하고 있다면 강은 좋은 선택이 아닙니다. ElasticSearch 개발자는 여전히 리버를 사용하지 않고 언어에 대한 클라이언트 라이브러리를 사용하여 API와 직접 통신하여 자체 인덱스를 관리 할 것을 권장합니다. 이것은 실제로 강의 목적이 아닙니다. Twitter-river는 강을 사용하는 방법의 좋은 예입니다. 본질적으로 외부 소스에서 데이터를 소스로 만드는 훌륭한 방법입니다.
또한 mongodb-river는 ElasticSearch Organization에서 유지 관리하지 않고 타사에서 유지 관리하기 때문에 버전이 뒤떨어 짐을 고려하십시오. v1.0이 출시 된 후 오랫동안 v0.90 브랜치에서 개발이 중단되었으며 v1.0 용 버전이 출시되었을 때 elasticsearch가 v1.3.0을 출시 할 때까지 안정적이지 않았습니다. Mongodb 버전도 뒤쳐집니다. 개발이 매우 까다로운 ElasticSearch를 사용하는 경우 이후 버전으로 이동하려고 할 때 많은 어려움을 겪을 수 있습니다. 검색 기능을 제품의 핵심 부분으로 지속적으로 개선하는 데 크게 의존하기 때문에 최신 ElasticSearch를 유지하는 것이 매우 중요했습니다.
당신이 직접한다면 더 좋은 제품을 얻게 될 것입니다. 그렇게 어렵지 않습니다. 코드에서 관리 할 수있는 또 하나의 데이터베이스 일뿐 아니라 주요 리팩토링없이 기존 모델로 쉽게 드롭 할 수 있습니다.
not_analyzed
. 그렇지 않으면 쿼리에 문제가 발생하고 분석 된 필드가 토큰 화되는 방식으로 수행됩니다.
mongo-connector가 유용하다는 것을 알았습니다. Mongo Labs (MongoDB Inc.) 형식이며 Elasticsearch 2.x와 함께 사용할 수 있습니다.
Elastic 2.x 문서 관리자 : https://github.com/mongodb-labs/elastic2-doc-manager
mongo-connector는 MongoDB 클러스터에서 Solr, Elasticsearch 또는 다른 MongoDB 클러스터와 같은 하나 이상의 대상 시스템으로 파이프 라인을 만듭니다. MongoDB의 데이터를 대상에 동기화 한 다음 MongoDB oplog를 확장하여 MongoDB의 작업을 실시간으로 유지합니다. Python 2.6, 2.7 및 3.3+에서 테스트되었습니다. 자세한 문서는 위키에서 제공됩니다.
https://github.com/mongodb-labs/mongo-connector https://github.com/mongodb-labs/mongo-connector/wiki/Usage%20with%20ElasticSearch
River는 거의 실시간 동기화 및 일반 솔루션을 원하면 좋은 솔루션입니다.
MongoDB에 이미 데이터가 있고 "원샷"과 같이 Elasticsearch에 매우 쉽게 전달하려면 Node.js https://github.com/itemsapi/elasticbulk 에서 내 패키지를 사용해보십시오 .
Node.js 스트림을 사용하므로 스트림을 지원하는 모든 것 (예 : MongoDB, PostgreSQL, MySQL, JSON 파일 등)에서 데이터를 가져올 수 있습니다
MongoDB에서 Elasticsearch 로의 예 :
패키지 설치 :
npm install elasticbulk
npm install mongoose
npm install bluebird
스크립트를 작성하십시오. script.js :
const elasticbulk = require('elasticbulk');
const mongoose = require('mongoose');
const Promise = require('bluebird');
mongoose.connect('mongodb://localhost/your_database_name', {
useMongoClient: true
});
mongoose.Promise = Promise;
var Page = mongoose.model('Page', new mongoose.Schema({
title: String,
categories: Array
}), 'your_collection_name');
// stream query
var stream = Page.find({
}, {title: 1, _id: 0, categories: 1}).limit(1500000).skip(0).batchSize(500).stream();
elasticbulk.import(stream, {
index: 'my_index_name',
type: 'my_type_name',
host: 'localhost:9200',
})
.then(function(res) {
console.log('Importing finished');
})
데이터를 배송하십시오 :
node script.js
매우 빠르지는 않지만 수백만 개의 레코드 (스트리밍 덕분에)에서 작동합니다.
mongodb 3.0에서이를 수행하는 방법은 다음과 같습니다. 이 멋진 블로그를 사용했습니다
$ mkdir RANDOM_PATH/node1 $ mkdir RANDOM_PATH/node2> $ mkdir RANDOM_PATH/node3
$ mongod --replSet test --port 27021 --dbpath node1 $ mongod --replSet test --port 27022 --dbpath node2 $ mongod --replSet test --port 27023 --dbpath node3
$ mongo config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]}; rs.initiate(config);
a. Download and unzip the [latest Elasticsearch][2] distribution b. Run bin/elasticsearch to start the es server. c. Run curl -XGET http://localhost:9200/ to confirm it is working.
$ bin / plugin --install com.github.richardwilly98.elasticsearch / elasticsearch-river-mongodb
$ bin / plugin-elasticsearch / elasticsearch-mapper-attachments 설치
curl -XPUT ' http : // localhost : 8080 / _river / mongodb / _meta'- d '{ "type": "mongodb", "mongodb": { "db": "mydb", "collection": "foo" }, "index": { "name": "name", "type": "random"}} '
브라우저에서 테스트하십시오.
여기서 MongoDB 데이터를 Elasticsearch로 마이그레이션하는 또 다른 좋은 옵션을 찾았습니다. mongodb를 elasticsearch와 실시간으로 동기화하는 go 데몬입니다. 그 Montstache입니다. 사용 가능 : Monstache
초기 setp 아래에서 설정하고 사용하십시오.
1 단계:
C:\Program Files\MongoDB\Server\4.0\bin>mongod --smallfiles --oplogSize 50 --replSet test
2 단계 :
C:\Program Files\MongoDB\Server\4.0\bin>mongo
C:\Program Files\MongoDB\Server\4.0\bin>mongo
MongoDB shell version v4.0.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.2
Server has startup warnings:
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten]
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten]
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** WARNING: This server is bound to localhost.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** Remote systems will be unable to connect to this server.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** Start the server with --bind_ip <address> to specify which IP
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** addresses it should serve responses from, or with --bind_ip_all to
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** bind to all interfaces. If this behavior is desired, start the
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten] ** server with --bind_ip 127.0.0.1 to disable this warning.
2019-01-18T16:56:44.931+0530 I CONTROL [initandlisten]
MongoDB Enterprise test:PRIMARY>
3 단계 : 복제를 확인합니다.
MongoDB Enterprise test:PRIMARY> rs.status();
{
"set" : "test",
"date" : ISODate("2019-01-18T11:39:00.380Z"),
"myState" : 1,
"term" : NumberLong(2),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
},
"appliedOpTime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
}
},
"lastStableCheckpointTimestamp" : Timestamp(1547811517, 1),
"members" : [
{
"_id" : 0,
"name" : "localhost:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 736,
"optime" : {
"ts" : Timestamp(1547811537, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2019-01-18T11:38:57Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1547810805, 1),
"electionDate" : ISODate("2019-01-18T11:26:45Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
}
],
"ok" : 1,
"operationTime" : Timestamp(1547811537, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1547811537, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
MongoDB Enterprise test:PRIMARY>
단계 4. " https://github.com/rwynn/monstache/releases "를 다운로드하십시오 . 다운로드의 압축을 풀고 PATH 변수를 조정하여 플랫폼의 폴더 경로를 포함하십시오. cmd로 이동하고 "monstache -v"
# 4.13.1 을 입력 하십시오. Monstache는 구성에 TOML 형식을 사용합니다. config.toml이라는 마이그레이션을위한 파일 구성
5 단계.
내 config.toml->
mongo-url = "mongodb://127.0.0.1:27017/?replicaSet=test"
elasticsearch-urls = ["http://localhost:9200"]
direct-read-namespaces = [ "admin.users" ]
gzip = true
stats = true
index-stats = true
elasticsearch-max-conns = 4
elasticsearch-max-seconds = 5
elasticsearch-max-bytes = 8000000
dropped-collections = false
dropped-databases = false
resume = true
resume-write-unsafe = true
resume-name = "default"
index-files = false
file-highlighting = false
verbose = true
exit-after-direct-reads = false
index-as-update=true
index-oplog-time=true
단계 6.
D:\15-1-19>monstache -f config.toml
mongo-connector가 이제 작동하지 않는 것처럼 보였으므로 회사는 Mongo 변경 스트림을 사용하여 Elasticsearch로 출력하는 도구를 작성하기로 결정했습니다.
우리의 초기 결과는 유망 해 보입니다. https://github.com/electionsexperts/mongo-stream 에서 확인할 수 있습니다 . 우리는 아직 개발 초기 단계에 있으며 제안이나 기여를 환영합니다.