Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
palladin600
Member

Откуда: Minsk Power Station
Сообщений: 479
Скажите, хочу понять как работает быстрый поиск в форме на сайтах, вот когда начинаешь вводить символы, и тотчас же ниже подгружаются какие-то результаты.

Получается, человек на сайте вводит первый символ, и сервер отправляет запрос к БД?
Пользователь хочет найти некоторую улицу (скажем, Ленина), вбивает посимвольно в текстовое поле:
Л..
тут запрос идёт к БД:
select streetname from streets where streetname like '%Л%'

вторую букву нажимает:
Ле..
select streetname from streets where streetname like '%Ле%'

третью букву нажимает:
Лен..
select streetname from streets where streetname like '%Лен%'

и т.д., пока не получит необходимый результат.

И вот вопрос: это нормально по каждому чиху (читай, по каждой букве) делать селект к базе? Это именно так делается в современном мире?
1 ноя 19, 23:41    [22008538]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 32485
Блог
palladin600,

Нет, не нормально.
Обычно делают поиск с момента ввода n букв + кэширование
2 ноя 19, 01:03    [22008559]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7088
palladin600,

В поисковиках SQL вообще не используется. Там другая тема.
2 ноя 19, 02:17    [22008572]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29587
palladin600
И вот вопрос: это нормально по каждому чиху (читай, по каждой букве) делать селект к базе? Это именно так делается в современном мире?
Тут есть два разных момента.

1. Делают ли селект к базе - зависит от системы, но да, часто делают, хотя, конечно, есть и другие варианты (скажем, хранение списков в виде массивов на клиенте или сервере приложений).

2. делают ли запрос при вводе каждой буквы - нет, это всегда делается асинхронно, ввод символов не прерывается, ожидая, пока сервер не ответил, а новый запрос уже будет формироваться, исходя из введённых к этому моменту символов (т.е, например, like '%Ле%' можно будет пропустить)

Это очень похоже на обработку некоторых событий в Windows API, когда некоторые типы событий сделаны "поглощающими", т.е. в очереди никогда не может быть более одного события данного типа.
Например, событие "перемещение мыши" не генерится на координаты каждого пикселя, а генерится на те координаты, которые есть на момент завершения обработки предыдущего события от мыши.
2 ноя 19, 02:54    [22008574]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29587
Relic Hunter
В поисковиках SQL вообще не используется. Там другая тема.
Разве от синтаксиса принципы меняются?
Там тоже есть база, и при вводе символов в браузере последний отправляет запросы на сервер, а сервер шлёт запросы к БД.
2 ноя 19, 02:56    [22008575]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
fkthat
Member

Откуда:
Сообщений: 1614
Нет, конечно. Так-то, эта тема к сиквелу никаким боком. Обычно делают "throttling" на клиенте - отправляют запрос к серверу только если строка поиска не менялась в течении определенного промежутка времени.
2 ноя 19, 13:09    [22008680]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
iap
Member

Откуда: Москва
Сообщений: 46898
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=755487&msg=8714817
2 ноя 19, 20:16    [22008804]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
defragmentator
Member

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

Я б сделал так: если походящих записей мало, то вытаскиваю из базы всё, что начинается на заданную букву и передаю на клиент. А там уже фильтрую.

Можно ещё подкачку в фоновом режиме сделать.

А если много записей, то да, будет медленно работать, но так никуда от этого и не уйдёшь.

Сообщение было отредактировано: 2 ноя 19, 21:11
2 ноя 19, 21:09    [22008827]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 448
А разве это не работа сервиса кэшировать выборки? Если использоваться ORM с кэшем?

Вообще нужно ещё делать вероятностный поиск - закладывать возможность и глубину опечаток...
2 ноя 19, 21:15    [22008830]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29587
Андрей Юниор
А разве это не работа сервиса кэшировать выборки? Если использоваться ORM с кэшем?
Да и без ORM нужно кэшировать, при чём тут ORM?

Просто это уже детали реализации, и это не всегда можно сделать, не усложняя систему (например, может понадобится рефрешить кэш на всех компах-клиентах, при изменениях).
2 ноя 19, 21:25    [22008834]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 448
alexeyvg
Да и без ORM нужно кэшировать, при чём тут ORM?

Я не понимаю, причём тут БД для реализации подсказок поиска.

Может я думаю о подсказках уровня Яндекс/Гугла/крупного интернет-магазина, а тут надо всего лишь подсказать заполнение отдельного поля в форме?
2 ноя 19, 21:52    [22008840]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29587
Андрей Юниор
Я не понимаю, причём тут БД для реализации подсказок поиска.
При том, что обращение к БД может быть единственным вариантом реализации функционала подсказок.
Андрей Юниор
а тут надо всего лишь подсказать заполнение отдельного поля в форме?
Может, и так, но мы же не знаем задачи и условий.
И вот, рассказываем ТС про разные варианты.
2 ноя 19, 22:14    [22008848]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 448
alexeyvg
При том, что обращение к БД может быть единственным вариантом реализации функционала подсказок.

БД - да. Но РСУБД - нет. РСУБД для крупного поисковика вряд ли вообще теоретически возможна.

Поэтому и вопрос... У майкрософта на ажуре вроде какая-то технология поиска была. Вроде как могла искать даже по pdf и docx файлам.
2 ноя 19, 22:26    [22008856]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29587
Андрей Юниор
alexeyvg
При том, что обращение к БД может быть единственным вариантом реализации функционала подсказок.

БД - да. Но РСУБД - нет. РСУБД для крупного поисковика вряд ли вообще теоретически возможна.
Есть же промежуточные варианты, между поисковиком и базой парикмахерской.

Скажем, какая то база компании - контрагенты, или сотрудники - загружать сотни тысяч записей на клиента вроде бы не хочется, почему бы не искать в базе?
Андрей Юниор
Поэтому и вопрос... У майкрософта на ажуре вроде какая-то технология поиска была. Вроде как могла искать даже по pdf и docx файлам.
И без ажура было.

Я только не понимаю, почему искать в СУБД можно, но только если это не РСУБД?
В РСУБД поиск будет дешевле и быстрее, чем в корявой базе полнотекстового индекса (из Ажура или ещё откуда то).
Всё таки ядра РСУБД оттачивались десятилетиями, и до сих пор их не забросили.

Андрей Юниор
Поэтому и вопрос... У майкрософта на ажуре вроде какая-то технология поиска была.
И ещё, в контексте задачи ТС никакая индексация не поможет, т.е. все без исключения "технологии поиска" конкретно в этой задачи неприменимы.

Точнее, поможет специальная самодельная индексация, которую тут обсуждали на форуме.
А все стандартные не умеют индексировать с середины слова (или есть такие, которые умеют?)

То есть, в итоге, остаются варианты:

1. искать в СУБД, сделав свою индексацию, позволяющую искать фрагменты текста (неважно, в какой СУБД - можно и в РСУБД MSSQL)
2. сканировать таблицу в СУБД (неважно, какой - можно и в РСУБД MSSQL)
3. сканировать предварительно загруженные в память данные (массив, список и т.д.) на клиенте/сервере приложений.
4. ещё есть экзотический вариант - эмулировать индекс в словаре в памяти (ценой увеличения расхода памяти умножением на среднюю длину строки пополам), но это имеет смысл для очень больших нагрузок, когда нормальной скорости сканирования памяти в десятки гб/сек окажется недостаточно.

С соответствующими плюсами и минусами каждого варианта, и с наворотами типа кэширования для вариантов 1 и 2.
3 ноя 19, 00:03    [22008892]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
PsyMisha
Member

Откуда: другая столица
Сообщений: 486
alexeyvg,

Вообще, конечно, интересный технический момент. Тоже всегда было интересно, как такой упреждающий поиск по части ввода под капотом работает.
наверное, - нужно изолировать окружение - фронт и бэк и, начиная вводить в поля формы, которые обладают такой "магией" мгновенного поиска-ответа - постоянно мониторить в открытом приложении Профайлера, что в итоге-то шлется на РСУБД и в каком виде. Пропускаются там лайки или нет, и какой в итоге код в базу летит
3 ноя 19, 16:21    [22009045]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 32485
Блог
alexeyvg
Скажем, какая то база компании - контрагенты, или сотрудники - загружать сотни тысяч записей на клиента вроде бы не хочется, почему бы не искать в базе?


Так речь в исходном посте про сайты, а там, если не ошибаюсь, эти данные кэшируются на сервере.

В общем, топик наверное нужно было создать в другом подфоруме.
3 ноя 19, 18:05    [22009076]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
iap
Member

Откуда: Москва
Сообщений: 46898
alexeyvg
Точнее, поможет специальная самодельная индексация, которую тут обсуждали на форуме.
https://social.technet.microsoft.com/wiki/ru-ru/contents/articles/12921.full-text.aspx
3 ноя 19, 19:28    [22009086]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29587
iap
alexeyvg
Точнее, поможет специальная самодельная индексация, которую тут обсуждали на форуме.
https://social.technet.microsoft.com/wiki/ru-ru/contents/articles/12921.full-text.aspx
О, даже в технет-документацию выложили :-)

Для данного кейса случае даже упрощается, не нужно индексировать слова.
3 ноя 19, 19:32    [22009087]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
fkthat
Member

Откуда:
Сообщений: 1614
alexeyvg
О, даже в технет-документацию выложили :-)

Какой-то странноватый кейс - искать по любому месту внутри слова. А по началу слова самый обычный фулл-текст сёрч нормально ищет. Но, вообще-то, по-моему лучше сразу двигать в сторону lucene/ellastic или чего-нибудь подобного.
3 ноя 19, 22:39    [22009148]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29587
fkthat
alexeyvg
О, даже в технет-документацию выложили :-)

Какой-то странноватый кейс - искать по любому месту внутри слова. А по началу слова самый обычный фулл-текст сёрч нормально ищет.
Пользователям это как раз не странно, это более естественно, чем искать по началу слова, и тем более по точному совпадению.
fkthat
Но, вообще-то, по-моему лучше сразу двигать в сторону lucene/ellastic или чего-нибудь подобного.
От конкретной задачи зависит. Построить индекс на поле будет проще, чем использовать поисковые енжини, и искать будет намного быстрее.
Для некоторых сценариев, например, поиск по номеру документа, или по названию, индекс предпочтительней.
3 ноя 19, 23:07    [22009156]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3158
Relic Hunter
palladin600,

В поисковиках SQL вообще не используется. Там другая тема.


жесткое заявление.
SQL совсем не используется ни в каких поисковиках в этом мире!
4 ноя 19, 10:42    [22009244]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
982183
Member

Откуда: VL
Сообщений: 3217
Дума, что всё, что мы пытаемся искать уже искали до нас.
И где-то это хранится и проиндексировано.

Соответственно никакого последовательного select тут для быстрых подсказок не нужно
Достаточно более щадящих методов перемещения по отсортированной базе..
4 ноя 19, 11:31    [22009265]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Владислав Колосов
Member

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

инкрементный поиск делают с небольшим ожиданием ввода следующего символа, так экономятся обращения к серверу.
4 ноя 19, 17:19    [22009447]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3158
982183
Дума, что всё, что мы пытаемся искать уже искали до нас.
И где-то это хранится и проиндексировано.

Соответственно никакого последовательного select тут для быстрых подсказок не нужно
Достаточно более щадящих методов перемещения по отсортированной базе..


что такое "отсортированная база"? и "перемещение" по ней?
4 ноя 19, 18:16    [22009469]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
982183
Member

Откуда: VL
Сообщений: 3217
Ты же не предлагаешь делать новый select после каждого изменения поисковой строки?
Есть другие механизмы.
5 ноя 19, 02:28    [22009649]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
Андрей Юниор
Member

Откуда: Москва
Сообщений: 448
fkthat
Какой-то странноватый кейс - искать по любому месту внутри слова. А по началу слова самый обычный фулл-текст сёрч нормально ищет. Но, вообще-то, по-моему лучше сразу двигать в сторону lucene/ellastic или чего-нибудь подобного.

alexeyvg
Пользователям это как раз не странно, это более естественно, чем искать по началу слова, и тем более по точному совпадению.

В 2016 сервере появился FREETEXT. Если я правильно понял, теперь искать можно не только по началу строки:
https://docs.microsoft.com/ru-ru/sql/t-sql/queries/freetext-transact-sql?view=sql-server-ver15
5 ноя 19, 09:23    [22009724]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
982183
Member

Откуда: VL
Сообщений: 3217
О бл.. оказывается как это называется
"полнотекстовый поиск по столбцам полнотекстового индекса, содержащим символьные типы данных"
5 ноя 19, 11:00    [22009795]     Ответить | Цитировать Сообщить модератору
 Re: Для поиска, надо ли делать обращение к БД после каждого введённого символа?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 29587
Андрей Юниор
В 2016 сервере появился FREETEXT
В 2008 сервере, 11 лет назад :-)

Андрей Юниор
теперь искать можно не только по началу строки:
Не позволяет. Это обычный полнотекстовый поиск, с морфологией и т.д. Который, цитирую, "выполняет поиск значений, которые соответствуют условию поиска по смыслу, а не написанию".
5 ноя 19, 16:49    [22010089]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Microsoft SQL Server Ответить