Каковы ограничения булевых запросов в 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' (см. Фильтр запросов):

Другие вопросы по тегам