2012-10-03 8 views
5

Próbuję znaleźć sposób, aby zachować synchronizację moich danych mysql db i elasticsearch db. Skonfigurowałem rzekę jdbc za pomocą wtyczki jprante/elasticsearch-river-jdbc dla elastycznego wyszukiwania. Kiedy wykonać poniższe zapytanie:Utrzymywanie elastycznego przeszukiwania i bazy danych w synchronizacji

curl -XPUT 'localhost:9200/_river/my_jdbc_river/_meta' -d '{ 
"type" : "jdbc", 
"jdbc" : { 
    "driver" : "com.mysql.jdbc.Driver", 
    "url" : "jdbc:mysql://localhost:3306/MY-DATABASE", 
    "user" : "root", 
    "password" : "password", 
    "sql" : "select * from users", 
    "poll" : "1m" 
}, 
"index" : { 
    "index" : "test_index", 
    "type" : "user" 
} 
}' 

rzeka zaczyna indeksowania danych, ale dla niektórych zapisów uzyskać org.elasticsearch.index.mapper.MapperParsingException. No i jest dyskusja związana z tym problemem here, ale chcę wiedzieć, jak obejść ten problem.

Czy można to naprawić na stałe, tworząc explicit mapping dla wszystkich "pól" typu "próbuję" indeksować lub czy istnieje lepszy sposób rozwiązania tego problemu?

Mam jeszcze jedno pytanie, kiedy jdbc-river odpytuje bazę danych ponownie, wydaje się ponownie indeksować cały zestaw danych (podany w zapytaniu sql) ponownie do ES. Nie jestem pewien, ale czy to się robi, ponieważ elasticsearch chce dodawać nowe dane, a także aktualizować wszelkie zmiany w istniejących danych? Czy możliwe jest indeksowanie tylko świeżych danych, jeśli dane tabeli są statyczne?

+0

możliwy duplikat [Zapewnienie ElasticSearch jest zsynchronizowany z bazą danych] (http://stackoverflow.com/questions/11952558/ensuring-elasticsearch-is-in-sync-with-database) – mahemoff

Odpowiedz

0

Elastic Search spadła koncepcję rzeka synchronizacji w ogóle. Nie jest to zalecana ścieżka, ponieważ zwykle nie ma sensu utrzymywanie tej samej znormalizowanej struktury tabeli SQL w magazynie dokumentów, np. Elastic Search.

Powiedzmy, że masz Produkt jako jednostkę z niektórymi atrybutami, a Opinie o produkcie jako o rodzicielskiej tabeli podrzędnej jako Opinie mogą być wielokrotnością w tej samej tabeli.

Products(Id, name, status,... etc) 
Product_reviewes(product_id, review_id) 
Reviews(id, note, rating,... etc) 

W sklepie dokumentu może chcesz utworzyć jeden indeks o nazwie powiedzieć, że produkt zawiera Product{attribute1, attribute1,... Product reviews[review1, review2,...]}

Oto podejście synchronizacji w takiej konfiguracji.

Założenie:

  1. SQL Database (Prawdziwe źródło zapisu)
  2. Elastic Search lub inny sklep NoSQL Dokument

Rozwiązanie:

  1. Jak tylko Aktualizacja/aktualizacje odbywają się w Opublikuj zdarzenie/zdarzenia w JMS/AMQP/Database Queue/File Syst em Kolejka/Amazon SQS itd. albo pełny Identyfikator produktu lub podstawowego obiektu (polecam tylko ID)
  2. Klient w kolejce powinien następnie wywołać usługę sieci Web, aby uzyskać pełny obiekt, jeśli tylko Główny identyfikator zostanie przekazany do Kolejki lub po prostu zabrać obiekt, który samodzielnie i wyślij odpowiednie zmiany do bazy danych Elastic search/NoSQL.