[MODX + ElasticSearch] Общая информация по ElasticSearch

Содержание цикла

Установка

Для работы ElasticSearch нам понадобится сервер с возможностью установки дополнительных пакетов. Так же обязательным пакетом для ElasticSearch является 7-я Java.

Сам процесс установки довольно простой - точно такой же, как и обычные пакеты, sh файл для установки deb пакета можно получить, пройдя по ссылке: https://gist.github.com/wingdspur/2026107

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

Для тех, у кого система отличная от описанных выше, вот ссылка на документацию по установке http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/setup.html

Также одним из важных факторов для разработки тем же методом, что я буду описывать дальше, это PHP версии 5.4.0. и выше.

Принципы работы с ElasticSearch

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

На протяжени всей своей разработки я использовал вот такой принцип.

$result =`$comand`;
$result = json_decode($result, true);

Где в переменной $comand находится строка запроса к серверу. Все ответы сервер возвращает в формате JSON. По этому второй строкой ответ мы превращаем в обычный массив.

В момент, когда я начинал разработку, библиотека для php уже существовала, но она была кривой. Так что я остался верен себе и все запросы формировал руками, это не вызывает особых проблем.

Если кому интересна библиотека для работы с системой, то вот ссылка на неё: http://www.elasticsearch.org/guide/en/elasticsearch/client/php-api/current/index.html

Архитектура (общие понятия)

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

Пример создания index-а

curl -XPUT 'http://localhost:9200/modx_shop/'

Мы создали index с именем “modx_shop”

Один из наиболее важных факторов для подобных решений, это то что все данные хранятся в оперативной памяти. А следовательно скорость доступа к ним более высока, чем в SQL решениях. И как следствие из этого, у нас отпадает необходимость в нескольких таблицах для хранения данных. Всё можно хранить в одном type, и это на скорость не влияет.

Все данные хранятся грубо говоря в разделе “_source” нашего type, там хранение происходить по принципу Ключ->значение. Примерно так же как в SQL базе данных.

Так же как и в базе данных, у каждого ключа есть свой определённый тип данных, его мы задаём при помощи такой вещи как mapping. Так же если вставлять сразу данные напрямую в таблицу, то для каждого необходимого ключа, ElasticSearch сам задаст тот тип данных, который больше подходит ему. Но мы можем и сами задавать типы данных. Это необходимо например для дальнейшего управления фильтрами, подробнее в описании типа string и date.

Всего существует множество типов данных, описание в официальной документации (http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.x/mapping-core-types.html), но я рассмотрю здесь только те типы которые понадобились мне в при создании магазина.

Типы данных

String

Самый тяжелонастраиваемый тип данных, пример описания ключа user

curl -XPUT 'http://localhost:9200/modx_shop/towar_base/_mapping' -d '
{
"towar_base" : {
  "properties" : {
  "user" : {"type" : "string", "index" :"not_analyzed"}
  }
  }
}
'

Разберём curl строку. По частям

В первой строке находиться указание, что мы помещаем _mapping(описание ключа) в index c именем modx_shop и type с именем towar_base, далее мы пишем саму строку запроса к серверу. Для ключа user находящегося в towar_base установить тип string у которого индексация происходит без анализа.

Подробнее о параметре index

index – может быть «not_analyzed», «analyzed», «no»

analyzed – включает функцию анализа нашего значения, но и здесь не всё так просто, анализатор заключается в том, что он специально для поиска заточен и разбивает строку типа «Super power» на 2 параметра «Super» и «Power», и во время выбора всех параметров, для построения фильтра, у вас возникнут очень большие проблемы.

not_analyzed – Это как можно понять, противоположность, но эта противоположность полезна для создания фильтров, ведь он не разбивает строку на слова, и при выборке всех параметров для фильтра это не составит проблем.

no – Это самое грубое отключение анализатора, если вы не хотите,чтобы эти параметры учитывались в поиске, и вообще нельзя было выбрать их все для фильтра, то именно этот тип индекса вам и необходимо использовать.

Тип данных date

curl -XPUT 'http://localhost:9200/modx_shop/towar_base/_mapping' -d '
{
  "towar_base" : {
    "properties" : {
      "Date" : {
        "type" : "date",
          "format" : "YYYY-MM-dd"
      }
    }
  }
}
'

Фактически это описание ничем не отличается от текстового, кроме наличия параметра format, который используется для описания формата хранимых данных.

Числовые типы данных

{
  "tweet": {
    "properties": {
      "price": {
        "type": "float"
      },
      "counts": {
        "type": "integer"
      }
    }
  }
}

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

Одна тонкость, связанная со String

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

Группа": [
  "85802da1-4b4e-4500-95dc-2ba424d20b8d", 
  "41206595-f0af-4a61-99e1-340c476297ea", 
  "5d3e1e83-8547-4c66-9039-cf867993332f"
]

Это позволяет в последствии делать выборку довольно простым фильтром. Описания этого типа данных я так и не смог найти в документации.

Итог

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

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


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

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

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