Если вы создаете класс для каждого типа менеджера поиска, например, Lucene, каждый из которых реализует интерфейс асинхронного поиска, который вы сможете использовать только с «обычными» Java-компонентами.
Я бы подумал о следующих строках:
Создайте потокобезопасную коллекцию (набор, если вы не хотите дублировать поиск) с правильными свойствами, в зависимости от того, хотите ли вы упорядочить, будете ли они получать произвольный доступ к данным внутри него или просто выполнять итерацию. Обычно какая структура данных использовать вещи.
Интерфейс с методом поиска запуска, который принимает коллекцию в качестве параметра - возможно, еще один метод для проверки завершения поиска. Или другие средства, основанные на слушателе, какие бы методы вы ни выбрали.
Реализации этого интерфейса для каждого метода поиска. Каждый вызов метода поиска создает собственный поток при вызове, который выполняет поиск, который помещает результаты поиска в предоставленную коллекцию.
Менеджер поиска просто перебирает все известные поисковые системы (где-то зарегистрированные) и запускает поиск по каждой из них по заданному запросу.
Надеюсь, это поможет.