Я работаю над структурированным средством просмотра документов, где каждый документ Solr является "разделом" или "абзацем" в большом наборе легальных документов, наряду с различными метаданными. У меня есть корпус, который, вероятно, представит 10^12 или больше этих разделов. Я хочу предоставить подкачку страниц пользователю так, чтобы они могли просмотреть N этих разделов за один раз в sort_path
порядок.
Теперь проблема: Даже если sort_path
индексируется, существуют документы, добавляемые и удаленные все время. Простой вид и решение для подкачки страниц закончатся с пользователями, возможно пропускающими разделы или переходящими вокруг в упорядочивании неожиданно, даже когда они нигде не около документа того, чтобы быть, добавил/удалил в упорядочивании; это поведение было бы недопустимо.
Пример: Я высказываю "следующее" мнение ссылки страницы в чем-то как ...sort_order=sort_path+desc&rows=N&start:12345
. Затем в то время как пользователь просматривает страницу, документ рано в порядке sort_path удален. Теперь, когда они выбирают следующие строки N, они пропустят 1 документ без знания.
Так, учитывая у меня есть a sort_path
поле, которое заказывает разделы, фронтэнд, должно смочь попросить разделы N "прежде" или "после" sort_path:/X/Y/Z
, вместо того, чтобы просить rows:N
с start:12345
. Я понятия не имею, как представить это в запросе Solr.
Я могу продвигать края Solr немного далеко, и он может закончить тем, что имел больше смысла хранить представления этих документов "раздела" оба в Solr (для довольного поиски, которые Solr является потрясающим в), и RDBMS (для упорядочивания и индексации). Я надеялся избежать, чтобы, и этот вид запроса все еще был ужасным в базе данных, поэтому возможно, Вы получили некоторое представление. (Спасибо!)
Оказывается, что диапазоны solr, объединенные с сортировкой, могут дать мне точно, в чем я нуждаюсь. На индексируемом поле я могу сделать что-то как
sort_path:["/A/B/C" TO *]
получить "следующие" разделы N и сделать
sort_path:[* TO "/A/B/C"]
упорядочивание sort_path:desc
и затем инвертируя возвращенный блок для получения предыдущих разделов N. Я собираюсь проверить производительность этого решения, но это кажется жизнеспособным.
Это не совсем специфическая проблема Solr, а общая проблема с пагинацией любого внешнего источника данных, потому что источник данных имеет независимое состояние от (веб-) приложения. Например, это также происходит в реляционных базах данных. Вот хорошее освещение проблемы пагинации в реляционных базах данных, а также возможные решения. Большинство веб-приложений / веб-сайтов используют первое решение: "Повторять запрос для каждого нового запроса", поскольку другие решения намного сложнее и не масштабируются, но это страдает от описанной вами проблемы. Просмотрите вопросы на stackoverflow.com некоторое время, и вы заметите это, поскольку вопросы создаются постоянно.
В вашем случае я бы рассмотрел возможность моделирования документов Solr как целых юридических документов, а не их отдельных разделов. Вы получите гораздо меньше документов (поэтому скорость вставок/удалений будет медленнее) и сможете использовать параметры подсветки для получения фрагментов разделов, соответствующих запросу пользователя.
Другим вариантом может быть уменьшение скорости фиксации, но это может привести к менее чем идеальной свежести документа.