Нечеткий поиск одним запросом

Программирование - Практика программирования

Использование механизма полнотекстового поиска в 1С не всегда оправдано, т.к. построение индекса и поддержание его в актуальном состоянии может значительно нагружать систему. Предлагаемая реализация нечеткого поиска методом N-грамм выполняется одним запросом, что позволяет производить поиск в любой таблице и не требует предварительного построения индекса.

СтрокаПоиска разбивается на подстроки длиной 3 символа. Вхождение каждой из подстрок проверяется в запросе оператором ПОДОБНО.

СтрокаПоиска = Лев(СтрокаПоиска, 300);
ДлинаСтроки = СтрДлина(СтрокаПоиска);

Если НЕ ДлинаСтроки > 2 Тогда
	Возврат;	
КонецЕсли;

ТекстПоиск = "0";
Для Индекс = 1 По ДлинаСтроки - 2 Цикл
	ТекстПоиск = ТекстПоиск + " + ВЫБОР КОГДА ИсточникДанных." + ИмяРеквизит + " ПОДОБНО ""%" + Сред(СтрокаПоиска, Индекс, 3) + "%"" ТОГДА 1 ИНАЧЕ 0 КОНЕЦ";	
КонецЦикла;

Нечеткость будет определяться как отношение количества найденных к общему количеству подстрок. Если найденная строка оказывается длиннее чем поисковая, то берется отношение к общему количеству подстрок в найденной строке.

ТекстРанг = "ВЫБОР КОГДА ПОДСТРОКА(ИсточникДанных." + ИмяРеквизит + ", " + (ДлинаСтроки + 1) + ", 3) = """" ТОГДА " + ДлинаСтроки + " ИНАЧЕ " + ТекстДерево + " КОНЕЦ";

Для определения длины найденной строки используется способ, описанный здесь.

Запрос.Текст = "
	|ВЫБРАТЬ ПЕРВЫЕ 20
	|	ИсточникДанных.Ссылка КАК Ссылка,
	|	ИсточникДанных." + ИмяРеквизит + " КАК Реквизит,
	|	100*(" + ТекстПоиск + ")/(" + ТекстРанг + " - 2) КАК Ранг
	|ИЗ " + ИмяИсточникДанных + " КАК ИсточникДанных
	|
	|УПОРЯДОЧИТЬ ПО
	|	Ранг УБЫВ";	

Вот и все. Такой запрос обрабатывает порядка 7000 строк в секунду в файловом варианте. Скорость выполнения запроса в SQL версии будет значительно ниже, чем в файловой. Эта проблема решается оптимизацией запроса. Делитесь своими достижениями.

Скачать файлы

Наименование Файл Версия Размер
Нечеткий поиск данных под УФ
.epf 8,65Kb
02.04.16
14
.epf 1.02 8,65Kb 14 Скачать
Нечеткий поиск файлов под УФ
.epf 9,28Kb
02.04.16
1
.epf 9,28Kb 1 Скачать
Нечеткий поиск метаданных ОФ+УФ
.epf 13,09Kb
02.04.16
3
.epf 13,09Kb 3 Скачать

См. также

Комментарии
1. Константин Куликов (Светлый ум) 202 28.12.15 06:22 Сейчас в теме
Еще пару плюшек в тему:
Некоторые полезные новичкам платформы 1С8.х приёмы работы с запросами:
1.Обработка пустого результата в самом запросе.
2.Построение многовариантного запроса.
3.Использование функции Значение.
4.Выгрузка результатов запроса в табличную часть.5.
5.Добавление необходимых значений в результат запроса.
6.По многочисленным просьбам пример чуть посложнее, результат запроса будет выгружен в регист остатков.
http://infostart.ru/public/80366/
2. Алексей 1 (AlX0id) 28.12.15 12:22 Сейчас в теме
Хм. А если, например, ищем строку "ССССССССС" - я правильно понимаю, что запрос выдаст одинаковую нечеткость при наличии в реквизитах поиска в разных записях "СССАААВВВ", "ССССССААА" и "ССССССССС"?
3. Vladimir Vasiliev (vasvl123) 56 28.12.15 13:17 Сейчас в теме
4. Алексей Роза (DoctorRoza) 29.12.15 13:50 Сейчас в теме
Не понятно, где такое использовать! Важную информацию нужно найти точно, а для маловажной подойдет и штатный полнотекстовый поиск!
5. Vladimir Vasiliev (vasvl123) 56 29.12.15 13:56 Сейчас в теме
(4) DoctorRoza, например, чтобы избежать дублей при наполнении справочника информацией из разных источников.
Оставьте свое сообщение