MongoDB에서 Elasticsearch를 사용하는 방법은 무엇입니까?


152

MongoDB에서 Collection을 색인화하도록 Elasticsearch for MongoDB를 구성하는 방법에 대한 많은 블로그와 사이트를 살펴 보았지만 그 중 어느 것도 간단하지 않았습니다.

elasticsearch를 설치하기위한 단계별 프로세스를 설명해주세요.

  • 구성
  • 브라우저에서 실행

Express.js와 함께 Node.js를 사용하고 있으므로 적절하게 도와주세요.


4
참고 : 강은 사용되지 않습니다
압둘 코이 욤 장관

답변:


287

이 답변은 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'

가서 놀아


@ Duck5auce는 express.js로 결과 (탄력적 인 검색 결과)를 얻고 app.get ( 'search = "google"', function (req와 같은 jade 또는 ejs 템플릿을 사용하여 브라우저에 표시하는 방법)에 대한 아이디어가 있습니다. , res) {}); 훌륭한 답변에 감사드립니다
bibin david

@bibindavid이 리소스를 확인하겠습니다. 필터링 된 쿼리를 두 개의 다른 사용자 정의 모듈을 통해 푸시하는 서버 측 ES 클라이언트 모듈을 작성하는 과정을 안내합니다. 데이터 렌더링은 여전히 ​​클라이언트에서 처리되지만 적절한 시작점이되어야합니다. sahan.me/posts/dabbling-in-elasticsearch-part-2-with-nodejs Github 저장소는 다음 위치에 있습니다 : github.com/sahan/sahan.github.io/tree/master/resources/…
Donald Gary

더 나은 mongoosastic 또는 mongose ​​및 elasticsearch 모듈을 다르게 사용하는 방법을 알려줄 수 있습니까?
Sudhanshu Gaur

7
duck5auce의 탁월한 답변 이후 1 년이 지났습니다. 사람들이 현재 10gens [mongo-connector] [1]를 사용하여 MongoDB 클러스터를 ElasticSearch와 실시간으로 동기화하고 있다고 생각합니다. MongoDB oplog를 마무리합니다. [1] : github.com/10gen-labs/mongo-connector/wiki/…
Andrew Betts

8
@ duck5auce이 답변을 업데이트하십시오. 날짜가 지났습니다. 강은 더 이상 사용되지 않습니다
tsturzl

35

강을 사용하면 작업 규모가 커질 때 문제가 발생할 수 있습니다. 리버는 무거운 작업을 할 때 많은 메모리를 사용합니다. 자체 탄성 검색 모델을 구현하는 것이 좋습니다. 몽구스를 사용하는 경우 바로 탄성 검색 모델을 만들거나 기본적으로이를 수행 하는 몽 고사 스틱 을 사용할 수 있습니다.

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를 유지하는 것이 매우 중요했습니다.

당신이 직접한다면 더 좋은 제품을 얻게 될 것입니다. 그렇게 어렵지 않습니다. 코드에서 관리 할 수있는 또 하나의 데이터베이스 일뿐 아니라 주요 리팩토링없이 기존 모델로 쉽게 드롭 할 수 있습니다.


당신이 링크 나 출판물 저자는이 컬렉션에 링크 referenceone 및 referencemany를 통해 때문에 내가 게시 지수로, 즉 저자의 정보를 색인 할 수있는 조언이 있습니까
마르셀 Djaman



1
Elasticsearch는 관계형 데이터베이스가 아닌 문서 스토리지 DB입니다. Elasticsearch에서 데이터를 관련시키는 것은 불가능하지 않지만 비정규 화가 발생할 가능성이 높지만 추가 로직 (플러그인이 있음)으로 관리 할 수 ​​있습니다. 위의 링크에서 상태와 같이 데이터를 관련시키는 가장 일반적인 방법은 관련 문서에 ID 참조를 저장하는 것입니다. 이 ID를로 설정된 필드에 저장해야합니다 not_analyzed. 그렇지 않으면 쿼리에 문제가 발생하고 분석 된 필드가 토큰 화되는 방식으로 수행됩니다.
tsturzl

4

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


4

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

매우 빠르지는 않지만 수백만 개의 레코드 (스트리밍 덕분에)에서 작동합니다.


3

mongodb 3.0에서이를 수행하는 방법은 다음과 같습니다. 이 멋진 블로그를 사용했습니다

  1. mongodb를 설치하십시오.
  2. 데이터 디렉토리를 작성하십시오.
$ mkdir RANDOM_PATH/node1
$ mkdir RANDOM_PATH/node2> 
$ mkdir RANDOM_PATH/node3
  1. Mongod 인스턴스 시작
$ mongod --replSet test --port 27021 --dbpath node1
$ mongod --replSet test --port 27022 --dbpath node2
$ mongod --replSet test --port 27023 --dbpath node3
  1. 복제 세트를 구성하십시오.
$ mongo
config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]};    
rs.initiate(config);
  1. Elasticsearch 설치 :
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.
  1. MongoDB River 설치 및 구성 :

$ bin / plugin --install com.github.richardwilly98.elasticsearch / elasticsearch-river-mongodb

$ bin / plugin-elasticsearch / elasticsearch-mapper-attachments 설치

  1. "강"과 색인을 작성하십시오.

curl -XPUT ' http : // localhost : 8080 / _river / mongodb / _meta'- d '{ "type": "mongodb", "mongodb": { "db": "mydb", "collection": "foo" }, "index": { "name": "name", "type": "random"}} '

  1. 브라우저에서 테스트하십시오.

    http : // localhost : 9200 / _search? q = home


6
ElasticSearch는 리버 플러그인을 더 이상 사용하지 않습니다. 이것이 검색 색인을 유지하는 가장 좋은 방법은 아닙니다.
tsturzl

3

여기서 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

몬스타 치 러닝 ...

Elasticsearch에서 마이그레이션 된 데이터 확인

몽고에서 레코드 추가

Monstache 이벤트를 캡처하고 데이터를 elasticsearch로 마이그레이션


3

mongo-connector가 이제 작동하지 않는 것처럼 보였으므로 회사는 Mongo 변경 스트림을 사용하여 Elasticsearch로 출력하는 도구를 작성하기로 결정했습니다.

우리의 초기 결과는 유망 해 보입니다. https://github.com/electionsexperts/mongo-stream 에서 확인할 수 있습니다 . 우리는 아직 개발 초기 단계에 있으며 제안이나 기여를 환영합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.