Я новичок в Солре. Я читал, что Solr использует инвертированный индекс, который эффективен для быстрого поиска. Но если запрос включает сортировку, фасетирование, люди рекомендуют использовать docvalues. Итак, мой вопрос заключается в том, что такое docvalues и почему нам нужно использовать их в вышеуказанных случаях, а также почему инвертирование индекса неэффективно в вышеуказанных случаях. Пожалуйста, дайте подробное объяснение с примером, если это возможно.
Что такое DocValues в Solr.
Ответы (2)
Чтобы завершить ответ Гектора, я бы сказал, что инвертированный индекс эффективен для сопоставления документов с учетом основного поискового запроса.
Теперь, когда дело доходит до фильтрации/сортировки/огранивания, Solr работает с набором результатов, он уже имеет дело со списком совпадающих документов, и любой подзапрос будет пересекаться или объединяться с основным набором результатов.
На этом этапе мы можем логически представить себе ситуацию «документы к чему-либо»: например, если вам нужно отсортировать произвольный список docID по fieldX, вы фактически переупорядочите значения fieldX и получите соответствующие - отсортировано - идентификаторы документов.
Таким образом, если fieldCache создан с включенными значениями docValues для соответствующих полей, наличие готового к использованию сопоставления документа со значением значительно улучшит использование fieldCache.
Мы также можем (возможно, несколько неточно) ссылаться на теплый кеш против холодного кеша.
Короткий ответ заключается в том, что DocValues — это оптимизация, помогающая использовать память и производительность для некоторых других функций Solr, которые люди связывают с поиском.
DocValues — это способ внутренней записи значений полей, который более эффективен для некоторых целей, таких как сортировка и фасетирование, чем традиционная индексация.
Почему DocValues?
Стандартный способ, которым Solr строит индекс, — инвертированный индекс. Этот стиль создает список терминов, найденных во всех документах в указателе, и рядом с каждым термином находится список документов, в которых термин встречается (а также количество раз, которое термин встречается в этом документе). Это делает поиск очень быстрым — поскольку пользователи выполняют поиск по терминам, наличие готового списка значений терминов и документов ускоряет процесс запроса.
Для других функций, которые мы теперь обычно связываем с поиском, таких как сортировка, фасетирование и выделение, этот подход не очень эффективен. Механизм фасетирования, например, должен искать каждый термин, который появляется в каждом документе, который будет составлять набор результатов, и извлекать идентификаторы документов, чтобы построить список фасетов. В Solr это сохраняется в памяти и может загружаться медленно (в зависимости от количества документов, терминов и т. д.).
В Lucene 4.0 был представлен новый подход. Поля DocValue теперь являются полями, ориентированными на столбцы, с сопоставлением документа и значения, созданным во время индексирования. Этот подход обещает снизить некоторые требования к памяти для fieldCache и значительно ускорить поиск для фасетирования, сортировки и группировки.