СтрокаПоиска разбивается на подстроки длиной 3 символа. Вхождение каждой из подстрок проверяется в запросе оператором ПОДОБНО.
СтрокаПоиска = Лев(СтрокаПоиска, 300);
ДлинаСтроки = СтрДлина(СтрокаПоиска);
Если НЕ ДлинаСтроки > 2 Тогда
Возврат;
КонецЕсли;
ТекстПоиск = "0";
Для Индекс = 1 По ДлинаСтроки - 2 Цикл
ТекстПоиск = ТекстПоиск + " + ВЫБОР КОГДА ИсточникДанных." + ИмяРеквизит + " ПОДОБНО ""%" + Сред(СтрокаПоиска, Индекс, 3) + "%"" ТОГДА 1 ИНАЧЕ 0 КОНЕЦ";
КонецЦикла;
Нечеткость будет определяться как отношение количества найденных к общему количеству подстрок. Если найденная строка оказывается длиннее чем поисковая, то берется отношение к общему количеству подстрок в найденной строке.
ТекстРанг = "ВЫБОР КОГДА ПОДСТРОКА(ИсточникДанных." + ИмяРеквизит + ", " + (ДлинаСтроки + 1) + ", 3) = """" ТОГДА " + ДлинаСтроки + " ИНАЧЕ " + ТекстДерево + " КОНЕЦ";
Для определения длины найденной строки используется способ, описанный здесь.
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЕ 20
| ИсточникДанных.Ссылка КАК Ссылка,
| ИсточникДанных." + ИмяРеквизит + " КАК Реквизит,
| 100*(" + ТекстПоиск + ")/(" + ТекстРанг + " - 2) КАК Ранг
|ИЗ " + ИмяИсточникДанных + " КАК ИсточникДанных
|
|УПОРЯДОЧИТЬ ПО
| Ранг УБЫВ";
Вот и все. Такой запрос обрабатывает порядка 7000 строк в секунду в файловом варианте. Скорость выполнения запроса в SQL версии будет значительно ниже, чем в файловой. Эта проблема решается оптимизацией запроса. Делитесь своими достижениями.