Поиск в справочниках по "неточному" наименованию

Опубликовал Torin99 в раздел Администрирование - Поиск данных

Часто возникает задача найти элемент справочника по его "неточному" наименованию.
Это может быть:
- при загрузке данных из другой базы или внешнего файла
- при проверке на возможность "двойников" в справочнике
- ....

Обработка пытется решить эту проблему с использованием нескольких способов поиска с постепенным увеличением их сложности

Данная обработка производит поиск в несколько этапов по уровню возрастания сложности:
1 На первом этапе просто ищется  элемент справочника  по наименованию 

2 Если элемент  не найден, строка наименования разбивается на слова и ищется запросом по конструкции  "где наименование подобно "слово1%слово2%слово3%..." . Таким образом решается проблема "лишних пробелов" между словами 

3 Если элемент  не найден, составляется массив всех возможных перестановок слов и процедура п.2 повторяется для каждой из возможных перестановок

4. Если   элемент  не найден, используется поиск по неточному наименованию с использованием внешней компоненты StrMatch.dll. Компонента "зашита" в макет и не  требует копирования и регистрации себя на компьютере пользователя ПРИ УСЛОВИИ НАЛИЧИЯ У ПОЛЬЗОВАТЕЛЯ ПРАВ ЛОКАЛЬНОГО АДМИНИСТРАТОРА. Если у пользователя таких прав нет, тогда необходимо выгрузить  компоненту в файл с помощью кнопки "выгрузить ДЛЛ" и попросить вашего системного администратора поместить ее в папку исполняемых файлов 1С и зарегистрировать командой RegSvr32. 

Файлы

Наименование Файл Дата Размер Кол. Скачив.
неточныйПоиск.epf
.epf 262,46Kb
19.12.12
75
.epf 19.12.12 262,46Kb 75 Скачать

См. также

Комментарии

1. aet 19.12.2012 16:39
А почему у Вас 4 пункт через dll, а не средствами полнотекстового поиска 1с?
# Ответить
2. Torin99 19.12.2012 16:58
Видимо, потому что не очень понимаю как сделать такую работу "средствами полнотекстового поиска". Насколько я понимаю, средства полнотекстового поиска предлагают функционал, схожий с поиском по шаблонам -- это меня не устраивает. ДЛЛ-ка ищет не по шаблону, она предлагает некую метрику подобия двух тестовых строк -- в частности эта ДЛЛ-ка предлагает n-граммную метрику -- это значительно лучше чем любые шаблоны. Сейчас я пишу ДЛЛ-ку на основе т.н. "расстояния Левенштейна" -- она будет работать несколько лучше...
# Ответить
3. Torin99 19.12.2012 17:13
Вот смотрите, цитата
"# - нечеткий поиск слов с заданным количеством отличий от указанного (если не указано, то = 1); пример: запрос "#Система" найдет "систама", "сивтема"; запрос "Система#2" найдет "ситтама", "сеттема";"

А вот найдет ли запрос "Система#2 слово "ситемас" и какое с точки зрения механизма полнотекстового поиска здесь количество отличий? По Левенштейну - ровно 2.
Ответили: (4)
# Ответить
4. aet 19.12.2012 17:41
(3) в нулевом сообщении вопрос, не критика. Думаю, вдруг фишка есть, а неудобства dll известны. Если б я сам хорошо знал механизм полнотекстового поиска, как-то ниразу на 8ке не понадобился. Почему-то думаю там тот же Левенштейн, не встречал что внутри.
Как-то просто написал на 1С его алгоритм для себя, могу найти/кинуть если интересно :)
Ответили: (5)
# Ответить
5. Torin99 19.12.2012 17:51
(4) aet, Вы написали функцию вычисления "расстояния Левенштейна" для двух произвольных строк на 1с-ке? Конечно, нужно. Можно мне на мою почту -- torin11@gmail.com? Если воспользуюсь в следующей обработке, обязательно укажу Вас как соавтора.
А там, к сожалению, не Левенштейн. Во всяком случае "Система#2 слово "ситемас" НЕ НАХОДИТ - а по Левенштейну должно находить...
Кстати, а Вы знаете что Владимир Иосифович Левенштейн до сих пор жив, относительно здоров и спокойно работает в Келдышевском институте?
Ответили: (6) (7)
# Ответить
6. Yashazz 19.12.2012 18:06
(5) Ну, я писал расстояние Левенштейна на 1С. И полнотекстовый поиск по таблице значений делал. Ещё на 8.1 был грех. Если надо, могу покопаться и прислать.
# Ответить
7. aet 19.12.2012 18:34
(5) Отправил почтой, там функция небольшая, можно тут сообщением выложить.
О личности В.И. Левенштейна к сожалению ничего не знал, спасибо.
# Ответить
8. Torin99 19.12.2012 19:55
Получил, смотрю...
Большое спасибо!!!
# Ответить
9. petrov_al 20.12.2012 14:42
В синтаксе посмотрите МенеджерПолнотекстовогоПоиска и его возможности, скорее все большая часть того что вы придумываете там уже заложена. Ниже отрывок из справки.

МенеджерПолнотекстовогоПоиска.СоздатьСписок (FullTextSearchManager.CreateList)
МенеджерПолнотекстовогоПоиска (FullTextSearchManager)
СоздатьСписок (CreateList)
Синтаксис:

СоздатьСписок(<СтрокаПоиска>, <РазмерПорции>)
Параметры:

<СтрокаПоиска> (необязательный)

Тип: Строка.
Строка для поиска в реквизитах данных (содержит как слова, которые нужно найти, так и поисковые операторы - И, ИЛИ, НЕ, РЯДОМ, скобки, кавычки).
Поиск может осуществляться по нескольким словам, с использованием поисковых операторов и поиском по точной фразе.
В строке ввода допускается использование следующих поисковых операторов:
И (AND или #) - поиск данных, содержащих все слова; пример: "запись И документ" - в реквизитах должны быть и "проведение" и "документ" (с учетом морфологии);
ИЛИ (OR или | или ,) - поиск хотя бы одного слова из перечисленных; пример: "запись ИЛИ документ" - в реквизитах должно быть хотя бы одно из слов "запись" или "документ";
НЕ (NOT или ~) - поиск данных, в реквизитах которых есть первое слово, но нет второго; пример: "закрытие НЕ месяц" - будут найдены все, содержащие "закрытие", но не содержащие слова "месяц". Использование "~" в начале строки не допускается;
РЯДОМ/n (NEAR/[+/-]n) - поиск данных, содержащих в одном реквизите указанные слова с учетом морфологии на расстоянии n слов между словами.
Знак указывает, в каком направлении от первого слова будет искаться второе слово ("+" – после первого; "-" – до первого слова).
Если знак не указан, то будет найдены данные, содержащие указанные слова на дистанции n слов друг о друга. Порядок слов не имеет значения.
"фен РЯДОМ/3 воздух" - будут найдены данные, в которых "воздух" находится не более 3-х слов до или после "фен";
фен РЯДОМ/+3 воздух - будут найдены данные, в которых "воздух" находится не более 3-х слов после "фен";
фен РЯДОМ/-3 воздух - будут найдены данные, в которых "воздух" находится не более 3-х слов перед "фен".
РЯДОМ(NEAR) - упрощенный оператор дистанции: оба слова расположены не далее, чем в 8-ми словах друг от друга; пример: "проведение РЯДОМ документ";
"" (текст в кавычках) - поиск точной с учетом морфологии фразы , пример: "проведение документа" - эквивалентно: проведение /1 документа;
() - группировка слов (сколько угодно уровней вложенности); пример: "(проведение | выписка) # (счета, документа)";
* - поиск с использованием группового символа (замена окончания слова). Должно быть введено более 1 значащего символа; пример: "доку*" - найдет "документ", "документировать", "документальный" и др.;
# - нечеткий поиск слов с заданным количеством отличий от указанного (если не указано, то = 1); пример: запрос "#Система" найдет "систама", "сивтема"; запрос "Система#2" найдет "ситтама", "сеттема";
! - поиск с учетом синонимов русского, английского и украинского языков. "!" ставится перед соответствующим словом; пример: поиск "!красный кафель", найдет еще и "алый кафель" и "коралловый кафель".
Если не указано никаких операторов (слова набраны через пробел), то программа осуществляет поиск всех слов из запроса с использованием оператора И.
Замечание 1. Написание операторов И (AND), ИЛИ (OR), НЕ (NOT), РЯДОМ (NEAR) допускается только в верхнем регистре.
Замечание 2. Операторы не используются как унарные (в начале строки поиска). Например, нельзя сделать выбор всех глав, в которых отсутствует указанный текст.
Ограничение. При использовании нечеткого и группового поиска (операторы "*" и "#") может быть найдено несколько слов. Общее число найденных слов не может превышать 300.
<РазмерПорции> (необязательный)

Тип: Число.
Количество результатов в одной порции. Например, 30.
Значение по умолчанию: 20
Возвращаемое значение:

Тип: СписокПолнотекстовогоПоиска.

Описание:

Создает объект СписокПолнотекстовогоПоиска. После создания необходимо вызвать метод ПерваяЧасть - чтобы получить результаты поиска.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

Если режим полнотекстового поиска запрещен, то использование метода вызывает исключение.

Ответили: (10)
# Ответить
10. Torin99 20.12.2012 15:02
(9) petrov_al, я не хочу с Вами спорить, просто МенеджерПолнотекстовогоПоиска оперирует в терминах Левенштейна только одной операцией "замена" - т.е. (дальше цитата из справки) -- "запрос "Система#2" найдет "ситтама", "сеттема";" -- иными словами все те слова, которые получаются из слова "система" двумя ЗАМЕНАМИ одного символа на другой. Но вот "ситемас" он не найдет - хотя по Левенштейну здесь расстояние равно как раз 2 - только не 2 ЗАМЕНЫ, а 1 ВСТАВКА + 1 УДАЛЕНИЕ = 2.
Поймите, с точки зрения ЧЕЛОВЕЧЕСКИХ ошибок растояние по Левенштейну намного более ПРАВИЛЬНО, чем логика работы Менеджера Полнотекстового Поиска. На самом деле еще точнее работают т.н "фонетические алгоритмы", которые использует, например, Гугл, но как использовать их внутри 1С-ки я пока не понимаю...
Логика "замены" работает только для исправления т.н "ошибок двоечников" - т.е когда человек пишит "Ы" вмести "И", "А" вместо "О". Но в реальности очень большАя часть ошибок -- это "ошибки невнимательности", когда просто пропушена буква или добавлена лишняя из-за ошибок работы с клавиатурой.
# Ответить
Внимание! За постинг в данном форуме $m не начисляются.
Внимание! Для написания сообщения необходимо авторизоваться
Текст сообщения*
Прикрепить файл