Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 быстрый текстовый поиск  [new]
Alexander Us
Member

Откуда:
Сообщений: 1159
SQL: 2008R2 Enterprise

Подскажите пожалуйста, как лучше организовать быстрый поиск:
(в каком направлении копать)

В упрощенной форме:
Таблица ~30-50 млн. строк, ~50+ текстовых столбцов с относительно короткими данными как, например, личные данные, свойства артиклей, даты и т.д. (данные добавляются постоянно).

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

Т.е.:

При поиске «пуп» должны быть выведены строки
«пупки», «куриные», ...
«Пупкин», «Василий» , ...
«пупсик», «васильковый» , ...

При поиске «пуп вас» должны быть выведены строки
«Пупкин», «Василий» , ...
«пупсик», «васильковый» , ...

При поиске «пуп вас 07.11.1917» должны быть выведены строки
«Пупкин», «Василий» , ...

Структура таблицы упомянута как пример, и может быть изменена.

Пока что попробовал слить все столбцы в один и применить полнотекстовый поиск.
Но как то не очень понравилось: периодически тормозит, поиск по текстам с дефизом «AB-CD» не получился.

Применять like на 50+ столбцов даже не пробовал: предполагаю, это плохая идея.
1 июн 21, 15:41    [22329897]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
uaggster
Member

Откуда:
Сообщений: 1030
Alexander Us, Таблица статическая? Или в нее идут вставки/обновления? С какой интенсивностью? Предполагается ли поиск like '%из_середины_слова%'? Почему при поиске:
При поиске «пуп» должны быть выведены строки
«пупки», «куриные», ...

должны выводиться "куриные"?
1 июн 21, 16:34    [22329935]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
komrad
Member

Откуда:
Сообщений: 5699
Alexander Us,

посмотрите ElasticSearch
https://www.knowi.com/blog/what-is-elastic-search/
1 июн 21, 16:37    [22329936]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
Alexander Us
Member

Откуда:
Сообщений: 1159
uaggster,

В таблицу постоянно идут вставки.
Обновлений нет.
Удаление по ночам.

Поиск like '%из_середины_слова% - нет, не нужен.
Поиск like 'из_начала_слова% - да, нужен.


«пупки», «куриные», ...


Это я так изобразил найденную строку.
В таблице находится:

Столбец 1: «пупки»
Столбец 2: «куриные»
Столбец 3: ...
...
Столбец N: ...

Т.е.
строка выводится, если искомое слово найдено в любом из столбцов.
строка выводится, если все искомые слова найдены в любых столбцах.
1 июн 21, 16:46    [22329946]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
Alexander Us
Member

Откуда:
Сообщений: 1159
komrad, спасибо.

Elasticsearch сильно платный?
1 июн 21, 16:50    [22329948]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
Кесарь
Member

Откуда:
Сообщений: 653
Alexander Us,

можно ещё язык разбиения поменять на экзотический

https://habr.com/ru/company/microsoft/blog/470139/
1 июн 21, 16:50    [22329951]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
Alexander Us
Member

Откуда:
Сообщений: 1159
Кесарь,

Спасибо, интересная статья. Сажусь читать.
1 июн 21, 17:00    [22329958]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
komrad
Member

Откуда:
Сообщений: 5699
Alexander Us
komrad, спасибо.

Elasticsearch сильно платный?


он бесплатен, open source
1 июн 21, 17:11    [22329963]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
Кесарь
Member

Откуда:
Сообщений: 653
Alexander Us,

кстати для полнотекстового поиска вовсе не нужно сцеплять столбцы в один.

CONTAINS
CONTAINSTABLE
FREETEXT
FREETEXTTABLE

позволяют задавать список столбцов.
1 июн 21, 17:15    [22329965]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
invm
Member

Откуда: Москва
Сообщений: 9778
Alexander Us
Пока что попробовал слить все столбцы в один
Это лишнее. Полнотекстовый индекс можно построить по множеству столбцов. Если надо будет искать по всем, то в contains просто указывать *
Alexander Us
поиск по текстам с дефизом «AB-CD» не получился.
В вашем случае поисковые запросы нужно приводить к виду
where contains(*, '"AB-CD*"')
where contains(*, '"пуп*" and "вас*"')
Alexander Us
периодически тормозит
Если оценка полнотекстового предиката дает много строк, то в этом случае возможен полный просмотр базовой таблицы. Смотрите план запроса.
Можно попробовать через containstable и ее результат сложить во временную таблицу, а уже ее соединять с основной.

Сообщение было отредактировано: 1 июн 21, 17:12
1 июн 21, 17:20    [22329968]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
Кесарь
Member

Откуда:
Сообщений: 653
invm,

он имел в виду, что не получится найти "CD", если в поле "AB-CD".

Сообщение было отредактировано: 1 июн 21, 19:24
1 июн 21, 19:32    [22330050]     Ответить | Цитировать Сообщить модератору
 Re: быстрый текстовый поиск  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4155
Кесарь
invm,

он имел в виду, что не получится найти "CD", если в поле "AB-CD".


получится, если правильно запрос написать.
Правильно рекомендуют - вместо того, чтобы подключать еще один чужой сервис использовать FTS
2 июн 21, 12:38    [22330260]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить