Я очень хорошо использовал Lucene, чтобы предоставить решение, где мои пользователи могут очень быстро запросить множество записей (более 100 миллионов).У пользователей есть большая форма с множеством различных полей, из которых они могут выбирать.У них также есть опция «расширенного поиска», где они могут создавать свои собственные запросы, которые поддерживают вложенную логику с операторами AND, OR и NOT.
Я использую MSSQL в качестве основного хранилища данных, а затем индексирую данные в Lucene,Запрос Lucene возвращает мне список идентификаторов, которые я затем запрашиваю непосредственно из базы данных MSSQL, что позволяет избежать сложных (медленных) планов запросов, которые могут быть результатом попытки эквивалентного запроса непосредственно к базе данных.С небольшим планированием и дизайном, Lucene показал себя очень способным выполнять очень быстрые запросы, когда запрос имеет значительную сложность, например ((A AND B) OR (B AND C AND D)) OR (A[X TO Y] AND K) OR (Q,W,E,R,T,Y,U,I,O)
.Вы получите картину.
Проблема, с которой я столкнулся, - это проблема отношений.Когда запись имеет связанные атрибуты K
, каждый из которых имеет свои собственные атрибуты J
, и пользователь пытается выполнить поиск, определяющий множество условий J для одного K, и более одного из этих условий имеет числовой характер,внезапно становится очевидной необходимость в реляционном хранилище, поскольку на самом деле не существует эффективного способа маркировать взаимосвязь между одним числовым атрибутом и другим.
Очевидно, что есть несколько отличных решений для хранения огромных объемов данных ипо-прежнему быстро запрашивать на базовом уровне.Я хочу знать, есть ли у вас какие-либо рекомендации относительно того, какое из этих решений также способно выполнять очень быстрый поиск, когда запрос часто имеет определенный уровень сложности, как описано ранее.