it-swarm.com.de

Wie verwende ich Elasticsearch mit MongoDB?

Ich habe viele Blogs und Websites zum Konfigurieren von Elasticsearch für MongoDB durchlaufen, um Collections in MongoDB zu indizieren, aber keines davon war einfach.

Bitte erläutern Sie mir einen schrittweisen Prozess für die Installation von elasticsearch, der Folgendes umfassen sollte:

  • aufbau 
  • im Browser ausführen

Ich verwende Node.js mit express.js, bitte helfen Sie dementsprechend.

114
bibin david

Diese Antwort sollte ausreichend sein, um Sie mit diesem Tutorial zum Erstellen einer funktionalen Suchkomponente mit MongoDB, Elasticsearch und AngularJS vertraut zu machen.

Wenn Sie eine facettierte Suche mit Daten aus einer API verwenden möchten, sollten Sie sich Matthiasn's BirdWatch Repo ansehen.

So können Sie einen Elasticearch-Cluster mit einem einzelnen Knoten einrichten, um MongoDB für die Verwendung in einer NodeJS, Express-App in einer neuen Instanz von EC2 Ubuntu 14.04 zu indizieren.

Stellen Sie sicher, dass alles auf dem neuesten Stand ist.

Sudo apt-get update

Installieren Sie NodeJS.

Sudo apt-get install nodejs
Sudo apt-get install npm

MongoDB installieren - Diese Schritte stammen direkt aus den MongoDB-Dokumenten .. Wählen Sie die Version aus, mit der Sie sich wohl fühlen. Ich halte an v2.4.9, weil es scheint, dass die aktuellste Version MongoDB-River ohne Probleme unterstützt.

Importieren Sie den öffentlichen GPG-Schlüssel von MongoDB.

Sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

Aktualisieren Sie Ihre Quellenliste.

echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | Sudo tee /etc/apt/sources.list.d/mongodb.list

Holen Sie sich das 10gen-Paket.

Sudo apt-get install mongodb-10gen

Dann wählen Sie Ihre Version, wenn Sie nicht die aktuellste Version wünschen. Wenn Sie Ihre Umgebung auf einem Windows 7- oder 8-Computer einrichten, halten Sie sich von Version 2.6 fern, bis einige Probleme mit der Ausführung als Dienst behoben werden.

apt-get install mongodb-10gen=2.4.9

Verhindern Sie, dass die Version Ihrer MongoDB-Installation beim Update hochgefahren wird.

echo "mongodb-10gen hold" | Sudo dpkg --set-selections

Starten Sie den MongoDB-Dienst.

Sudo service mongodb start

Ihre Datenbankdateien sind standardmäßig/var/lib/mongo und Ihre Protokolldateien/var/log/mongo.

Erstellen Sie eine Datenbank über die Mongo-Shell und schieben Sie einige Dummy-Daten hinein.

mongo YOUR_DATABASE_NAME
db.createCollection(YOUR_COLLECTION_NAME)
for (var i = 1; i <= 25; i++) db.YOUR_COLLECTION_NAME.insert( { x : i } )

Jetzt in Konvertieren Sie die eigenständige MongoDB in ein Replikatset .

Zuerst den Prozess herunterfahren.

mongo YOUR_DATABASE_NAME
use admin
db.shutdownServer()

Jetzt führen wir MongoDB als Dienst aus. Daher übergeben wir die Option "--replSet rs0" im Befehlszeilenargument nicht, wenn der Mongod-Prozess neu gestartet wird. Stattdessen legen wir es in die Datei mongod.conf.

vi /etc/mongod.conf

Fügen Sie diese Zeilen hinzu und geben Sie Ihre Datenbank- und Protokollpfade ein.

replSet=rs0
dbpath=YOUR_PATH_TO_DATA/DB
logpath=YOUR_PATH_TO_LOG/MONGO.LOG

Öffnen Sie nun die Mongo-Shell erneut, um den Replikatsatz zu initialisieren.

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.

Installieren Sie jetzt Elasticsearch. Ich verfolge gerade diese hilfreichen Gist .

Stellen Sie sicher, dass Java installiert ist.

Sudo apt-get install openjdk-7-jre-headless -y

Bleib bei v1.1.x, bis der Bug des Mongo-River Plugins in v1.2.1 behoben wurde.

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

Stellen Sie sicher, dass in /etc/elasticsearch/elasticsearch.yml die folgenden Konfigurationsoptionen aktiviert sind, wenn Sie jetzt nur auf einem einzelnen Knoten entwickeln:

cluster.name: "MY_CLUSTER_NAME"
node.local: true

Starten Sie den Elasticsearch-Dienst.

Sudo service elasticsearch start

Überprüfen Sie, ob es funktioniert.

curl http://localhost:9200

Wenn Sie so etwas sehen, sind Sie gut.

{
  "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"
}

Installieren Sie nun die Elasticsearch-Plugins, um mit MongoDB zu spielen.

bin/plugin --install com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/1.6.0
bin/plugin --install elasticsearch/elasticsearch-mapper-attachments/1.6.0

Diese beiden Plugins sind nicht erforderlich, aber sie eignen sich zum Testen von Abfragen und zum Visualisieren von Änderungen an Ihren Indizes.

bin/plugin --install mobz/elasticsearch-head
bin/plugin --install lukas-vlcek/bigdesk

Starten Sie Elasticsearch neu.

Sudo service elasticsearch restart

Schließlich eine Sammlung von MongoDB indizieren.

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"
  }
}'

Überprüfen Sie, ob sich Ihr Index in Elasticsearch befindet

curl -XGET http://localhost:9200/_aliases

Überprüfen Sie den Clusterzustand.

curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'

Es ist wahrscheinlich gelb mit einigen nicht zugewiesenen Scherben. Wir müssen Elasticsearch sagen, womit wir arbeiten wollen.

curl -XPUT 'localhost:9200/_settings' -d '{ "index" : { "number_of_replicas" : 0 } }'

Überprüfen Sie den Clusterzustand erneut. Es sollte jetzt grün sein.

curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'

Geh spielen.

257
Donald Gary

Die Verwendung von River kann zu Problemen führen, wenn sich Ihre Operation vergrößert. River benötigt bei starkem Betrieb eine Menge Speicher. Ich empfehle, eigene Elasticsearch-Modelle zu implementieren, oder wenn Sie Moose verwenden, können Sie Ihre Elasticsearch-Modelle direkt darin integrieren oder mongoosastic verwenden, was dies im Wesentlichen für Sie tut.

Ein weiterer Nachteil von Mongodb River ist, dass Sie mit dem Zweig mongodb 2.4.x und ElasticSearch 0.90.x stecken bleiben. Sie werden feststellen, dass Sie viele wirklich schöne Funktionen verpassen, und das Mongodb River-Projekt erzeugt einfach kein brauchbares Produkt, um stabil zu bleiben. Der Mongodb River ist definitiv nicht etwas, mit dem ich in Produktion gehen würde. Es stellte mehr Probleme dar als es wert war. Unter schwerer Last wird das Schreiben zufällig fallen gelassen, es wird viel Speicher verbraucht, und es gibt keine Einstellung, um dies zu begrenzen. Darüber hinaus aktualisiert river nicht in Echtzeit, es liest Oplogs von mongodb und dies kann Aktualisierungen nach meiner Erfahrung um 5 Minuten verzögern.

Wir mussten kürzlich einen großen Teil unseres Projekts umschreiben, da es ein wöchentlicher Vorfall ist, dass mit ElasticSearch etwas schief geht. Wir waren sogar so weit gegangen, einen Dev Ops-Berater zu engagieren, der auch zustimmt, dass es das Beste ist, sich von River zu entfernen.

UPDATE: Elasticsearch-mongodb-river unterstützt jetzt ES v1.4.0 und mongodb v2.6.x. Bei umfangreichen Einfüge-/Aktualisierungsvorgängen treten jedoch wahrscheinlich Performance-Probleme auf, da dieses Plugin versucht, die Oplogs von mongodb für die Synchronisierung zu lesen. Wenn die Sperre (oder die Verriegelung) entsperrt wird, gibt es viele Operationen, und der Elasticsearch-Server weist eine extrem hohe Speicherauslastung auf. Wenn Sie eine große Operation planen, ist River keine gute Option. Die Entwickler von ElasticSearch empfehlen weiterhin, dass Sie Ihre eigenen Indizes verwalten, indem Sie direkt mit ihrer API über die Clientbibliothek für Ihre Sprache kommunizieren, anstatt River zu verwenden. Dies ist nicht wirklich der Zweck des Flusses. Twitter-Fluss ist ein großartiges Beispiel dafür, wie Fluss verwendet werden sollte. Dies ist im Wesentlichen eine großartige Möglichkeit, Daten aus externen Quellen zu beziehen, ist jedoch bei hohem Datenverkehr oder interner Verwendung nicht sehr zuverlässig.

Bedenken Sie auch, dass der Mongodb-River in seiner Version hinterherhinkt, da er nicht von der ElasticSearch Organization unterhalten wird, sondern von einem Drittanbieter. Die Entwicklung war nach der Veröffentlichung von v1.0 lange Zeit auf Version 0.00 geblieben, und als eine Version für Version 1.0 veröffentlicht wurde, war sie erst stabil, wenn elasticsearch v1.3.0 veröffentlicht wurde. Mongodb-Versionen fallen ebenfalls zurück. Wenn Sie nach einer späteren Version suchen, sind Sie möglicherweise in einer angespannten Lage, insbesondere bei ElasticSearch, das sich in einer so schweren Entwicklung befindet und viele erwartete Funktionen auf dem Weg sind. Es war sehr wichtig, immer auf dem neuesten Stand von ElasticSearch zu bleiben, denn wir sind sehr darauf angewiesen, die Suchfunktion ständig zu verbessern, da dies ein zentraler Bestandteil unseres Produkts ist.

Alles in allem erhalten Sie wahrscheinlich ein besseres Produkt, wenn Sie es selbst tun. Es ist nicht so schwer. Es handelt sich lediglich um eine weitere Datenbank, die in Ihrem Code verwaltet werden kann. Sie kann problemlos in Ihre vorhandenen Modelle eingefügt werden, ohne dass größere Änderungen erforderlich werden.

33
tsturzl

Ich fand den Mongo-Connector nützlich. Es handelt sich um Mongo Labs (MongoDB Inc.) und kann jetzt mit Elasticsearch 2.x verwendet werden

Elastic 2.x-Dokumentmanager: https://github.com/mongodb-labs/elastic2-doc-manager

mongo-Connector erstellt eine Pipeline von einem MongoDB-Cluster zu einem oder mehreren Zielsystemen wie Solr, Elasticsearch oder einem anderen MongoDB-Cluster. Die Daten werden in MongoDB mit dem Ziel synchronisiert und anschließend mit dem MongoDB-Oplog verbunden, um die Vorgänge in MongoDB in Echtzeit zu verfolgen. Es wurde mit Python 2.6, 2.7 und 3.3+ getestet. Ausführliche Dokumentation ist im Wiki verfügbar.

https://github.com/mongodb-labs/mongo-connectorhttps://github.com/mongodb-labs/mongo-connector/wiki/Usage%20with%20ElasticSearch

4

Hier erfahren Sie, wie Sie dies auf mongodb 3.0 tun. Ich habe dieses Nice Blog verwendet

  1. Installieren Sie Mongodb.
  2. Datenverzeichnisse erstellen:
$ mkdir RANDOM_PATH/node1
$ mkdir RANDOM_PATH/node2> 
$ mkdir RANDOM_PATH/node3
  1. Mongod-Instanzen starten
$ mongod --replSet test --port 27021 --dbpath node1
$ mongod --replSet test --port 27022 --dbpath node2
$ mongod --replSet test --port 27023 --dbpath node3
  1. Konfigurieren Sie das Replikatset:
$ mongo
config = {_id: 'test', members: [ {_id: 0, Host: 'localhost:27021'}, {_id: 1, Host: 'localhost:27022'}]};    
rs.initiate(config);
  1. Elasticsearch installieren: 
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. Installation und Konfiguration des MongoDB River:

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

$ bin/plugin --install elasticsearch/elasticsearch-mapper-attachments

  1. Erstellen Sie den "Fluss" und den Index:

curl -XPUT ' http: // localhost: 8080/_river/mongodb/_meta ' -d '{ "type": "mongodb", "mongodb": { "db": "mydb", "collection": "foo" }, "Index": { "Name Name", "type": "zufällig" } } '

  1. Test im Browser: 

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

2

Da der Mongo-Connector jetzt als tot erscheint, hat sich mein Unternehmen entschieden, ein Werkzeug für die Verwendung von Mongo-Änderungsströmen für die Ausgabe an Elasticsearch zu entwickeln.

Unsere ersten Ergebnisse sehen vielversprechend aus. Sie können es unter https://github.com/everyone-counts/mongo-stream ausprobieren. Wir sind noch in der Entwicklung und würden uns über Anregungen oder Beiträge freuen.

1
Jud

Hier habe ich eine weitere gute Option gefunden, um Ihre MongoDB-Daten zu Elasticsearch zu migrieren. Ein go-Dämon, der mongodb mit Elasticsearch in Echtzeit synchronisiert .. Es ist der Monstache. Erhältlich bei: Monstache

Unter dem anfänglichen Setp, um es zu konfigurieren und zu verwenden.

Schritt 1:

C:\Program Files\MongoDB\Server\4.0\bin>mongod --smallfiles --oplogSize 50 --replSet test

Schritt 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>

Schritt 3: Überprüfen Sie die Replikation.

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>

Schritt 4. Laden Sie die Datei " https://github.com/rwynn/monstache/releases " ..__ herunter. Entpacken Sie den Download, und passen Sie Ihre PATH-Variable an, um den Pfad zu dem Ordner für Ihre Plattform einzuschließen. Gehen Sie zu cmd und geben Sie "monstache -v".__ ein. # 4.13.1 Monstache verwendet das TOML-Format für die Konfiguration. Konfigurieren Sie die Datei für die Migration mit dem Namen config.toml

Schritt 5 

Mein 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

Schritt 6.

D:\15-1-19>monstache -f config.toml

 Monstache Running...

 Confirm Migrated Data at Elasticsearch

 Add Record at Mongo

 Monstache Captured the event and migrate the data to elasticsearch

0

River ist eine gute Lösung, wenn Sie eine Synchronisation in Echtzeit und eine allgemeine Lösung wünschen.

Wenn Sie bereits Daten in MongoDB haben und diese sehr einfach an Elasticsearch wie "one-shot" senden möchten, können Sie mein Paket in Node.js https://github.com/itemsapi/elasticbulk ausprobieren. 

Es werden Node.js-Streams verwendet, sodass Sie Daten aus allen Streams (z. B. MongoDB, PostgreSQL, MySQL, JSON-Dateien usw.) importieren können.

Beispiel für MongoDB zu Elasticsearch:

Pakete installieren:

npm install elasticbulk
npm install mongoose
npm install bluebird

Skript erstellen, also 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');
})

Versenden Sie Ihre Daten:

node script.js

Es ist nicht extrem schnell, funktioniert aber für Millionen von Datensätzen (dank Streams).

0
Mateusz Rzepa