Сортировка результатов поиска товаров в 1С

1С Предприятие / 01.10.2019 / Опубликовано в: Заметки

Алгоритм сортировки результатов поиска товаров для 1С: Предприятие 8.3

Сортировка номенклатуры по релевантности поисковому запросу. Сортировка с учетом вхождения поискового запроса в код или наименования товара с учетом возможного частичного вхождения поисковой строки в код или наименование

Для одного из наших клиентов была разработана форма подбора товаров. В этой форме подбора пользователь набирал в строке поиска код или наименование или часть наименования товара и ниже в форме подбора ему предлагались все товары которые нашли по коду или наименованию. При этом, например по запросу уголь в начале списка оказывались товары "Емкость прямоугольная", а товары типа "Уголь древесный" были в конце списка.

Для того что бы отсортировать найденную номенклатуру, каждому товару был присвоен индекс релевантности чем он выше тем больше этот товар подходит поисковому запросу. После этого просто сортируем результаты по этому индексу и выводим.

табВозврата = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.Прямой);

Если ВыполнятьСортировку Тогда 

	табВозврата.Колонки.Добавить("ИндексСортировки");

	Для каждого стрТаблицы Из табВозврата Цикл
		стрТаблицы.ИндексСортировки = ПолучитьИндексСортировки(стрТаблицы.Код + ","  + стрТаблицы.Номенклатура.Наименование);
	КонецЦикла;

	табВозврата.Сортировать("ИндексСортировки Убыв");
	
КонецЕсли;

Ну и сама функция оценивающая соответствие номенклатуры поисковому запросу

Функция ПолучитьИндексСортировки(стрНаименование)

	ИндексСортировки = 0;
	СловоПоиска = ВРег(НоменклатураПоиск);
	
	СтрокаСРазделителями = СокрЛП(стрНаименование);
	СтрокаСРазделителями = СтрЗаменить(СтрокаСРазделителями, " ", ",");
	СтрокаСРазделителями = СтрЗаменить(СтрокаСРазделителями, "-", ",");
	СтрокаСРазделителями = СтрЗаменить(СтрокаСРазделителями, ".", ",");
	СтрокаСРазделителями = СтрЗаменить(СтрокаСРазделителями, "*", ",");
	СтрокаСРазделителями = СтрЗаменить(СтрокаСРазделителями, """", ",");
	СтрокаСРазделителями = СтрЗаменить(СтрокаСРазделителями, ",,,", ",");
	СтрокаСРазделителями = СтрЗаменить(СтрокаСРазделителями, ",,", ",");
	СтрокаСРазделителями = СтрЗаменить(СтрокаСРазделителями, ",", Символы.ПС);
	
	МассивСлов = СтрРазделить(СтрокаСРазделителями, Символы.ПС, Ложь); 
	
	Для Индекс = 0 По МассивСлов.Количество() - 1 Цикл 
		СтрокаДляОценки = ВРег(МассивСлов[Индекс]);
		
		ОценкаСтроки = 0;
		Если СтрокаДляОценки = СловоПоиска Тогда
			ОценкаСтроки = 10;
		ИначеЕсли СтрНачинаетсяС(СтрокаДляОценки, СловоПоиска) Тогда
			ОценкаСтроки = 7;
		ИначеЕсли СтрЗаканчиваетсяНа(СтрокаДляОценки, СловоПоиска) Тогда
			ОценкаСтроки = 5;
		ИначеЕсли СтрНайти(СтрокаДляОценки, СловоПоиска) > 0 Тогда
			ОценкаСтроки = 3;
		КонецЕсли; 

		Если СтрДлина(СловоПоиска) > 3 И Индекс <= 2 Тогда 
			ИндексСортировки = ИндексСортировки + 30;
		КонецЕсли;
		
		ИндексСортировки = ИндексСортировки + Макс(10-Индекс, 1)*ОценкаСтроки;
		
	КонецЦикла;
	
	Возврат ИндексСортировки;

КонецФункции // ПолучитьИндексСортировки()

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

Результат поиска товаров поле применения сортировки

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

НАВЕРХ