Jak używać Elasticsearch z MongoDB?

Przejrzałem wiele blogów i stron o konfigurowaniu Elasticsearch dla MongoDB do indeksowania kolekcji w MongoDB, ale żaden z nich nie był prosty.

Proszę mi wyjaśnić krok po kroku proces instalacji elasticsearch, który powinien zawierać:

  • Konfiguracja
  • Uruchom w przeglądarce

Używam Node.js z ekspresem.js, więc proszę o pomoc.

Author: Mandeep Singh, 2014-05-24

6 answers

Ta odpowiedź powinna wystarczyć, aby przygotować się do tego samouczka na budowanie funkcjonalnego komponentu wyszukiwania za pomocą MongoDB, Elasticsearch i AngularJS.

Jeśli chcesz użyć rozszerzonego wyszukiwania z danymi z API, to Matthiasn ' s BirdWatch Repo jest czymś, na co możesz chcieć spojrzeć.

Oto jak możesz skonfigurować pojedynczy węzeł Elasticsearch "klaster" do indeksowania MongoDB do użytku w aplikacji NodeJS, Express na świeżym Ubuntu EC2 14.04 przykład.

Upewnij się, że wszystko jest aktualne.
sudo apt-get update

Zainstaluj NodeJS.

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

Zainstaluj MongoDB - te kroki są prosto z dokumentów MongoDB. Wybierz wersję, która Ci odpowiada. Zostaję przy v2. 4. 9, ponieważ wydaje się, że jest to najnowsza wersja MongoDB-River obsługuje bez problemów.

Importuj publiczny klucz GPG MongoDB.

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

Zaktualizuj swoją listę źródeł.

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

Get the 10gen paczka.

sudo apt-get install mongodb-10gen

Następnie wybierz swoją wersję, jeśli nie chcesz najnowszej. Jeśli konfigurujesz środowisko na komputerze z systemem windows 7 lub 8, trzymaj się z dala od wersji 2.6, dopóki nie wypracują błędów podczas uruchamiania go jako usługi.

apt-get install mongodb-10gen=2.4.9

Zapobiegaj awariom wersji instalacji MongoDB podczas aktualizacji.

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

Uruchom usługę MongoDB.

sudo service mongodb start

Pliki bazy danych domyślnie to / var / lib / mongo, a pliki logów to / var / log / mongo.

Stwórz bazę danych przez powłokę mongo i wepchnij do niej fałszywe dane.

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

Teraz Przekształć samodzielny MongoDB w zestaw replik.

Najpierw Zamknij proces.

mongo YOUR_DATABASE_NAME
use admin
db.shutdownServer()

Teraz uruchamiamy MongoDB jako usługę, więc nie przekazujemy opcji "--replSet rs0 " w argumencie wiersza poleceń po ponownym uruchomieniu procesu MongoDB. Zamiast tego umieściliśmy go w mongodzie.plik conf.

vi /etc/mongod.conf

Dodaj te linie, subbing dla ścieżek db i logów.

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

Teraz otwórz ponownie skorupę mongo, aby zainicjować zestaw replik.

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.

Teraz zainstaluj Elasticsearch. Po prostu podążam za tym pomocnymGist .

Upewnij się, że Java jest zainstalowana.

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

Trzymaj się v1. 1.x na razie dopóki błąd wtyczki Mongo-River nie zostanie naprawiony w 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

Upewnij się, że /etc/elasticsearch/elasticsearch.yml ma następujące opcje konfiguracji włączone, jeśli rozwijasz się tylko na pojedynczy węzeł na razie:

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

Uruchom usługę Elasticsearch.

sudo service elasticsearch start

Sprawdź, czy działa.

curl http://localhost:9200

Jeśli widzisz coś takiego, to jesteś dobry.

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

Teraz zainstaluj wtyczki Elasticsearch, aby mógł grać z MongoDB.

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

Te dwie wtyczki nie są konieczne, ale są dobre do testowania zapytań i wizualizacji zmian w indeksach.

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

Uruchom Ponownie Elasticsearch.

sudo service elasticsearch restart

Wreszcie indeks a kolekcja od 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"
  }
}'

Sprawdź, czy twój indeks jest w Elasticsearch

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

Sprawdź stan swojego klastra.

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

Prawdopodobnie jest żółta z niezasypanymi odłamkami. Musimy powiedzieć Elasticsearch, z czym chcemy pracować.

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

Sprawdź jeszcze raz stan klastra. Teraz powinno być zielone.

curl -XGET 'http://localhost:9200/_cluster/health?pretty=true'
Idź się pobawić.
 250
Author: Donald Gary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 16:43:59

Korzystanie z river może powodować problemy, gdy Twoja operacja się zwiększy. River zużyje mnóstwo pamięci, gdy będzie ciężko pracować. Polecam wdrożenie własnych modeli elasticsearch, lub jeśli używasz mongoose można zbudować swoje modele elasticsearch prawo do tego lub użyć mongoosastic który zasadniczo robi to dla Ciebie.

Kolejną wadą MongoDB River jest to, że utkniesz przy użyciu mongodb 2.4.x branch, A ElasticSearch 0.90.x. zaczniesz przekonywać się, że jesteś brakuje wielu naprawdę fajnych funkcji, a projekt MongoDB river po prostu nie produkuje użytecznego produktu wystarczająco szybko, aby utrzymać stabilność. To powiedziawszy MongoDB River zdecydowanie nie jest czymś, z czym chciałbym iść do produkcji. To sprawiało więcej problemów niż było warte. Będzie losowo upuszczać zapis pod dużym obciążeniem, pochłonie dużo pamięci i nie ma ustawienia, aby to zamknąć. Ponadto river nie aktualizuje się w czasie rzeczywistym, czyta oplogy z mongodb, a to może opóźnić aktualizacje tak długo, jak 5 minut z mojego doświadczenia.

Ostatnio musieliśmy przepisać dużą część naszego projektu, ponieważ co tydzień zdarza się, że coś idzie nie tak z ElasticSearch. Posunęliśmy się nawet tak daleko, aby zatrudnić konsultanta Dev Ops, który również zgadza się, że najlepiej jest odejść od River.

Aktualizacja: Elasticsearch-mongodb-river obsługuje teraz ES v1. 4. 0 i mongodb v2. 6.x. jednak nadal prawdopodobnie napotkasz problemy z wydajnością podczas ciężkich operacji wstawiania/aktualizacji, ponieważ ta wtyczka spróbuje odczytać oplogi mongodb do synchronizacji. Jeśli istnieje wiele operacji, ponieważ blokada (lub zatrzask raczej) odblokowuje, zauważysz bardzo wysokie zużycie pamięci na serwerze elasticsearch. Jeśli planujesz dużą operację, river nie jest dobrym rozwiązaniem. Programiści ElasticSearch nadal zalecają zarządzanie własnymi indeksami, komunikując się bezpośrednio z ich API za pomocą biblioteki klienta dla Twojego języka, a nie za pomocą river. To nie jest cel river. Twitter-river jest doskonałym przykładem tego, jak rzeka powinna być używana. Zasadniczo jest to świetny sposób na pozyskiwanie danych ze źródeł zewnętrznych, ale nie jest bardzo niezawodny w przypadku dużego ruchu lub użytku wewnętrznego.

Weź również pod uwagę, że mongodb-river pozostaje w tyle w wersji, ponieważ nie jest utrzymywana przez organizację ElasticSearch, jest utrzymywana przez thirdparty. Rozwój został zatrzymany na gałęzi v0.90 przez długi czas po wydaniu v1. 0, a kiedy Wersja Dla v1.0 został wydany nie był stabilny aż elasticsearch wydany v1. 3. 0. Wersje Mongodb również pozostają w tyle. Możesz znaleźć się w ciasnym miejscu, gdy szukasz, aby przejść do późniejszej wersji każdego, zwłaszcza z ElasticSearch pod tak ciężkim rozwoju, z wielu bardzo oczekiwanych funkcji na drodze. Bycie na bieżąco z najnowszymi ElasticSearch było bardzo ważne, ponieważ polegamy na ciągłym ulepszaniu naszej funkcjonalności wyszukiwania jako podstawowej części naszego produktu.

W sumie prawdopodobnie dostaniesz lepszy produkt, jeśli to zrobisz siebie. To nie takie trudne. To po prostu kolejna baza danych do zarządzania w kodzie i można ją łatwo wrzucić do istniejących modeli bez poważnej refaktoryzacji.

 32
Author: tsturzl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-23 00:17:02

Znalazłem Mongo-connector przydatne. Jest to forma Mongo Labs (MongoDB Inc.) i może być używany teraz z Elasticsearch 2.x

Elastyczna 2.x Doc manager: https://github.com/mongodb-labs/elastic2-doc-manager

Mongo-connector tworzy rurociąg z klastra MongoDB do jednego lub więcej systemów docelowych, takich jak Solr, Elasticsearch lub inny klaster MongoDB. Synchronizuje dane w MongoDB do celu, a następnie ogona MongoDB oplog, nadążając za operacjami w MongoDB w w czasie rzeczywistym. Został przetestowany z Pythonem 2.6, 2.7 i 3.3+. Szczegółowa dokumentacja jest dostępna na wiki.

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

 4
Author: Lokendra Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-26 13:29:51

Tutaj Jak to zrobić na mongodb 3.0. Użyłam tego fajnego bloga

  1. zainstaluj mongodb.
  2. tworzenie katalogów danych:
$ mkdir RANDOM_PATH/node1
$ mkdir RANDOM_PATH/node2> 
$ mkdir RANDOM_PATH/node3
  1. Uruchom instancje Mongod
$ mongod --replSet test --port 27021 --dbpath node1
$ mongod --replSet test --port 27022 --dbpath node2
$ mongod --replSet test --port 27023 --dbpath node3
  1. Konfiguracja zestawu replik:
$ mongo
config = {_id: 'test', members: [ {_id: 0, host: 'localhost:27021'}, {_id: 1, host: 'localhost:27022'}]};    
rs.initiate(config);
  1. Instalowanie 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. instalacja i konfiguracja rzeki MongoDB:

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

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

  1. Stwórz "rzekę" i indeks:

Curl-XPUT ' http://localhost:8080/_river/mongodb/_meta ' - d '{ "type": "number"", "mongodb": { "db": "mydb", "collection": "foo" }, "indeks": { "name": "Nazwa", "type": "random"" } }'

  1. Test na przeglądarce:

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

 2
Author: Priyanshu Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-03 09:35:53

Ponieważ Mongo-connector teraz wydaje się martwy, moja firma postanowiła zbudować narzędzie do korzystania z Mongo zmiana strumieni do wyjścia do Elasticsearch.

Nasze wstępne wyniki wyglądają obiecująco. Możesz to sprawdzić na https://github.com/everyone-counts/mongo-stream . wciąż jesteśmy na wczesnym etapie rozwoju i chętnie przyjmiemy sugestie lub uwagi.

 1
Author: Jud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 01:11:00

River jest dobrym rozwiązaniem, gdy chcesz mieć prawie synchronizację w czasie rzeczywistym i ogólne rozwiązanie.

Jeśli masz już dane w MongoDB i chcesz je bardzo łatwo wysłać do Elasticsearch jak "one-shot", możesz wypróbować mój pakiet w Node.js https://github.com/itemsapi/elasticbulk .

Używa węzła.strumienie js, dzięki czemu można importować dane ze wszystkiego, co obsługuje strumienie (np. MongoDB, PostgreSQL, MySQL, pliki JSON, itp.)

Przykład dla MongoDB do Elasticsearch: {]}

Zainstaluj pakiety:

npm install elasticbulk
npm install mongoose
npm install bluebird

Create script czyli skrypt.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');
})

Wyślij swoje dane:

node script.js

Nie jest zbyt szybki, ale działa na miliony płyt (dzięki streamom).

 0
Author: Mateusz Rzepa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-16 09:03:39