powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
24 сообщений из 24, страница 1 из 1
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960014
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Сервер: Сервер рабочий: Microsoft SQL Server 2016 (SP2-CU10) (KB4524334) - 13.0.5492.2 (X64) Oct 4 2019 19:14:08 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

Стоит задача следующая:
1.При ходят банковские выписки от 10 до 5000. По большей части 100-200 строк.
2.Создается временная таблица #Table_Vipiska (ID int identity(1,1), [Назначение] varchar(8000) collate Cyrillic_General_BIN)
Поле [Назначение] содержит обычно 100-300 символов.
3. Есть 7 таблиц разной структуры, содержащие номера документов (в каждой таблице по 1 полю с номером) типо: 34ТТ2323/2020, 234324324, 3333/44 и т.п. Длина номеров от 8 до 20 символов. Суммарно все 7 таблиц содержат около 20 млн. записей, но не равномерно (есть таблицы на 200 тыс, есть на 10 млн).
4.Поиск происходит так
update P
set ID_doc=T.ID_doc
from #Table_Vipiska P
cross join (select ID_doc, '%'+Number+'%' collate Cyrillic_General_BIN [Find] from dbo.Table(1-7)) T
where P.[Назначение] like T.[Find]

Если документ найден в таблице 2, то поиск прекращается по этой записи и эта запись исключается из поиска по таблицам 3-7.

Писк медленный. Хочу применить полнотекстовый поиск. Вопрос: поможет мне он, если Номера которые нужно искать могут быть не отделены пробелами, а например разделительными символами могут быть (),.;#№ и т.п. Конечный список у меня будет, но пока его нет. А например /\ символы могут содержаться в номере для поиска и не должны считаться разделительными символами.
Если это модно реализовать, то подскажите как и где указывать разделительные символы, а где которые считать частью слова?

С полнотекстовым поиском только в начале знакомства.
П.С. collate Cyrillic_General_BIN используется для ускорения Like
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960018
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mih.dim1
При ходят
Писк


Чтобы полнотекстовый поиск работал - надо великий и могучий подучить.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960041
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
mih.dim1
При ходят
Писк


Чтобы полнотекстовый поиск работал - надо великий и могучий подучить.


Спасибо за ответ по делу. Торопился опубликовать - не проверил орфографию. Прошу прощения, если это задевает кого-то.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960046
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mih.dim1,

по моему мнению для таких объемов и для таких условий поиска можно использовать регулярные выражения. Поищите, как создать CLR функцию с регулярными выражениями.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960048
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее, с помощью регулярных выражений можно извлекать номера, а потом уже объединять. Или у вас нет какого-то единого шаблона для номеров?
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960065
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mih.dim1
Номера которые нужно искать могут быть не отделены пробелами, а например разделительными символами могут быть (),.;#№ и т.п.
Тогда, по всей видимости, вам придется делать custom word breaker. Иначе FT будет бесполезен.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960079
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно было бы вычистить все слова из [Назначение] при вставке в Table_Vipiska, оставить в отдельное поле например только числа больше ... и число-букво-символьные комбинации, и по этому полю уже искать.
Если вы импортируете один раз в Table_Vipiska, а ищите много раз потом, то возможно так быстрее будет
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960080
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
Точнее, с помощью регулярных выражений можно извлекать номера, а потом уже объединять. Или у вас нет какого-то единого шаблона для номеров?


Единого шаблона нет. В теории в номер может быть все что угодно.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960081
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
mih.dim1
Номера которые нужно искать могут быть не отделены пробелами, а например разделительными символами могут быть (),.;#№ и т.п.
Тогда, по всей видимости, вам придется делать custom word breaker. Иначе FT будет бесполезен.


а почему бесполезен? Там нельзя исключать часть символов при поиске. Типо задать некий словарь: настроить под себя поиск или эт не предусмотрено микрософтом?
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960082
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza
интересно было бы вычистить все слова из [Назначение] при вставке в Table_Vipiska, оставить в отдельное поле например только числа больше ... и число-букво-символьные комбинации, и по этому полю уже искать.
Если вы импортируете один раз в Table_Vipiska, а ищите много раз потом, то возможно так быстрее будет


Вот и думаю.
1.Либо полнотекстовый поиск.
2.Либо самому бить на слова и потом искать.

Я по идее хотел если не получить со стандартным поиском попробовать типо разложить на слова в отдельную таблицу навешать индекс и искать. Но полнотекстовый именно это и делает. Не хочу городить велосипед. Тут вопрос как полнотекстовый поиск работает в плане построения/выделения слов например для русского языка (это раз). Притом полнотекстовый индекс нужно будет строить "налету" на временную таблицу, а он асинхронный (это два что очень смущает).
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960085
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
mih.dim1
Номера которые нужно искать могут быть не отделены пробелами, а например разделительными символами могут быть (),.;#№ и т.п.
Тогда, по всей видимости, вам придется делать custom word breaker. Иначе FT будет бесполезен.


Может предварительно все спецсимволы убрать которые мешать будут поиску. Вопрос только поможет мне это, если тексты маленькие в которых искать и их не много, а значений, которые надо найти, очень много.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960093
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mih.dim1
Вопрос только поможет мне это, если тексты маленькие в которых искать и их не много, а значений, которые надо найти, очень много.
Само-собой не поможет.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960100
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm
mih.dim1
Вопрос только поможет мне это, если тексты маленькие в которых искать и их не много, а значений, которые надо найти, очень много.
Само-собой не поможет.


А что поможет? Разбить по словам самому, навешать индекс и поиск через равно делать? или еще есть варианты?
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960117
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mih.dim1,

заведомо лишнее убрать - поможет

Если я правильно понял, вы ищите не тексты, поэтому непонятно зачем вам полно текстовый поиск. У вас задача поиска практически случайных цифровых и цифро-символьных комбинаций.
Зачем искать в словах "стол" "деревянный", то, что там быть не может никогда, тк номер у вас имеет структуру, значительно отличающуюся от регулярных слов?
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960215
Ferdipux
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mih.dim1

Вот и думаю.
1.Либо полнотекстовый поиск.
2.Либо самому бить на слова и потом искать.
...


Посмотрите статью про полнотекстовый поиск на Хабре. Там пара готовых рецептов, если не писать собственный модуль для FT.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960232
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mih.dim1
Писк медленный. Хочу применить полнотекстовый поиск.
Нужно парсить данные в момент прихода, и нормализовать их в реляционную структуру.
Тогда потом будет и скорость, и, главное, целостность данных.

Парсить можно на SQL, или скриптами C# в SSIS, или отдельным приложением.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960238
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mih.dim1
3. Есть 7 таблиц разной структуры, содержащие номера документов

Надо сделать одну таблицу с номерами документов и id. Во все остальные таблицы передавать этот id.
mih.dim1
Писк медленный

Еще бы он был быстрый.
mih.dim1
Хочу применить полнотекстовый поиск.

А смысл? Надо чинить мусорную структуру а не полнотекстовые поиски внедрять.
Еще надо бы формализировать номер документа, а то работаете со всяким шлаком, а потом пытаетесь это выправить поисками по регуляркам.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960385
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ferdipux
mih.dim1

Вот и думаю.
1.Либо полнотекстовый поиск.
2.Либо самому бить на слова и потом искать.
...


Посмотрите статью про полнотекстовый поиск на Хабре. Там пара готовых рецептов, если не писать собственный модуль для FT.


Читал и оставил на крайний случай. Но походу он настал. Т.к. с временными таблицами полнотекстовый поиск не работает, ка выяснилось
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960386
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
mih.dim1
Писк медленный. Хочу применить полнотекстовый поиск.
Нужно парсить данные в момент прихода, и нормализовать их в реляционную структуру.
Тогда потом будет и скорость, и, главное, целостность данных.

Парсить можно на SQL, или скриптами C# в SSIS, или отдельным приложением.


К этому все и идет. Спасибо
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960387
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
crutchmaster
mih.dim1
3. Есть 7 таблиц разной структуры, содержащие номера документов

Надо сделать одну таблицу с номерами документов и id. Во все остальные таблицы передавать этот id.

Это разные сущности. Их можно объединить только во время поиска, а это перенос 20 млн. во временную таблицу. А это не вариант

mih.dim1
Писк медленный

Еще бы он был быстрый.
mih.dim1
Хочу применить полнотекстовый поиск.

А смысл? Надо чинить мусорную структуру а не полнотекстовые поиски внедрять.
Еще надо бы формализировать номер документа, а то работаете со всяким шлаком, а потом пытаетесь это выправить поисками по регуляркам.


Тут уж есть что есть то есть. Эти данные не исправить.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960391
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mih.dim1,

У вас стоит задача - найти одну одну из 20 млн сигнатур в строках произвольного набора символов.
Что приходит на ум - это многопоточная обработка, параллельные вычисления.

Может помочь видеокарта с ее 128/512 процессорными ядрами, если сможете запрограммировать вычисления. а-ля биткойн майнинг.
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960466
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
mih.dim1,

У вас стоит задача - найти одну одну из 20 млн сигнатур в строках произвольного набора символов.
Что приходит на ум - это многопоточная обработка, параллельные вычисления.

Может помочь видеокарта с ее 128/512 процессорными ядрами, если сможете запрограммировать вычисления. а-ля биткойн майнинг.


Интересно, но это не мой пока уровень )))
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960469
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выбрал вариант с функцией из поста на харбе
Код: 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.
-- =============================================
-- Description: Разбиение текста на слова через пробел
-- =============================================
create FUNCTION [dbo].[Word_Breaker](@str varchar(8000))
RETURNS TABLE
AS
RETURN (
SELECT top 8000  Number as Pos,
SUBSTRING(@str, Number, ISNULL(NULLIF(CHARINDEX(' ', @str, Number), 0), LEN(@str)+1) - Number) as Word
FROM FT_Numbers (NOLOCK)
WHERE Number BETWEEN 1 AND LEN(@str)
      AND (SUBSTRING(@str, Number-1, 1) = ' ')
      AND CHARINDEX(' ', @str, Number) > Number
)

и заполнение временной таблицы
insert into #Table_Vipiska_Word(ID, Word)
select P.ID, V.Word
from #Table_Vipiska P
cross apply[dbo].[Word_Breaker](P.[Назначение]) V 

update P
set ID_doc=T.ID_doc
from #Table_Vipiska P
inner join #Table_Vipiska_Word W on W.ID=P.ID
inner join (select ID_doc, Number[Find] from dbo.Table(1-7)) T on W.[Word]=T.[Find]


Вот так работает в на 2 порядка быстрее. На тестовом варианте было 30 мин против 4 сек (из них 2 сек заполнение #Table_Vipiska_Word)
...
Рейтинг: 0 / 0
Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
    #39960470
mih.dim1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо за ответы и варианты.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск по назначению выписки (Полнотекстовый поиск) по большому словарю (20 млн.)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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