2012-10-03 3 views
5

나는 내 mysql db와 elasticsearch db를 동기화 상태로 유지하는 방법을 찾고 있습니다. elasticsearch 용 jprante/elasticsearch-river-jdbc 플러그인을 사용하여 jdbc 강을 설정했습니다. 나는 아래의 요청을 실행하는 경우 :elasticsearch와 데이터베이스를 동기화 유지

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

강은 색인 데이터를 시작하지만, 몇 가지 기록을 위해 나는 org.elasticsearch.index.mapper.MapperParsingException를 얻을. 글쎄,이 문제와 관련된 논의는 here이지만이 문제를 해결하는 방법을 알고 싶습니다.

색인을 생성하려고하는 '유형'의 모든 '입력란'에 대해 explicit mapping을 생성하여 영구적으로 수정할 수 있습니까? 아니면이 문제를 해결할 더 좋은 방법이 있습니까?

또 다른 질문은 jdbc-river가 데이터베이스를 다시 폴링 할 때 전체 데이터 세트 (SQL 쿼리에서 제공됨)를 ES에 다시 색인화하는 것입니다. 확실하지는 않지만 elasticsearch가 새로운 데이터를 추가하고 기존 데이터의 변경 사항을 업데이트하려고하기 때문에이 작업이 수행됩니까? 테이블의 데이터가 정적 인 경우 신선한 데이터 만 인덱싱 할 수 있습니까?

+0

가능한 복제본 [ElasticSearch가 데이터베이스와 동기화되어 있는지 확인] (http://stackoverflow.com/questions/11952558/ensuring-elasticsearch-is-in-sync-with-database) – mahemoff

답변

0

탄성 검색에서 모든 강 동기화 개념 떨어졌다 참조하십시오. 일반적으로 Elastic Search와 같은 문서 저장소에서 동일한 정규화 된 SQL 테이블 구조를 유지하는 것이 적절하지 않기 때문에 권장 경로가 아닙니다.

제품에 속성이있는 엔티티가 있고 제품 ​​엔티티에 대한 리뷰가 부모 테이블로 간주되는 경우 리뷰가 동일한 테이블에 여러 개가있을 수 있습니다.

당신이 이름을 가진 하나의 색인을 만들 수 있습니다 문서 저장소에서
Products(Id, name, status,... etc) 
Product_reviewes(product_id, review_id) 
Reviews(id, note, rating,... etc) 

여기 Product{attribute1, attribute1,... Product reviews[review1, review2,...]}

를 포함하는 제품은 설치에 동기화의 방법 말한다.

가정 :

  1. 을 즉시로 :

솔루션

  1. SQL 데이터베이스 (기록의 진정한 소스)
  2. 탄성 검색 또는 다른 NoSQL에 문서 저장 업데이트/업데이트는 JMS/AMQP/Database Queue/File Syst의 이벤트/이벤트 게시에서 발생합니다. em 대기열/Amazon SQS 등 전체 제품 또는 기본 객체 ID (단지 ID 권장)
  3. 대기열 사용자는 기본 ID 만 대기열로 푸시하거나 객체를 가져 오는 경우 전체 객체를 가져 오기 위해 웹 서비스를 호출해야합니다. 자체 검색하고 각각의 변경 사항을 Elastic search/NoSQL 데이터베이스로 보냅니다.
관련 문제