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

В чем разница между _source и _all в Elasticsearch

Разница между двумя, кто держит все поля, ускользает от меня.

Если у моего документа есть:

{"mydoc":
  {"properties":
      {"name":{"type":"string","store":"true"}},
      {"number":{"type":"long","store":"false"}},
      {"title":{"type":"string","include_in_all":"false","store":"true"}}

  }
}

Я понимаю, что _source - это поле, в котором есть все поля. Но так ли? Означает ли это, что "имя" сохраняется несколько раз (дважды? В _src и в _all), увеличивая объем дискового пространства, которое занимает документ?

Является ли "имя" сохранено один раз для поля, один раз для _source и один раз для _all? как насчет "числа", он хранится во всех, хотя и не в источнике?

Когда мне следует использовать _source в моем запросе и когда _all?

Что такое usecase, где я могу отключить "_all", и какая функциональность мне тогда будет отказана?

4b9b3361

Ответ 1

Это почти так же, как разница между индексированными полями и сохраненными полями в lucene.

Вы используете индексированные поля, когда хотите их искать, в то время как вы сохраняете поля, которые хотите вернуть в качестве результатов поиска.

Поле _source предназначено для хранения всего исходного документа, который был первоначально отправлен в elasticsearch. Он используется как результат поиска, который должен быть восстановлен. Вы не можете найти его. Фактически это хранимое поле в lucene и не индексируется.

Поле _all предназначено для индексации всего содержимого, которое поступает из всех полей, из которых состоят ваши документы. Вы можете искать на нем, но никогда не возвращать его, поскольку он индексируется, но не сохраняется в lucene.

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

Вы никогда не будете использовать поле _source в своих запросах, только когда вы получите результаты, начиная с того, что elasticsearch возвращает по умолчанию. Есть несколько функций, которые зависят от поля _source, которое вы теряете, если его отключили. Одним из них является API обновления. Кроме того, если вы отключите его, вам необходимо запомнить как store:yes в вашем отображении все поля, которые вы хотите вернуть в качестве результатов поиска. Я бы сказал, что не отключите его, если это вас не беспокоит, так как оно действительно полезно во многих случаях. Еще одна распространенная практика - когда вам нужно переиндексировать свои данные; вы можете просто извлечь все свои документы из самого elasticsearch и просто отправить их другому индексу.

С другой стороны, поле _all является только полем улова по умолчанию, которое вы можете использовать, когда хотите просто искать по всем доступным полям, и вы не хотите указывать их все в своих запросах. Это удобно, но я не стал бы слишком полагаться на это на производство, где лучше запускать более сложные запросы в разных областях с разными весами. Вы можете отключить его, если вы его не используете, это будет иметь меньшее влияние, чем отключить _source по моему мнению.