niedziela, 29 września 2013

[FullTextSearch] ElasticSearch: river MongoDB

Najpopularniejszym sposobem dodawania danych do indeksów ElasticSearch jest wysyłanie odpowiednich REST-owych wiadomości. Ale to nie jedyny sposób. Możemy czasem pobierać dane także bezpośrednio z zewnętrznych źródeł, na przykład z baz danych. Mechanizmem, który umożliwia synchronizację pomiędzy źródłem danych, a indeksem ElasticSearch jest river. Rivery są dostępne dla różnych baz NoSql, przykładowo dla MongoDB musimy zainstalować ten river. Aby uruchomić synchronizację pomiędzy instancją bazy, a indeksem ElasticSearch musimy wykonać poniższe kroki. Rozpoczynamy od instalacji pluginu do ElasticSearch. Wchodzimy do katalogu bin w ElasticSearch i wpisujemy polecenie

plugin.bat -i com.github.richardwilly98.elasticsearch/elasticsearch-river-mongodb/1.7.0

Warto pamiętać, że przy instalacji rivera muszą się zgadzać wersje ES i MongoDB. Kompatybilność możemy sprawdzić tutaj.

Teraz musimy przygotować bazę do pracy w trybie replikacji. Plugin river synchronizuje dane dzięki plikowi oplog.rs, udostępnianemu przez MongoDB tylko w trybie replikacji. Plik ten zawiera log z wszystkich zmian, jakie były wykonywane na danych. Pierwotnie jego celem było synchronizowanie danych pomiędzy wieloma replikami, ale wykorzystuje go także river. Do celów ElasticSearch można włączyć replikację składającą się z jednej repliki.

1. Uruchamiamy jeden proces, na którym chodzi baza poleceniem mongod --dbpath rsdata --replSet rs0
2. W drugim oknie wchodzimy do narzędzia konfiguracji poleceniem mongo
3. Wpisujemy polecenie rs.initiate() i czekamy, aż nasz node ustawi się jako PRIMARY (naciśnięcie enter po kilkunastu sekundach powinno upewnić nas o zmianie stanu)

Teraz uruchamiamy ElasticSearch pozostawiając MongoDB działające w innym oknie, tryb konfiguracji możemy opuścić.Wysyłamy PUT z konfiguracją mapowania kolekcji w bazie na indeks w ElasticSearch.

PUT http://localhost:9200/_river/mongolink/_meta HTTP/1.1
User-Agent: Fiddler
content-type: application/json
Host: localhost:9200
Content-Length: 214

{
  "type" : "mongodb",
  "mongodb" : {
   "servers" : [
    { "host" : "localhost", "port" : 27017 }
   ],
   "db" : "esbook",
   "collection" : "products"
  },
  "index" : {
   "name" : "esbook"
  }
}

Na indeksie _river stworzyliśmy typ mongolink, który będzie się mapował na kolekcję products z bazy esbook . Teraz możemy dodać dane, na przykład z konsoli mongo.

rs0:PRIMARY> use esbook
switched to db esbook
rs0:PRIMARY> db.products.insert({ "name" : "book", "value" : 200 });

Teraz możemy obejrzeć zmapowane zasoby pod adresem http://localhost:9200/esbook/_search?pretty

Brak komentarzy:

Prześlij komentarz