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

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 версии будет значительно ниже, чем в файловой. Эта проблема решается оптимизацией запроса. Делитесь своими достижениями.

Запрос Поиск

См. также

SALE! 15%

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

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

10000 руб.

02.09.2020    159493    874    399    

862

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

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

18.10.2024    9889    sergey279    18    

64

Запросы Программист Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

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

11.10.2024    5181    XilDen    36    

80

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

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

16.08.2024    7907    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2395    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    8692    implecs_team    6    

47

Запросы Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3391    andrey_sag    10    

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