Интересно, как реализованы системы для полнотекстового поиска, чтобы можно было запрашивать
миллионы записей очень быстро?
Обратите внимание: я не говорю о системах, которые токенизируют контент, разделяя его в пробелах, а о системах, которые способны
запросить даже детали из середины токенов (что является настоящим вызовом).
Справочная информация
Я экспериментировал с самодельным строковым кешером (использующим Java), который умеет искать
для строк, учитывая подстроку в качестве запроса. Подстрока не требуется
быть в начале потенциальных найденных строк.
Работает с огромным массивом строк.
Кэширование выполняется с использованием
TreeMap<Character,TreeSet<String>>
.
Добавление записи
Для каждого уникального символа в добавляемой строке:
Получите набор для этого символа и добавьте к нему строку.
Пример: «test» сначала разбивается на «t», «e», «s».
Затем мы получаем наборы для тех,
три клавиши и добавьте «тест» к каждому набору.
Querieng
Запросы выполняются путем разделения запроса на уникальные символы,
получить для каждого символа Set<String>
, построить пересечение
все наборы и, наконец, найдите пересечение, используя contains()
, чтобы убедиться, что
порядок символов запроса.
Benchmark
На машине 3GHz я добавил 2'000'000 строк со средней длиной
10 , случайное содержание.
Выполнено 100 запросов. Потребовалось: Мин: 0,4 с, Среднее: 0,5 с, Макс: 0,6 с .
1,5 ГБ памяти было потрачено впустую.