powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / быстрый текстовый поиск
12 сообщений из 12, страница 1 из 1
быстрый текстовый поиск
    #40074746
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL: 2008R2 Enterprise

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

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

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

Т.е.:

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

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

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

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

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

Применять like на 50+ столбцов даже не пробовал: предполагаю, это плохая идея.
...
Рейтинг: 0 / 0
быстрый текстовый поиск
    #40074777
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander Us, Таблица статическая? Или в нее идут вставки/обновления? С какой интенсивностью? Предполагается ли поиск like '%из_середины_слова%'? Почему при поиске:
При поиске «пуп» должны быть выведены строки
«пупки», «куриные», ...
должны выводиться "куриные"?
...
Рейтинг: 0 / 0
быстрый текстовый поиск
    #40074778
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us,

посмотрите ElasticSearch
https://www.knowi.com/blog/what-is-elastic-search/
...
Рейтинг: 0 / 0
быстрый текстовый поиск
    #40074788
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

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

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


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


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

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

Т.е.
строка выводится, если искомое слово найдено в любом из столбцов.
строка выводится, если все искомые слова найдены в любых столбцах.
...
Рейтинг: 0 / 0
быстрый текстовый поиск
    #40074790
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad, спасибо.

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

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

https://habr.com/ru/company/microsoft/blog/470139/
...
Рейтинг: 0 / 0
быстрый текстовый поиск
    #40074798
Alexander Us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь,

Спасибо, интересная статья. Сажусь читать.
...
Рейтинг: 0 / 0
быстрый текстовый поиск
    #40074803
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us
komrad, спасибо.

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


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

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

CONTAINS
CONTAINSTABLE
FREETEXT
FREETEXTTABLE

позволяют задавать список столбцов.
...
Рейтинг: 0 / 0
быстрый текстовый поиск
    #40074807
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexander Us
Пока что попробовал слить все столбцы в один
Это лишнее. Полнотекстовый индекс можно построить по множеству столбцов. Если надо будет искать по всем, то в contains просто указывать *
Alexander Us
поиск по текстам с дефизом «AB-CD» не получился.
В вашем случае поисковые запросы нужно приводить к виду
Код: sql
1.
2.
where contains(*, '"AB-CD*"')
where contains(*, '"пуп*" and "вас*"')

Alexander Us
периодически тормозит
Если оценка полнотекстового предиката дает много строк, то в этом случае возможен полный просмотр базовой таблицы. Смотрите план запроса.
Можно попробовать через containstable и ее результат сложить во временную таблицу, а уже ее соединять с основной.
...
Рейтинг: 0 / 0
быстрый текстовый поиск
    #40074866
Кесарь
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

он имел в виду, что не получится найти "CD", если в поле "AB-CD".
...
Рейтинг: 0 / 0
быстрый текстовый поиск
    #40075000
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кесарь
invm,

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


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


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