За последние 24 часа нас посетили 21023 программиста и 1465 роботов. Сейчас ищут 1024 программиста ...

Вставка записей elasticsearch

Тема в разделе "PHP для новичков", создана пользователем виталий032, 21 мар 2018.

  1. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Я так понял, что для поиска в elasticsearch необходимо, чтобы данные были в самом индексе (базе данных, если по человечески). Т.е. дублирование, к примеру, таблицы `posts` из MySQL в ElasticSearch индексе.

    Вопрос в том, что лучше использовать?
    • Logstash c плагином jdbc
    • делать вставку, как описал ниже, а при последующих добавлениях записей, добавлять копию в elastisearch (при удалении записи из MySQL удалять копию из Elasticsearch, т.к. id записи в MySQL и в Elasticsearch одинаковые)

    PHP:
    1. require_once 'vendor/autoload.php';
    2.  
    3. use Elasticsearch\ClientBuilder;
    4.  
    5. $db = new mysqli('127.0.0.1:3306','root','','network');
    6. $data = $db->query("SELECT * FROM posts");
    7. $data = $data->fetch_assoc();
    8.  
    9. $client = ClientBuilder::create()->build();
    10.  
    11. foreach($data as $row) {
    12.     $params = [
    13.         'index' => 'network',
    14.         'type' => 'posts',
    15.         'id' => $data['id'],
    16.         'body' => [
    17.             'content' => $data['content']
    18.         ]
    19.     ];
    20. }
    21.  
    22. $res = $client->index($params);
    P.S. Предполагается, что будет добавляться один пост в минуту. Полгиговый дедик, 5GB HDD надеюсь справится.
     
  2. gruth

    gruth Активный пользователь

    С нами с:
    13 май 2017
    Сообщения:
    224
    Симпатии:
    18
    Что то вы, товарищ, намудрили. Не проще array_pop использовать?
     
  3. виталий032

    виталий032 Активный пользователь

    С нами с:
    31 янв 2014
    Сообщения:
    227
    Симпатии:
    30
    Адрес:
    Владивосток
    Так это же не суть, перебрать каждое значение с начала или с конца массива.
    А ну и, в $params там вместо $data['id'] и $data['content'] конечно же $row['id'] и $row['content']
     
  4. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Второй вариант. Он ближе к документации )

    p.s. обратите внимание на bulk(), при вставке большого количества документов разом - быстее.
    --- Добавлено ---
    По дефолту он пытается отожрать 1 GB оперативки: https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
     
    виталий032 нравится это.