#java #lucene #elasticsearch
#java #lucene #elasticsearch
Вопрос:
Насколько я понимаю, хранение поля в elasticsearch служит двум целям:
- Поле может быть извлечено непосредственно с диска без синтаксического
_source
анализа . Это может произойти, например, при использовании запроса fields. - Если
_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 может быть плохой идеей.