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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


А чо, внешняя система способна быстро искать в какой-то базе, без передачи данных в эту систему?
...
Рейтинг: 0 / 0
13.01.2021, 15:36
    #40035468
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечёткий поиск
aleks222
А чо, внешняя система способна быстро искать в какой-то базе, без передачи данных в эту систему?
Не задавай глупых вопросов :)
Само-собой, данные придется туда передавать.
...
Рейтинг: 0 / 0
13.01.2021, 15:42
    #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
13.01.2021, 15:50
    #40035478
Alexander Us
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нечёткий поиск
invm,

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

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

Я про это


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

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

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

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

Я про это


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

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



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

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

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

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

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

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

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

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


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