Когда вы говорите, что хотите, чтобы рейтинг был в линейном времени, я думаю, вы хотите анализировать каждую строку в наборе только один раз.
Один из относительно простых способов сделать это - вычислить оценку на основе определенных вами правил.Конечно, чем больше у вас правил, тем дольше все это займет, но до тех пор, пока вы хорошо реализуете анализ, это не займет много времени даже для тысяч строк.
Примером может быть то, что вы говорите точносовпадения набирают 100 баллов, в то время как строка поиска n число раз достигает балла 10n, а при содержании ее в другом слове n раз получает 5n, и так далее.Если вы реализуете свои правила довольно оторванным образом, вы можете несколько раз настроить свои правила и посмотреть, насколько хорошо они работают в реальных поисках, пока вы не будете довольны точностью поиска.
Как только вы получитенабор баллов, вы можете использовать очень быстрый алгоритм сортировки, чтобы отсортировать результаты по порядку от лучшего к худшему.Конечно, вы исключили бы результаты с оценкой меньше x.
(Как примечание, этот метод очень облегчил бы реализацию расширенных функций поиска, таких как AND / OR / NOT, потому что выможно разделить анализ по поисковым запросам и объединить их оценки по результатам)