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

02.04.16

Разработка - Запросы

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Нечеткий поиск данных под УФ
.epf 8,65Kb ver:1.02
76
76 Скачать (1 SM) Купить за 1 850 руб.
Нечеткий поиск файлов под УФ
.epf 9,28Kb
4
4 Скачать (1 SM) Купить за 1 850 руб.
Нечеткий поиск метаданных ОФ+УФ
.epf 13,09Kb
21
21 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

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

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

Запрос Поиск

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

15500 руб.

02.09.2020    184102    1024    403    

967

Обновление 1С Запросы Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Данный инструмент помогает анализировать доработанную конфигурацию после обновления на новый релиз и находить «битые» тексты запросов, в которых участвуют несуществующие в новом релизе метаданные.

2 стартмани

06.02.2025    2170    17    XilDen    26    

36

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

В статье приведена удобная возможность отладки исполняемого запроса динамического списка.

03.12.2024    5668    artemusII    11    

23

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    13087    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    8173    XilDen    36    

90

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    3164    PROSTO-1C    0    

23

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    10759    user1840182    5    

29
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Светлый ум 454 28.12.15 06:22 Сейчас в теме
Еще пару плюшек в тему:
Некоторые полезные новичкам платформы 1С8.х приёмы работы с запросами:
1.Обработка пустого результата в самом запросе.
2.Построение многовариантного запроса.
3.Использование функции Значение.
4.Выгрузка результатов запроса в табличную часть.5.
5.Добавление необходимых значений в результат запроса.
6.По многочисленным просьбам пример чуть посложнее, результат запроса будет выгружен в регист остатков.
http://infostart.ru/public/80366/
2. AlX0id 28.12.15 12:22 Сейчас в теме
Хм. А если, например, ищем строку "ССССССССС" - я правильно понимаю, что запрос выдаст одинаковую нечеткость при наличии в реквизитах поиска в разных записях "СССАААВВВ", "ССССССААА" и "ССССССССС"?
3. vasvl123 120 28.12.15 13:17 Сейчас в теме
4. DoctorRoza 29.12.15 13:50 Сейчас в теме
Не понятно, где такое использовать! Важную информацию нужно найти точно, а для маловажной подойдет и штатный полнотекстовый поиск!
5. vasvl123 120 29.12.15 13:56 Сейчас в теме
(4) DoctorRoza, например, чтобы избежать дублей при наполнении справочника информацией из разных источников.
6. NN2P 421 17.11.17 20:15 Сейчас в теме
Крах при поиске:
Монитор Benq 21.5" GW2270 черный VA LED 5ms 16:9 DVI Mat 20000000:1 250cd

с ошибкой
{ВнешняяОбработка.НечеткийПоиск.Форма.Форма.Форма(43)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос.Выполнить();
по причине:
{(5, 1360)}: Синтаксическая ошибка "%""
100*(0 + ВЫБОР КОГДА ИсточникДанных.НаименованиеПолное ПОДОБНО "%Мон%" ТОГДА 1 ИНАЧЕ 0 КОНЕЦ + ВЫБОР КОГДА ИсточникДанных.НаименованиеПолное ПОДОБНО "%они%" ТОГДА 1 ИНАЧЕ 0 КОНЕЦ + ВЫБОР КОГДА ИсточникДанных.НаименованиеП
7. vasvl123 120 18.11.17 20:46 Сейчас в теме
(6)
Монитор Benq 21.5" GW2270 черный VA LED 5ms 16:9 DVI Mat 20000000:1 250cd
Запрос ломает кавычка в стоке поиска.
8. Artem1405 25 19.05.18 20:26 Сейчас в теме
скачал "Нечеткий поиск данных под УФ" обработка под обычные формы, дайте под УФ пожалуйста.
9. Artem1405 25 20.05.18 07:49 Сейчас в теме
(8) Извиняюсь, запутался в обработках. Все верно обработка для управляемой формы.
Оставьте свое сообщение