Если значения doc используются для поля в elasticsearch, является ли хранение этого поля избыточным?

#java #lucene #elasticsearch

#java #lucene #elasticsearch

Вопрос:

Насколько я понимаю, хранение поля в elasticsearch служит двум целям:

  1. Поле может быть извлечено непосредственно с диска без синтаксического _source анализа . Это может произойти, например, при использовании запроса fields.
  2. Если _source отключено, сохраненные поля составляют возвращаемый документ.

Однако для хранения поля требуется дополнительное дисковое пространство, и есть причины, по которым в противном случае предпочтительнее сохранять _source включенным в elasticsearch, поэтому, вероятно, это полезно только для документов большего размера.

Аналогично, значения doc хранят поля, которые вы можете искать по документу. Кажется, что эти поля кластеризованы на диске по полю, а не по документу, что делает более эффективным извлечение большого количества одного и того же поля из разных документов (сортировка, агрегирование и т. Д.). Это делается вместо кэширования всех сохраненных полей в памяти для этих операций.

Мой вопрос … если у вас есть значения doc, есть ли еще допустимый вариант использования для хранения полей, и если да, то какой?

В конечном счете, я пытаюсь определить правильное сопоставление для полей, где doc_values кажется подходящим.

Ответ №1:

Я не знаю, получит ли elasticsearch значение поля для вас, если поле не сохранено, но для него включены значения DocValues . Все, что я могу вам сказать, это то, что, хотя для DocValues обычно принято представлять поля, хранящиеся в столбчатом виде (что, как вы указали, упрощает массовый поиск, необходимый для сортировки или даже запросов функций), lucene обрабатывает DocValues как отдельные поля сами по себе.

Таким образом, в то время как в elasticsearch вы включаете docvalues для поля foo и в итоге дублируете одни и те же данные, под lucene создаст docValues поле для каждого документа и скопирует в него данные из foo поля. Таким образом, на уровне lucene нет гарантии, что данные дублируются, но на уровне elasticsearch она есть.

Короче говоря, эта функция, о которой вы спрашиваете, может быть реализована (если она еще не реализована)

Комментарии:

1. Спасибо за некоторые разъяснения.

Ответ №2:

Это поздний ответ, но может помочь кому-то в будущем.

значения doc

значения doc_values индексируются по столбцам и используются для повышения производительности сортировки, агрегирования и доступа к скриптам. Вы можете получить значения doc, указав docvalue_fields в запросе.

Для тех полей, которые поддерживают эту функцию, doc_values они включены по умолчанию. Однако проанализированные строковые поля не поддерживаются doc_values . Поэтому, если поле имеет тип text, вы не можете получить значение doc этого поля.

Магазин

параметр store используется для хранения значения поля. Чтобы мы могли избежать синтаксического анализа _source для получения значения поля, указав stored_fields в запросе. AFAIK, вы можете хранить поля любого типа.

Однако эта функция требует дополнительного дискового пространства, поэтому по умолчанию она отключена. Если _source не является огромным документом, обычно вам не нужно включать эту функцию.

fielddata

fielddata используется для полей текстового типа. Как я упоминал выше, текстовое поле не поддерживает значения doc. Вместо этого, когда вы хотите получить значение поля (указав docvalue_fields в запросе) или выполнить агрегацию по текстовому полю, ElasticSearch загрузит инвертированный индекс с диска, инвертируя отношение term-doc, и кэширует результат в памяти. Чтобы мы могли получить значение поля.

Однако это недешевая операция и может потребовать много памяти. Таким образом, эта функция по умолчанию отключена. И вы должны использовать его с осторожностью!!!

Мой вопрос … если у вас есть значения doc, есть ли еще допустимый вариант использования для хранения полей, и если да, то какой?

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