Каковы ограничения булевых запросов в Lucene?
У меня есть требование найти элементы в индексе Lucene, которые имеют два основных критерия: 1. соответствовать определенной строке, называемой "отношением", 2. попадать в список разрешений "группы предоставления".
Группа разрешений определяет подмножество элементов, доступных для члена этой группы, и очень похоже на роль авторизации.
Все документы в индексе Lucene имеют поле 'отношение' и, для простоты, одно или несколько полей 'grant-group'.
Так, например, пользователь может искать "foobar", и этот пользователь может быть членом групп a, b, c. Например, в foobar есть группы грантов a, p, q, s
Запрос будет, в основном, "соответствовать 'foobar' И (ИЛИ b ИЛИ c).
Это должно работать в соответствии с документацией Lucene.
У меня такой вопрос: как далеко вы можете пойти со 2-й частью логического запроса, а именно с частью после "И"? Причина для того, чтобы спросить, заключается в следующем: я собираюсь сделать небольшое технико-экономическое обоснование, и частью требований является необходимость поддержки МНОГИХ групп в предложении "ИЛИ". Возможно до 200 или 300 групп.
Будет ли заметное снижение производительности?
Благодарю.
3 ответа
Из этого обзора производительности люцена:
Другими словами: для стандартных дизъюнктивных (OR) запросов количество предложений не влияет на производительность, за исключением случаев, когда большее количество документов является потенциальным совпадением.
Как упомянул Ави, вы достигнете предела в 1024 пункта.
Вы должны измерить, что бы вы ни делали. Я думаю, что вы, вероятно, должны быть в порядке с 200-300 группами. Я думаю, что ограничение по умолчанию для предложений в BooleanQuery составляет 1024, но это также можно изменить.
Если вы используете Solr, а не прямой Lucene, я бы порекомендовал поместить часть группы грантов в качестве filterQuery, чтобы ее можно было кэшировать.
Я не уверен, сколько элементов вы можете указать в OR, возможно, вам следует сделать простое подтверждение концепции, просто чтобы посмотреть, как она работает.
Кроме того, если вы используете Solr, я бы не стал изменять исходный запрос для реализации ваших требований (это повлияло бы на оценку по соответствующим документам), а использовал бы параметр 'fq' (см. Фильтр запросов):