Примените идею
фильтра Блума:
выберите 10-30 признаков, легко вычисляемых как для запроса, так и для содержимого, которые дают примерно одинаковое распределение true/false на вашем множестве данных. Поиск отфильтруйте по тем записям, где встречаются признаки, обнаруженные в запросе.
Например, можно выбрать признаки вида «существует подстрока из N символов, сумма которых равна K». Очевидно, если такая подстрока присутствует в запросе, то она обязана присутствовать и в искомых записях. Ради интереса я провел эксперимент на jpg-аватарках размером в среднем 4К и подобрал такие пары N и К: (3, 97), (3 98), (3, 99), (3, 102), (3, 104), (3, 105), (4, 161), (4, 173), (4, 178), (5, 247), (5, 251), (5, 255)…