Intereting Posts
Просто обновите мой сайт до версии 1.9.3.0 и получите ошибку SQLSTATE : Столбец не найден: 1054 Неизвестный столбец 'catalog_product_entity_group_price.is_percent' Как jquery и php работают вместе с формами? Рекурсивное меню каталога PHP Установить расширение fileinfo php Доступ к числовому свойству в элементе SimpleXMLElement Как заставить загружать большие файлы, не используя слишком много памяти? Можно ли добавить условие в инструкцию обновления CakePHP? найти время для выполнения MySQL-запроса через PHP Форматирование результатов запроса MySQL, как если бы он запускался с консоли PHP использует CURRENT_TIMESTAMP из восточного часового пояса Как я могу поработать, если дата уже или до сегодняшнего дня? Получать значение, не зная ключа в однопараметрическом массиве serialize / unserialize в jQuery Стратегия кэширования, когда кеширование становится бессмысленным? Расширенное соединение MySQL. Ускорение запроса

Использование ElasticSearch с MySQL

Я использую ElasticSearch для компонента поиска на сайте. Данные, которые индексируются и, в конечном итоге, подвергаются поиску, – это те же данные, которые сохраняются в базе данных MySQL.

Мой подход к этому заключается в добавлении / удалении / изменении данных в индексе, когда происходит соответствующая операция 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)? или вы порекомендовали бы лучший подход к использованию MySQL в качестве источника данных для ElasticSearch? (что действительно не происходит вообще, потому что взаимодействия между ElasticSearch и MySQL вообще нет).

Я использую https://github.com/elastic/elasticsearch-php для взаимодействия с ElasticSearch, если это имеет значение.

Просто уточнить: этот подход действительно работает до сих пор – я просто не уверен, что это правильный путь, или если кто-нибудь может увидеть проблемы, с которыми я могу столкнуться с этим способом делать что-то.

Для использования Elasticsearch нет «правильного пути». «Правый» относительный, поэтому «правильный путь» – это способ, который поддерживает ваш случай (ы) использования. Elasticsearch работает не только в одном конкретном случае использования, но и во много раз больше, чем один случай использования.

Случай, который вы описываете, является совершенно достоверным, то есть индексирование в ES любого содержимого, которое у вас есть в другой СУБД, такой как MySQL, и убедитесь, что проиндексированный контент синхронизирован с основным источником правды.

Одна сложная вещь в вашем случае использования, которую вы должны иметь в виду, заключается в том, что вы должны гарантировать, что MySQL и ES всегда синхронизируются 1: 1, и это не всегда легко сделать по разным причинам:

  • что произойдет, если вам нужно привести ES вниз для обслуживания, но ваше приложение должно остаться по какой-либо причине?
  • что происходит, если в ES есть проблема, и документ не индексируется / обновляется / удаляется? (помните, что транзакционная поддержка отсутствует)

Есть другие пути для синхронизации MySQL и ES, которые менее хрупкие, например , используя binlog .

Вы должны задать себе эти вопросы и выяснить стратегию смягчения этих потенциальных проблем, потому что я могу заверить вас, что они (и другие) обязательно возникнут.

Подводя итог, нет проблем с вашей архитектурой, тысячи компаний делают то же самое, однако вам нужно иметь план, если ваш план синхронизации будет идти на юг.

ElasticSearch не очень подходит для обновления / удаления документов в больших масштабах.

Существует много апробаций, которые пытаются свести к минимуму перегрузку этого недостатка на его архитектуре, но если вы думаете, что увеличивает сложность вашего решения.

Я предлагаю, чтобы вы выполняли операции CRUD только на MySQL и использовали ES как append-only. Фактически, сам StackOverflow и многие другие компании TI используют этот подход.