Bagaimana cara menggunakan Elasticsearch dengan MongoDB?


152

Saya telah menelusuri banyak blog dan situs tentang mengonfigurasi Elasticsearch untuk MongoDB untuk mengindeks Koleksi di MongoDB tetapi tidak ada satupun yang langsung.

Tolong jelaskan kepada saya proses langkah demi langkah untuk menginstal elasticsearch, yang harus mencakup:

  • konfigurasi
  • dijalankan di browser

Saya menggunakan Node.js dengan express.js, jadi tolong bantu.


4
Catatan: Sungai tidak digunakan lagi
abdul qayyum

Jawaban:


287

Jawaban ini seharusnya cukup untuk membuat Anda mengatur untuk mengikuti tutorial ini tentang Membangun komponen pencarian fungsional dengan MongoDB, Elasticsearch, dan AngularJS .

Jika Anda ingin menggunakan pencarian faceted dengan data dari API maka Repo BirdWatch Matthiasn adalah sesuatu yang mungkin ingin Anda lihat.

Jadi, inilah cara Anda dapat menyiapkan satu simpul Elasticsearch "cluster" untuk mengindeks MongoDB untuk digunakan dalam aplikasi NodeJS, Express pada contoh EC2 Ubuntu 14.04 yang baru.

Pastikan semuanya sudah terbaru.

sudo apt-get update

Instal NodeJS.

sudo apt-get install nodejs
sudo apt-get install npm

Instal MongoDB - Langkah-langkah ini langsung dari MongoDB docs. Pilih versi apa pun yang Anda sukai. Saya bertahan dengan v2.4.9 karena tampaknya itu adalah versi terbaru dukungan MongoDB-River tanpa masalah.

Impor Kunci GPG MongoDB publik.

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

Perbarui daftar sumber Anda.

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

Dapatkan paket 10gen.

sudo apt-get install mongodb-10gen

Kemudian pilih versi Anda jika Anda tidak menginginkan yang terbaru. Jika Anda mengatur lingkungan Anda pada mesin windows 7 atau 8 tinggal jauh dari v2.6 sampai mereka menyelesaikan beberapa bug dengan menjalankannya sebagai layanan.

apt-get install mongodb-10gen=2.4.9

Cegah agar versi instalasi MongoDB Anda tidak terbentur saat Anda memperbarui.

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

Mulai layanan MongoDB.

sudo service mongodb start

File database Anda secara default adalah / var / lib / mongo dan file log Anda ke / var / log / mongo.

Buat database melalui mongo shell dan dorong beberapa data dummy ke dalamnya.

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

Sekarang untuk Mengkonversi MongoDB mandiri menjadi Set Replika .

Pertama, Matikan proses.

mongo YOUR_DATABASE_NAME
use admin
db.shutdownServer()

Sekarang kita menjalankan MongoDB sebagai layanan, jadi kita tidak meneruskan opsi "--replSet rs0" di argumen baris perintah ketika kita me-restart proses mongod. Sebagai gantinya, kami memasukkannya ke file mongod.conf.

vi /etc/mongod.conf

Tambahkan baris ini, subbing untuk jalur db dan log Anda.

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

Sekarang buka mongo shell lagi untuk menginisialisasi set replika.

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.

Sekarang instal Elasticsearch. Saya hanya mengikuti intisari bermanfaat ini .

Pastikan Java sudah diinstal.

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

Tetap menggunakan v1.1.x untuk saat ini sampai bug plugin Sungai Mongo diperbaiki di v1.2.1.

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

Pastikan /etc/elasticsearch/elasticsearch.yml mengaktifkan opsi konfigurasi berikut jika Anda hanya mengembangkan satu node untuk saat ini:

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

Mulai layanan Elasticsearch.

sudo service elasticsearch start

Verifikasi itu berfungsi.

curl http://localhost:9200

Jika Anda melihat sesuatu seperti ini maka Anda baik-baik saja.

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

Sekarang instal plugin Elasticsearch sehingga bisa bermain dengan MongoDB.

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

Kedua plugin ini tidak perlu tetapi mereka bagus untuk menguji kueri dan memvisualisasikan perubahan pada indeks Anda.

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

Mulai kembali Elasticsearch.

sudo service elasticsearch restart

Akhirnya indeks koleksi dari 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"
  }
}'

Periksa apakah indeks Anda ada di Elasticsearch

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

Periksa kesehatan cluster Anda.

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

Mungkin berwarna kuning dengan beberapa pecahan yang belum ditetapkan. Kita harus memberi tahu Elasticsearch apa yang ingin kita kerjakan.

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

Periksa kesehatan cluster lagi. Seharusnya berwarna hijau sekarang.

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

Pergi bermain.


@ Duck5auce punya ide bagaimana mendapatkan hasil (hasil pencarian elastis) dengan express.js dan ditampilkan di browser baik menggunakan template giok atau ejs misalnya seperti app.get ('search = "google"', function (req , res) {}); dan terima kasih atas jawaban yang luar biasa
bibin david

@Bibindavid Saya akan memeriksa sumber ini. Ini menuntun Anda melalui pembuatan modul klien ES sisi server Anda mendorong permintaan difilter melalui dua modul khusus lainnya. Rendering data masih ditangani oleh klien, tetapi harus menjadi titik awal yang layak. sahan.me/posts/dabbling-in-elasticsearch-part-2-with-nodejs Repo Github berlokasi di sini: github.com/sahan/sahan.github.io/tree/master/resources/…
Donald Gary

Bisakah Anda memberitahu saya mana yang akan lebih baik mongoosastik atau menggunakan modul mongose ​​dan elasticsearch berbeda ????
Sudhanshu Gaur

7
Sudah setahun sejak jawaban bebek5auce yang sangat baik. Pikirkan orang sekarang menggunakan 10gens [mongo-connector] [1] untuk menyinkronkan cluster MongoDB dengan ElasticSearch secara real-time. Itu mengekor oplog MongoDB. [1]: github.com/10gen-labs/mongo-connector/wiki/…
Andrew Betts

8
@ duck5auce Harap perbarui jawaban ini, ini sudah usang. Sungai telah ditinggalkan
tsturzl

35

Menggunakan sungai dapat menimbulkan masalah saat operasi Anda ditingkatkan. River akan menggunakan banyak memori saat dioperasikan. Saya sarankan menerapkan model elasticsearch Anda sendiri, atau jika Anda menggunakan luwak Anda dapat membangun model elasticsearch itu atau menggunakan mongoosastic yang pada dasarnya melakukan ini untuk Anda.

Kerugian lain dari Sungai Mongodb adalah Anda akan terjebak menggunakan cabang mongodb 2.4.x, dan ElasticSearch 0.90.x. Anda akan mulai menemukan bahwa Anda kehilangan banyak fitur yang sangat bagus, dan proyek mongodb river tidak menghasilkan produk yang dapat digunakan dengan cukup cepat untuk menjaga stabilitas. Yang mengatakan Sungai Mongodb jelas bukan sesuatu yang akan saya produksi. Ini menimbulkan lebih banyak masalah daripada nilainya. Itu akan secara acak menjatuhkan menulis di bawah beban berat, itu akan mengkonsumsi banyak memori, dan tidak ada pengaturan untuk membatasi itu. Selain itu, sungai tidak memperbarui dalam waktu nyata, ia membaca oplog dari mongodb, dan ini dapat menunda pembaruan selama 5 menit dalam pengalaman saya.

Kami baru-baru ini harus menulis ulang sebagian besar dari proyek kami, karena ini merupakan kejadian mingguan bahwa ada yang tidak beres dengan ElasticSearch. Kami bahkan sudah menyewa konsultan Dev Ops, yang juga setuju bahwa yang terbaik adalah menjauh dari River.

MEMPERBARUI: Elasticsearch-mongodb-river sekarang mendukung ES v1.4.0 dan mongodb v2.6.x. Namun, Anda mungkin masih akan mengalami masalah kinerja pada operasi penyisipan / pembaruan berat karena plugin ini akan mencoba membaca oplog mongodb untuk disinkronkan. Jika ada banyak operasi sejak penguncian (atau kait lebih tepatnya) terbuka, Anda akan melihat penggunaan memori yang sangat tinggi pada server elasticsearch Anda. Jika Anda berencana memiliki operasi besar, sungai bukanlah pilihan yang baik. Pengembang ElasticSearch masih menyarankan Anda untuk mengelola indeks Anda sendiri dengan berkomunikasi langsung dengan API mereka menggunakan perpustakaan klien untuk bahasa Anda, daripada menggunakan sungai. Ini sebenarnya bukan tujuan dari sungai. Twitter-sungai adalah contoh yang bagus tentang bagaimana sungai harus digunakan. Ini pada dasarnya cara yang bagus untuk sumber data dari sumber luar,

Juga pertimbangkan bahwa mongodb-river tertinggal dalam versi, karena tidak dikelola oleh ElasticSearch Organization, dikelola oleh pihak ketiga. Pengembangan macet di cabang v0.90 untuk waktu yang lama setelah rilis v1.0, dan ketika versi untuk v1.0 dirilis itu tidak stabil sampai elasticsearch merilis v1.3.0. Versi Mongodb juga ketinggalan. Anda mungkin menemukan diri Anda berada di tempat yang sempit ketika Anda mencari untuk pindah ke versi selanjutnya dari masing-masing, terutama dengan ElasticSearch di bawah pengembangan yang berat, dengan banyak fitur yang sangat diantisipasi di jalan. Tetap menggunakan ElasticSearch terbaru sangat penting karena kami sangat bergantung pada peningkatan fungsionalitas pencarian kami sebagai bagian inti dari produk kami.

Semua dalam semua kemungkinan Anda akan mendapatkan produk yang lebih baik jika Anda melakukannya sendiri. Tidak terlalu sulit. Ini hanya database lain untuk dikelola dalam kode Anda, dan dapat dengan mudah dimasukkan ke model yang ada tanpa refactoring besar.


Apakah Anda memiliki tautan atau saran di mana saya dapat mengindeks yaitu info penulis ke dalam indeks publikasi karena publikasi dan penulis ada dalam 2 koleksi dan tautan melalui referenceone dan referencemany
Marcel Djaman


The ini akan menjelaskan bagaimana Anda bergabung / berhubungan Data elastic.co/guide/en/elasticsearch/guide/current/...
tsturzl

1
Elasticsearch adalah DB penyimpanan dokumen, bukan yang relasional. Bukan tidak mungkin untuk menghubungkan data dalam elasticsearch, tetapi denormalisasi lebih mungkin terjadi, tetapi dapat dikelola dengan logika tambahan (ada plugin). Cara paling umum untuk menghubungkan data, seperti yang disebutkan dalam tautan di atas, adalah menyimpan referensi ID dalam dokumen relatif. Pastikan Anda menyimpan ID ini di bidang yang diatur not_analyzed, jika tidak, Anda akan kesulitan untuk menanyakannya, lakukan seperti cara bidang yang dianalisis diberi tokenized.
tsturzl

4

Saya menemukan konektor mongo berguna. Ini adalah bentuk Mongo Labs (MongoDB Inc.) dan dapat digunakan sekarang dengan Elasticsearch 2.x

Manajer dokumen 2.x elastis: https://github.com/mongodb-labs/elastic2-doc-manager

mongo-connector membuat pipa dari cluster MongoDB ke satu atau lebih sistem target, seperti Solr, Elasticsearch, atau cluster MongoDB lainnya. Ini menyinkronkan data dalam MongoDB ke target kemudian mengikuti oplog MongoDB, mengikuti operasi di MongoDB secara real-time. Ini telah diuji dengan Python 2.6, 2.7, dan 3.3+. Dokumentasi terperinci tersedia di wiki.

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


4

River adalah solusi yang baik setelah Anda ingin sinkronisasi dan solusi umum yang hampir real time.

Jika Anda sudah memiliki data dalam MongoDB dan ingin mengirimkannya dengan sangat mudah ke Elasticsearch seperti "one-shot", Anda dapat mencoba paket saya di Node.js https://github.com/itemsapi/elasticbulk .

Menggunakan aliran Node.js sehingga Anda dapat mengimpor data dari semua yang mendukung aliran (yaitu MongoDB, PostgreSQL, MySQL, file JSON, dll)

Contoh untuk MongoDB ke Elasticsearch:

Instal paket:

npm install elasticbulk
npm install mongoose
npm install bluebird

Buat skrip yaitu 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');
})

Kirimkan data Anda:

node script.js

Ini tidak terlalu cepat tetapi bekerja untuk jutaan rekaman (berkat stream).


3

Di sini bagaimana melakukan ini di mongodb 3.0. Saya menggunakan blog yang bagus ini

  1. Instal mongodb.
  2. Buat direktori data:
$ mkdir RANDOM_PATH/node1
$ mkdir RANDOM_PATH/node2> 
$ mkdir RANDOM_PATH/node3
  1. Mulai instance Mongod
$ mongod --replSet test --port 27021 --dbpath node1
$ mongod --replSet test --port 27022 --dbpath node2
$ mongod --replSet test --port 27023 --dbpath node3
  1. Konfigurasikan Set Replika:
$ mongo
config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]};    
rs.initiate(config);
  1. Menginstal 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. Menginstal dan mengonfigurasi Sungai MongoDB:

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

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

  1. Buat "Sungai" dan Indeks:

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

  1. Tes di browser:

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


6
ElasticSearch telah menghentikan plugins sungai. Ini tentunya bukan cara terbaik untuk mempertahankan indeks pencarian.
tsturzl

3

Di sini saya menemukan opsi bagus lain untuk memigrasikan data MongoDB Anda ke Elasticsearch. Daemon go yang menyinkronkan mongodb ke elasticsearch secara realtime. Ini Monstache. Ini tersedia di: Monstache

Di bawah setp awal untuk mengonfigurasi dan menggunakannya.

Langkah 1:

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

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

Langkah 3: Verifikasi replikasi.

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>

Langkah 4. Unduh " https://github.com/rwynn/monstache/releases ". Buka zip unduhan dan sesuaikan variabel PATH Anda untuk memasukkan path ke folder untuk platform Anda. "monstache -v" Pergi ke cmd dan ketik # 4.13.1 Monstache menggunakan format TOML untuk konfigurasinya. Konfigurasikan file untuk migrasi dengan nama config.toml

Langkah 5.

Config.toml saya ->

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

Langkah 6.

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

Lari Monstache ...

Konfirmasikan Data yang Dimigrasi di Elasticsearch

Tambahkan Catatan di Mongo

Monstache Mengambil acara dan memigrasikan data ke elasticsearch


3

Karena konektor mongo sekarang tampak mati, perusahaan saya memutuskan untuk membangun alat untuk menggunakan aliran perubahan Mongo ke output ke Elasticsearch.

Hasil awal kami terlihat menjanjikan. Anda dapat memeriksanya di https://github.com/electionsexperts/mongo-stream . Kami masih awal dalam pengembangan, dan akan menerima saran atau kontribusi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.