2012-10-03 16 views
5

Sto cercando di capire come mantenere il mio mysql db ed elasticsearch db sincronizzati. Ho configurato un fiume jdbc usando il plugin jprante/elasticsearch-river-jdbc per elasticsearch. Quando ho esecuzione alla richiesta di seguito:Mantenere elasticsearch e database sincronizzati

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

il fiume inizia l'indicizzazione dei dati, ma per alcuni record ottengo org.elasticsearch.index.mapper.MapperParsingException. Beh, c'è una discussione relativa a questo numero here, ma voglio sapere come aggirare questo problema.

È possibile risolvere in modo permanente questo creando un explicit mapping per tutti i "campi" del "tipo" che sto cercando di indicizzare o esiste un modo migliore per risolvere questo problema?

Un'altra domanda che ho è, quando jdbc-river esegue nuovamente il polling del database, sembra reindicizzare nuovamente l'intero set di dati (fornito in sql query) in ES. Non sono sicuro, ma lo fa perché elasticsearch vuole aggiungere nuovi dati e aggiornare eventuali modifiche ai dati esistenti? È possibile indicizzare solo i nuovi dati, se i dati della tabella sono statici?

+0

possibile duplicato di [Garantire ElasticSearch è sincronizzato con Database] (http://stackoverflow.com/questions/11952558/ensuring-elasticsearch-is-in-sync-with-database) – mahemoff

risposta

0

elasticsearch ha fatto cadere il concetto di fiume di sincronizzazione a tutti. Non è un percorso consigliato, perché in genere non ha senso mantenere la stessa struttura di tabelle SQL normalizzata in un archivio di documenti come Elastic Search.

Supponiamo che tu abbia prodotto come entità con alcuni attributi e le recensioni sull'entità prodotto come tabella figlio genitore come Recensioni potrebbero essere multiple sulla stessa tabella.

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

Nel negozio documento si consiglia di creare un unico indice con il nome del prodotto che dicono include Product{attribute1, attribute1,... Product reviews[review1, review2,...]}

Ecco approccio di sincronizzazione in tale configurazione.

Assunzione:

  1. Database SQL (vera fonte di record)
  2. elastico ricerca o qualsiasi altro negozio NoSQL Documento

Soluzione:

  1. Non appena Gli aggiornamenti/aggiornamenti si verificano in Eventi/eventi di pubblicazione in JMS/AMQP/Coda database/File Syst em Coda/Amazon SQS ecc. ID prodotto completo o ID oggetto primario (vorrei solo ID)
  2. L'utente della coda deve quindi chiamare il servizio Web per ottenere l'oggetto completo se solo l'ID primario viene inserito in coda o solo l'oggetto autonomamente e invia le rispettive modifiche al database Elastic search/NoSQL.
Problemi correlati