powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нечёткий поиск
23 сообщений из 23, страница 1 из 1
Нечёткий поиск
    #40035350
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица личных данных после ручного ввода: Фио и адрес (необязатеьно российский)

Некая функция часто обращается к таблице и просит найти дубликаты для некой персоны.
В том числе те, которые имеют отличия в написании.
И желательно быстро.

По этой причине использование Дамерау-Левенштайна, по крайней мере в лоб, видится проблематично.

Есть ли оправдавшие себя подходы к проблеме или советы?
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035363
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us
и просит найти дубликаты для некой персоны

Функция тоже получает значение из ручного ввода или оперирует одним из значений этой таблицы?
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035382
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

а если использовать хеширование по сигнатуре?
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035390
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
Функция тоже получает значение из ручного ввода или оперирует одним из значений этой таблицы?

Могут быть оба варианта.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035406
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
а если использовать хеширование по сигнатуре?

Извините, что не понял Вашу идею.
Могли бы Вы чуть подробнее объяснить?
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035418
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

Какая-нибудь внешняя поисковая система с возможностью нечеткого поиска (например Elastic Search) плюс интеграция с ней через SQL CLR
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035422
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Спасибо, попробую.
А эта штука платная?
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035423
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

погуглите. ES распостраняется по лицензии apache. можно свитать что бесплатно
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035434
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

SSIS имеет средство нечеткого сравнения. Данные можно периодически обрабатывать таким образом с формированием "отсева".
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035456
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Тогда придётся вызывать исполнение SSIS пакета по каждому запросу на поиск.
Ведь данные в таблице могут обновляться: идут вставки, иногда удаления.
Мне кажется, это не совсем то, что я бы хотел.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035458
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us
И желательно быстро.

По этой причине использование Дамерау-Левенштайна, по крайней мере в лоб, видится проблематично.

Есть ли оправдавшие себя подходы к проблеме или советы?


invm
Alexander Us,
Какая-нибудь внешняя поисковая система с возможностью нечеткого поиска (например Elastic Search) плюс интеграция с ней через SQL CLR


А чо, внешняя система способна быстро искать в какой-то базе, без передачи данных в эту систему?
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035468
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
А чо, внешняя система способна быстро искать в какой-то базе, без передачи данных в эту систему?
Не задавай глупых вопросов :)
Само-собой, данные придется туда передавать.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035472
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

Можете поиграться со штатным FTS и containstable с запросом ISABOUT.
Примерно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
use master;
create database TestDB;
alter database TestDB set recovery simple;
go

use TestDB;
set ansi_nulls, quoted_identifier, xact_abort on;
go

create table dbo.t
(
 id int identity constraint PK_t primary key,
 s varchar(8000) not null
);

insert into dbo.t
 (s)
 values
  ('Иванов Петр Васильевич, Москва, ул. Пряничная, д. 7'),
  ('Иванов Петр Васильевич, Моска, Пряничная - 7'),
  ('Москва, ул. Пряничная, д. 7, Иванов Петр Васильевич'),
  ('Иванов П. В., Москва, Пряничная, 7'),
  ('Иванов Петр Васильевич, Москва, ул. Пряничная, д. 7'),
  ('Петр Васильевич Иванов, Москва, ул. Пряничная, д. 7'),
  ('Гришин Петр Александрович, Ижевск, ул. Пряничная, д. 19'),
  ('Иванов Пётр Восильевич, Москва, Пряничная - 7');
go

create fulltext catalog Test;
go

create fulltext index on dbo.t (s language 0) key index PK_t on Test with (stoplist = off, change_tracking = auto);
go

alter fulltext index on dbo.t start full population;
go

while fulltextcatalogproperty('Test', 'PopulateStatus') <> 0
 waitfor delay '00:00:01';
go

declare @s varchar(8000) = 'ISABOUT(Иванов, Петр, Васильевич, Москва, ул., Пряничная, д., 7)';

select
 b.*, a.[RANK]
from
 containstable(dbo.t, s, @s, language 0, 10) a join
 dbo.t b on b.id = a.[KEY]
order by
 a.[RANK] desc
go

use master;
alter database TestDB set single_user with rollback immediate;
drop database TestDB;
go

...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035478
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Спасибо, обязательно попробую.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035486
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us
Могли бы Вы чуть подробнее объяснить?

Я про это
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035501
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128
Alexander Us
Могли бы Вы чуть подробнее объяснить?

Я про это


Спасибо за ссылку.
Сейчас нет времени всё обстоятельно прочитать, но такую или похожую штуку я уже делал для ускорения поиска Дамерау-Левенштайном в отдельном приложении: если сформировать битовый хэш для двух строк, и, два хэша отличаются, скажем на 4 бита, то можно сказать, что две строки отличаются как минимум на 4 символа.
Так можно не сравнивать Дамерау-Левенштайном строки, которые имеют слишком много отличий.

Это хорошо (приемлимо) работает в отдельном приложении, но мне сейчвс надо SQL.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035507
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

Количество хешей может быть существенно меньшим, чем количество слов, да и сравнивать хеши намного быстрее. Сканирование отдельной таблицы хешей позволит на первом этапе существенно ограничить список строк из основной таблиц, по которым уже производится сравнение Дамерау-Левенштайном.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035518
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128,

да, конечно, это я уже реализовал в приложении.
Но этот способ, как мне кажется, не очень хорошо подходит для SQL сервера.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035522
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us
ptr128
пропущено...

Я про это


Спасибо за ссылку.
Сейчас нет времени всё обстоятельно прочитать, но такую или похожую штуку я уже делал для ускорения поиска Дамерау-Левенштайном в отдельном приложении: если сформировать битовый хэш для двух строк, и, два хэша отличаются, скажем на 4 бита, то можно сказать, что две строки отличаются как минимум на 4 символа.
Так можно не сравнивать Дамерау-Левенштайном строки, которые имеют слишком много отличий.

Это хорошо (приемлимо) работает в отдельном приложении, но мне сейчвс надо SQL.



По-моему расстояние Левентшайна означает количество преобразований исходной строки в целевую, это к слову.

Можно ничего не делать, а взять SOUNDEX ( character_expression )

Если делать, то в ы можете взять алгоритм Питера Норвига, простейший прообраз гугловского "Did you mean"
https://norvig.com/spell-correct.html

Там в конце есть список языков, на которых реализован поиск.
Можно дописать на SQL, но я делал SQL CLR функцию+таблицу с английскими словами.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035528
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Спасибо за ссылку. Интересно.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035551
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

а зачем это делать на лету? Вопросы приведения базы в порядок можно решать при регулярном обслуживании. Стремление выполнять какие-то преобразования синхронно со вставкой не всегда оправданы.
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035701
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Да, но не в этом случае.
Скажем, в таблицу вносятся персоны, и тут же приходит запрос на определение дубликатов.
Было бы нежелательно заставлять пользователя ждать, пока исполнится пакет и приведет всё "в порядок".
К тому же, задача по нечёткой группировке списков уже решена в отдельном приложении (0,5 млн группируются ~за 5 мин).
В данном случае нужен поиск дубликатов "на лету".
...
Рейтинг: 0 / 0
Нечёткий поиск
    #40035728
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

если вы тут же формируете распечатку по этим данных, то это важно, если нет, то данные сохранены только в базе и порядок их трансформации не имеет значения. Например, при заполнении фамилий или адресов оператор получает на экране список похожих значений и сам принимает решение о выборе. Всегда надо принимать во внимание, что нечеткое сравнение лишь предполагает, что два значение могут быть одним и тем же. Если брать результат его сравнения за истину, то неизбежны ошибки, например, в результате опечаток.
В некоторых случаях поиск схожих значений лучше поручить клиентскому приложению, подгрузив в него справочник.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Нечёткий поиск
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]