В приложении, над которым я работал, есть пользователь search API
, который будет выполнять поиск пользователя на основе Name,Address,DateOfBirth,and Pincode
. Из них только pincode
является полем mandatory
. И любые 2 other data (Date of birth, address, name)
можно отправить. Также по одному запросу клиенты могут искать нескольких пользователей. Таким образом, для каждого ключа поиска мы должны дать ответ, подобный найденному USER
объекту или NOT FOUND
ответу.
Так работает наш алгоритм для каждого ключа поиска.
- Fetch весь профиль пользователя из таблицы с указанным пин-кодом.
- Выполните итерацию пользователей, начиная с шага 1, и проверьте, совпадают ли любые две из даты рождения, имени, адреса, то есть это правильный кандидат. Мы делаем это, используя предикат, как показано ниже
stream (profiles.spliterator (), false) .filter (new UserSearchPredicate (key)).
Этот предикат будет проверьте, совпадают ли любые 2 значения, и если да, верните true.
Проверьте, что только один пользователь, которого мы получили на шаге 2, СДЕЛАН. В противном случае Исключение
Возвращение пользователя.
Вышеприведенный алгоритм имеет проблему, он ищет таблицу пользователей по пин-коду. Всего в таблице 20 миллионов записей, что делает запрос медленным. С одним пин-кодом мы можем получить 16000 или более записей, повторяя это - еще одна bottle область шеи. ТАКЖЕ это должно быть сделано для всех ключей поиска. В одном запросе может быть 50 или более ключей поиска, на ответ на которые ушла почти минута.
Что мы сделали:
Индексирование столбцов Pincode правильно СДЕЛАНО в базе данных. Мы используем oracle
БД. Также пробовал parallel
обработка, а также. У параллельной обработки есть проблема с DB connections in connection pool
, которая не является решением, к которому мы пришли.
Добавление еще одного столбца к запросу логически невозможно, потому что, если я добавлю имя, тогда where pincode='' and name=''
будет query
. Но соответствующей записи может быть пин-код и дата рождения. Кроме пин-кода ничего не является обязательным.
Вопрос: Есть ли лучший способ справиться с этой проблемой. Особенно в поисках лучшего algorithm
. пожалуйста, помогите.