Подтвердить что ты не робот

Зачем мне "хранить": "да" в поиске elastics?

Я действительно не понимаю, почему в ссылке основных типов он говорит в описаниях атрибутов (например, для числа):

  • store - установите значение yes, чтобы сохранить фактическое поле в индексе, а не хранить его. По умолчанию нет (обратите внимание, сам документ JSON хранится и может быть извлечен из него)
  • index - Установить значение no, если значение не должно индексироваться. В этом случае хранилище должно быть установлено в yes, так как если он не индексируется и не сохраняется, не имеет ничего общего с ним

Две смелые части, кажется, противоречат друг другу. Если "index":"no", "store":"no", я мог бы получить значение из источника. Это может быть полезно, если у меня есть поле, содержащее URL-адрес, например. Нет?

У меня был небольшой эксперимент, где у меня было два отображения, в одном поле было установлено значение "store":"yes", а в другом - "store":"no".

В обоих случаях я могу указать в моем запросе:

{"query":{"match_all":{}}, "fields":["my_test_field"]}

и я получил тот же ответ, возвращая поле.

Я думал, что если "store" установлено в "no", это означало бы, что я не смог бы восстановить конкретное поле, но должен был получить целое _source и проанализировать его на стороне клиента.

Итак, какая польза от установки "store" до "yes"? Является ли это только релевантным, если я исключаю поле из поля "_source" явно?

4b9b3361

Ответ 1

Я думал, что если "store" установлен в "no", это будет означать, что я не мог получить конкретное поле, но нужно было получить весь источник и проанализируйте его на стороне клиента.

Именно то, что elasticsearch делает для вас, когда поле не сохраняется (по умолчанию), и поле _source включено (по умолчанию тоже).

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

Когда вы сохраняете поле, которое выполняется в базовом lucene. Lucene - это инвертированный индекс, который позволяет быстро полнотекстовый поиск и возвращает идентификаторы документов, заданные текстовыми запросами. Помимо инвертированного индекса Lucene имеет какое-то хранилище, где значения поля могут быть сохранены для того, чтобы их можно было получить с учетом идентификатора документа. Вы обычно сохраняете в lucene поля, которые хотите вернуть в качестве результатов поиска. Elasticsearch не требует хранения каждого поля, которое вы хотите вернуть, поскольку оно всегда сохраняет по умолчанию каждый документ, который вы отправляете ему, поэтому он всегда может вернуть все, что вы отправили ему в качестве результата поиска.

В нескольких случаях может быть полезно хранить поля явно в lucene: когда поле _source отключено или когда мы хотим избежать его разбора, даже если разбор выполняется автоматически с помощью elasticsearch. Имейте в виду, что для извлечения многих сохраненных полей из lucene может потребоваться один поиск диска в поле, а при извлечении только _source из lucene и разбора его для получения необходимых полей - это всего лишь один поиск диска и только быстрее в большинстве случаев.

Ответ 2

По умолчанию _source (индексированный документ). Это означает, что при поиске вы можете получить реальный источник документа обратно. Более того ,asticsearch будет автоматически извлекать fields/objects из _source и возвращать их, если вы явно попросите об этом (а также, возможно, использовать его в других компонентах, таких как подсветка).

Вы можете указать, что определенное поле также сохраняется. Это означает, что данные для этого поля будут храниться самостоятельно. Это означает, что если вы запросите field1 (которое хранится) ,asticsearch определит, что оно сохранено, и загрузит его из индекса, а не из _source (при условии, что _source включен).

Когда вы хотите включить хранение определенных полей? В большинстве случаев нет. Извлечение _источника происходит быстро, а извлечение также быстро. Если у вас есть очень большие документы, где стоимость хранения _source или стоимость синтаксического анализа _source высока, вы можете явно отобразить некоторые поля для хранения вместо них.

Обратите внимание, что есть стоимость извлечения каждого сохраненного поля. Так, например, если у вас есть json с 10 полями с разумным размером, и вы отображаете все из них как сохраненные, и запрашиваете все из них, это означает загрузку каждого из них (больше дисков ищет), по сравнению с простой загрузкой _source (это одно поле, возможно сжатое).

Я получил этот ответ по ссылке ниже, на которую ответил shay.banon. Вы можете прочитать всю эту ветку, чтобы получить хорошее представление об этом. введите описание ссылки здесь