[MODX + ElasticSearch] Основы записи/чтения/обновления данных

Итак, в прошлой части мы создали структуру нашей базы со своими хитростями и всем прочим.

Теперь нас должны интересовать 3 основные вещи: запись в Базу данных, чтение данных из базы данных, и обновление.

Запись данных

Запись данных происходит очень просто, например:

curl -XPOST localhost:9200/modx_shop /towar_base /1 -d '{"Артикул":"1","Имя товара":"Товар 1","Цена":"1232","Категория":"1","Парметр_1":"текст","Параметр_2":23,"Параметр_3":25}'

Как можем заметить, первая часть «curl -XPOST localhost:9200/modx_shop /towar_base /1» состоит из уже известных данных, index и type, а теперь о том, что это за 1-ца, на самом деле эта единица не что более, как ID товара. Главная отличительная особенность этой системы, то что в качестве ID может быть всё что угодно, впрочем как и везде. По факту есть одна явная проблема, я так и не научился делать Auto Incriment для id-шника, в принципе как в дальнейшем выяснилось это не проблема, т.к. везде отлично использовался параметр Артикул.

А теперь о второй части,

'{"Артикул":"1","Имя товара":"Товар 1","Цена":"1234","Категория":"1","Парметр_1":"текст","Параметр_2":23,"Параметр_3":25}'

Это всё не более чем простой JSON массив, и именно в этом моменте и возникает проблема с версиями php ниже, чем 5.4, а именно отсутствие вот такого ключа «JSON_UNESCAPED_UNICODE», который позволяет после сформированного ключа, оставлять все значения в читаемом виде, не переводя всё в грубый JSON. И больше этот массив ничем не отличается простого использования команду json_encode

Получение данных

После того, как мы поместили данные, нам нужно их получить. Этот процесс на самом деле самое проще, чем кажется.

curl -XGET localhost:9200/modx_shop /towar_base /1

Главное, на что стоит обратить внимание, это то,что метод изменился с «-XPOST», на «-XGET», а в целом структура не отличается от структуры записи, разве только откидываем часть с данными для записи, т.к. нам их нужно получить, а не записать. И в итоге нам вернётся JSON массив, разобрав который вы можете получить нужные вам данные.

Примерный вариант ответа:

{

"_index" : " modx_shop ",

"_type" : " towar_base",

"_id" : "1",

"_version" : 1,

"found": true,

"_source" : {

" Имя товара " : "Товар 1",

" Категория " : 1,

" Цена " : "1234",

…..Дальше все параметры

}

}

Обновление данных

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

В том случае, если вам нужно обновить единичный параметр, то придётся извращаться.

curl -XPOST localhost:9200/modx_shop/towar_base/1/_update -d'{

"script" : "ctx._source.Цена = tag",

"params" : { "tag" : 1232}

}';

В строчке "script" : "ctx._source.Цена = tag" мы указываем, что значение параметра цена принять равным значению tag. Во второй строке мы задаём само значение tag.

Подробнее о методах обновления можно почитать вот здесь

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-update.html

здесь присутствует множество разных красивых вариантов, когда нужно к числу что-то добавить или объединить строки.

Работа с файлами.

Теперь немного о работе с большими файлами. Мною проводились тесты на домашнем сервере, который сложно назвать хорошей боевой машиной,

И выяснилось, что для записи 3-х миллионов товаров в базу грубым методом прямо из php скрипта во время разбора занимает что-то порядка 12 часов. В том случае, если мы все наши команды для обновления загоняем в SH скрипт и пускаем на выполнение, то этот процесс занимает 8 часов. А теперь ещё веселей: если мы загоняем это всё в SH файл и бьём этот же файл на 10-12 частей, то процесс сокращается до 3-ёх часов, как можем заметить, прирост по времени значительный. На нормальной боевой машине не удалось протестировать, т.к. там сразу идею с CSV загубили, т.к. 1С-программисты не умеют загонять всё в CSV. Пришлось работать с XML. Пока база составляет всего 56000 товаров, и, соответственно, с разбивкой на много файлов XML-я пришлось повременить.

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

Пример CSV

Пример скрипта разбора CSV

Пример итога выполнения парсера этого CSV

Пример скрипта XML-я выполнен для ситуации когда нет необходиомсти разбивки на мелкие файлы. Мелких примеров XML-я нет у меня. Да и разбор каждой структуры это не такая уж сложная задача. так что пример только для ознакомления с процессор парсинга длинного файла.

Пример скрипта разбора XML

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


Комментарии (0)

    Вы должны авторизоваться, чтобы оставлять комментарии.

    © 2011 — 2014 MODX Беларусь
    По всем вопросам обращаться в компанию Alroniks Experts