У меня есть база данных Oracle со всеми «данными» и индекс Solr, где индексируются все эти данные. В идеале я хочу иметь возможность выполнять такие запросы:
select * from data_table где id in ([результаты запроса solr для 'строки поиска']);
Однако возникает одна ключевая проблема:
Oracle не допустит более 1000 элементов в массиве элементов в предложении «in» (БОЛЬШОЕ ПРЕДЛОЖЕНИЕ, так как список объектов, которые я нахожу, очень часто> 1000 и обычно будет около 50-200 тыс. Элементов)
Я попытался обойти эту проблему, используя функцию «split», которая будет принимать строку значений, разделенных запятыми, и разбивать их на элементы массива, но затем я установлю ограничение в 4000 знаков для параметра функции с помощью SQL ( PL / SQL равен 32 тыс. Символов, но в некоторых случаях он все еще СЛИШКОМ ограничивает результаты в 80 000+)
Я также сталкиваюсь с проблемами производительности, используя WHERE IN (....), мне говорят, что это вызывает очень медленный запрос, даже когда указанное поле является индексированным полем?
Я пытался сделать рекурсивное "ИЛИ" для ограничения в 1000 элементов (иначе: идентификатор в (1 ... 1000 или (идентификатор в (1001 ... 2000)) или идентификатор в (2001 ... .3000))) - и это работает, но очень медленно.
Я думаю, что мне следует загрузить JAR-файлы Solr-клиента в Oracle и написать функцию Oracle на Java, которая будет вызывать solr и передавать результаты в виде списка, чтобы я мог сделать что-то вроде:
select * from data_table, где id in (select * from table (runSolrQuery ('my query text)))));
Это довольно сложно, и я не уверен, что это даже возможно.
Вещи, которые я не могу сделать:
- Хранить полные данные в Solr (security +
пределы хранения)
- Пользователь Solr as
Контроллер пагинации и заказа
(вот почему я выбираю данные из
БД)
Поэтому мне нужно выработать гибридный подход, в котором Solr действительно действует как поставщик полнотекстового поиска для Oracle. Помогите! Кто-нибудь сталкивался с этим?