2015-05-21 3 views
1

У меня возникает следующая проблема при индексировании документов в elasticsearch, мои документы содержат некоторые поля, которые не повторяются в других документах, поэтому я заканчиваю отображение более 100 000 элементов. Давайте посмотрим пример:Избегайте отображения нескольких полей в упругом поиске

Если я отправить что-то вроде этого в пустой индекс:

{"example":{ 
    "a1":123, 
    "a2":444, 
    "a3":52566, 
    "a4":7, 
    ..... 
    "aN":11 
    } 
} 

Это создаст следующее отображение:

{"example" : { 
      "properties" : { 
       "a1" : { 
         "type" : "long" 
         }, 
       "a2" : { 
         "type" : "long" 
         }, 
       "a3" : { 
         "type" : "long" 
         }, 
       "a4" : { 
         "type" : "long" 
         }, 
       ..... 
       "aN" : { 
         "type" : "long" 
         } 
       } 
     } 
} 

Тогда, если я посылаю еще один документ:

{"example":{ 
    "b1":123, 
    "b2":444, 
    "b3":52566, 
    "b4":7, 
    ..... 
    "bN":11 
    } 
} 

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

Спасибо.

+1

Для начала, мое первое ощущение, что если два документа не имеют одинаковые ключи (или большой их подмножество), они не относятся к одному типу (например, «пример») в первую очередь. Вы также можете проверить [этот ответ] (http://stackoverflow.com/questions/21911162/too-many-fields-bad-for-elasticsearch-index). Как сказал Алекс Брасетвик, проблема состоит не в том, чтобы иметь слишком много полей, но не для того, чтобы не контролировать ваше отображение и позволить ему расти неограниченно, возможно, есть некоторые мысли, которые нужно сделать для вашего сопоставления. – Val

ответ

0

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

+0

Ну, может быть, вы правы, проблема может быть в архитектуре данных, мы используем эту архитектуру для поиска O (1) в коде, но мы можем сериализовать по-другому. Usecase во всяком случае представьте, что примером является человек, и внутри мы имеем некоторые атрибуты, которые определяют этого человека, что-то вроде «isTall»: «yes», «goToGym»: «mondays», ... и вот такие тысячи. – ibi2886

0

Если вы действительно хотите сделать это, создайте отображение, как на примере ниже:

POST /index_name/_mapping/type_name 
{ 
    "type_name": { 
     "enabled": false 
    } 
} 

Это даст требуемое поведение. elasticsearch прекратит создавать сопоставление для полей, а также анализирует и индексирует ваши документы.

Смотрите эти ссылки, чтобы получить больше информации:

Смежные вопросы