gifts2017

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

Опубликовал Vladimir Vasiliev (vasvl123) в раздел Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Константин Куликов (Светлый ум) 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) 28.12.15 13:17
4. Алексей Роза (DoctorRoza) 29.12.15 13:50
Не понятно, где такое использовать! Важную информацию нужно найти точно, а для маловажной подойдет и штатный полнотекстовый поиск!
5. Vladimir Vasiliev (vasvl123) 29.12.15 13:56
(4) DoctorRoza, например, чтобы избежать дублей при наполнении справочника информацией из разных источников.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа