2016-11-03 2 views
1

사이트의 검색 구성 요소에 ElasticSearch를 사용하고 있습니다. 인덱싱되고 검색되는 데이터는 MySQL DB에 저장되는 것과 동일한 데이터입니다.MySQL을 사용한 ElasticSearch 사용

내 접근 방식은 해당 CRUD MySQL 작업이 발생할 때 인덱스의 데이터를 추가/삭제/수정하는 것입니다.

예를 들어,이 동작은 다음과 같은 형태 생성 : 데이터가 삭제됩니다

public function savePost(Request $request) { 
    //Firstly, create the object and save it to MySQL 
    $post = new Post(); 
    $post->title = $request->title; 
    $post->body = $request->body; 
    //... 
    //and so on 
    $post->save(); 

    //Secondly, index this new data: 
    $elasticSearchClient = ClientBuilder::create()->build(); 

    $params = [ 
     'index' => 'some_index_elasticsearch', 
     'id' => $post->id, 
     'type' => 'post', 
     'timestamp' => time(), 
     'body' => [ 
      'id' => $post->id, 
      'title' => $post->title, 
      'body' => $post->body, 
      //... and so on 
     ], 
    ]; 

    $elasticSearchClient->index($params); 

} 

경우/MySQL을 업데이트 난 그냥 삭제하거나 인덱스에서 업데이트 것입니다.

이 방법은 MySQL을 ElasticSearch (또는 Sphinx와 같은 다른 유사한 기술)와 함께 사용하는 올바른 방법입니까? 또는 ElasticSearch를위한 더 많은 데이터 소스로 MySQL을 사용하는 더 나은 접근법을 추천 하시겠습니까? (실제로 ElasticSearch와 MySQL 사이에 상호 작용이 없기 때문에 실제로 여기서 일어나지는 않습니다).

차이점이 있으면 https://github.com/elastic/elasticsearch-php을 사용하여 ElasticSearch와 상호 작용합니다.

이 접근법은 지금까지 작동합니다. 맞는지 길인지 또는 누구나 이런 방식으로 문제가 발생할 수 있는지 확실하지 않습니다.

답변

2

탄성 찾기를 사용하는 "올바른 방법"이 없습니다. "Right"는 상대적이므로 "올바른 방법"은 유스 케이스를 지원하는 방법입니다. Elasticsearch는 하나의 특정 유스 케이스에 대해서만 작동 할뿐만 아니라 점점 더 많은 유스 케이스에 대해 작동합니다.

당신이 설명하는 사례는 완벽하게 유효한 사례입니다. 예를 들어, MySQL과 같은 다른 RDBMS에있는 콘텐츠를 인덱싱하고 인덱싱 된 콘텐츠가 주요 진원과 동기화되는지 확인하십시오.

당신이 염두에 두어야 할 필요가 사용 사례의 하나 어려운 일이 당신이 MySQL과 ES는 항상 1임을 보장해야한다는 것입니다

: 동기화에 1, 그리고 여러 가지 이유로 할 필요는 쉬운 일이 아니다 :

  • 유지 관리를 위해 ES를 가져와야하지만 어떤 이유로 든 앱이 작동하지 않으면 어떻게됩니까?
  • ES에 문제가 있고 문서가 색인 생성/업데이트/삭제되지 않으면 어떻게됩니까? (트랜잭션 지원이 없음을 기억하십시오.)

MySQL과 ES를 동기화하기 위해 다른 방법이 있습니다. by using the binlog.

잠재적 인 문제를 완화하기위한 전략을 생각해 봐야합니다. 나는 그들이 당신과 다른 사람들이 분명히 생길 것이라고 확신 할 수 있기 때문에 스스로에게 질문해야합니다.

요약하면 아키텍쳐에는 아무런 문제가 없습니다. 수천 개의 회사가 똑같은 일을하지만, 동기화 계획이 실패하면 계획을 세워야합니다.

2

큰 스케일의 updating/deleting 문서에는 ElasticSearch가 적합하지 않습니다.

many aproaches이 아키텍처의 단점에 대한 과부하를 최소화하기 위해 노력하지만 그럴 경우 솔루션의 복잡성이 증가한다고 생각하면됩니다.

여러분은 MySQL에서만 CRUD 작업을 유지하고 ES는 추가 전용으로 사용하는 것이 좋습니다. 실제로, StackOverflow itself, 그리고 많은 다른 훌륭한 TI 회사는이 접근 방식을 사용합니다.