Должен ли я хранить строки напрямую или их числовые токены в elasticsearch

Я не могу решить, как сохранить информацию о событии в elasticsearch. Информация хранится в mysql, и, поскольку я хочу сделать ее фильтруемой, я решил использовать elasticsearch для индексации событий. Каждое из полей имеет ограниченное количество вариантов, но разрешено несколько вариантов. Должен ли я хранить информацию непосредственно следующим образом:

{
   "id":"1",
   "name":"Event A",
   "type":"Training,Workshop,Meeting",
   "industrialSector":"Energy,Transport",
   "country":"China"
   // + 80 fields alike
}

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

{
   "id":"1",
   "name":"Event A",
   "type":"1 3 5",
   "industrialSector":"2 3",
   "country":"7"
   // + 80 fields alike
}

Будет объект карты для ссылки на параметры поля перед сохранением или после извлечения:

let options = 
{
    type:{
        Training:1,
        Fair:2
        Workshop:3,
        Brokerage:4
        Meeting:5
    },
    industrialSector:{
       Tech:1
       Energy:2
       Transport:3
    }
}

Первый требует меньше работы, но работает ли он медленнее и требует больше места на диске, чем второй?


person RedGiant    schedule 26.08.2017    source источник


Ответы (1)


Я думаю, что ваше второе решение не имеет преимуществ. Я бы просто сохранил параметры в виде массива:

{
   "id":"1",
   "name":"Event A",
   "type":["Training","Workshop","Meeting"]
   "industrialSector":["Energy","Transport"]
   "country":"China"
   // + 80 fields alike
}
person MartinSchulze    schedule 26.08.2017
comment
Спасибо. Я переключался между этими двумя решениями и не мог решить, какое из них. Я серьезно обдумываю ваше предложение. Однако порядок также важен в некоторых полях, поэтому я бы предпочел хранить строку вместо массива. Является ли дополнительное дисковое пространство единственным недостатком хранения строки напрямую по сравнению с моим вторым решением? - person RedGiant; 26.08.2017
comment
@RedGiant да, исходный документ (документ, который вы отправили в elasticsearch) будет храниться на диске, вы можете отключить это или включить сжатие. Поэтому я думаю, что в 99% случаев это действительно не проблема. Если порядок важен, мой массив не должен работать, я думаю, что текстовое поле может быть решением. - person MartinSchulze; 26.08.2017