Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
palladin600 Member Откуда: Minsk Power Station Сообщений: 514 |
Скажите, хочу понять как работает быстрый поиск в форме на сайтах, вот когда начинаешь вводить символы, и тотчас же ниже подгружаются какие-то результаты. Получается, человек на сайте вводит первый символ, и сервер отправляет запрос к БД? Пользователь хочет найти некоторую улицу (скажем, Ленина), вбивает посимвольно в текстовое поле: Л.. тут запрос идёт к БД: 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] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34967 Блог |
palladin600, Нет, не нормально. Обычно делают поиск с момента ввода n букв + кэширование |
2 ноя 19, 01:03 [22008559] Ответить | Цитировать Сообщить модератору |
Relic Hunter Member Откуда: AB Сообщений: 7494 |
palladin600, В поисковиках SQL вообще не используется. Там другая тема. |
2 ноя 19, 02:17 [22008572] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31813 |
1. Делают ли селект к базе - зависит от системы, но да, часто делают, хотя, конечно, есть и другие варианты (скажем, хранение списков в виде массивов на клиенте или сервере приложений). 2. делают ли запрос при вводе каждой буквы - нет, это всегда делается асинхронно, ввод символов не прерывается, ожидая, пока сервер не ответил, а новый запрос уже будет формироваться, исходя из введённых к этому моменту символов (т.е, например, like '%Ле%' можно будет пропустить) Это очень похоже на обработку некоторых событий в Windows API, когда некоторые типы событий сделаны "поглощающими", т.е. в очереди никогда не может быть более одного события данного типа. Например, событие "перемещение мыши" не генерится на координаты каждого пикселя, а генерится на те координаты, которые есть на момент завершения обработки предыдущего события от мыши. |
||
2 ноя 19, 02:54 [22008574] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31813 |
Там тоже есть база, и при вводе символов в браузере последний отправляет запросы на сервер, а сервер шлёт запросы к БД. |
||
2 ноя 19, 02:56 [22008575] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4595 |
Нет, конечно. Так-то, эта тема к сиквелу никаким боком. Обычно делают "throttling" на клиенте - отправляют запрос к серверу только если строка поиска не менялась в течении определенного промежутка времени. |
2 ноя 19, 13:09 [22008680] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47061 |
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=755487&msg=8714817 |
2 ноя 19, 20:16 [22008804] Ответить | Цитировать Сообщить модератору |
defragmentator Member Откуда: Сообщений: 20504 |
palladin600, Я б сделал так: если походящих записей мало, то вытаскиваю из базы всё, что начинается на заданную букву и передаю на клиент. А там уже фильтрую. Можно ещё подкачку в фоновом режиме сделать. А если много записей, то да, будет медленно работать, но так никуда от этого и не уйдёшь. Сообщение было отредактировано: 2 ноя 19, 21:11 |
2 ноя 19, 21:09 [22008827] Ответить | Цитировать Сообщить модератору |
Андрей Юниор Member Откуда: Москва Сообщений: 703 |
А разве это не работа сервиса кэшировать выборки? Если использоваться ORM с кэшем? Вообще нужно ещё делать вероятностный поиск - закладывать возможность и глубину опечаток... |
2 ноя 19, 21:15 [22008830] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31813 |
Просто это уже детали реализации, и это не всегда можно сделать, не усложняя систему (например, может понадобится рефрешить кэш на всех компах-клиентах, при изменениях). |
||
2 ноя 19, 21:25 [22008834] Ответить | Цитировать Сообщить модератору |
Андрей Юниор Member Откуда: Москва Сообщений: 703 |
Я не понимаю, причём тут БД для реализации подсказок поиска. Может я думаю о подсказках уровня Яндекс/Гугла/крупного интернет-магазина, а тут надо всего лишь подсказать заполнение отдельного поля в форме? |
||
2 ноя 19, 21:52 [22008840] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31813 |
И вот, рассказываем ТС про разные варианты. |
||||
2 ноя 19, 22:14 [22008848] Ответить | Цитировать Сообщить модератору |
Андрей Юниор Member Откуда: Москва Сообщений: 703 |
БД - да. Но РСУБД - нет. РСУБД для крупного поисковика вряд ли вообще теоретически возможна. Поэтому и вопрос... У майкрософта на ажуре вроде какая-то технология поиска была. Вроде как могла искать даже по pdf и docx файлам. |
||
2 ноя 19, 22:26 [22008856] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31813 |
Скажем, какая то база компании - контрагенты, или сотрудники - загружать сотни тысяч записей на клиента вроде бы не хочется, почему бы не искать в базе?
Я только не понимаю, почему искать в СУБД можно, но только если это не РСУБД? В РСУБД поиск будет дешевле и быстрее, чем в корявой базе полнотекстового индекса (из Ажура или ещё откуда то). Всё таки ядра РСУБД оттачивались десятилетиями, и до сих пор их не забросили.
Точнее, поможет специальная самодельная индексация, которую тут обсуждали на форуме. А все стандартные не умеют индексировать с середины слова (или есть такие, которые умеют?) То есть, в итоге, остаются варианты: 1. искать в СУБД, сделав свою индексацию, позволяющую искать фрагменты текста (неважно, в какой СУБД - можно и в РСУБД MSSQL) 2. сканировать таблицу в СУБД (неважно, какой - можно и в РСУБД MSSQL) 3. сканировать предварительно загруженные в память данные (массив, список и т.д.) на клиенте/сервере приложений. 4. ещё есть экзотический вариант - эмулировать индекс в словаре в памяти (ценой увеличения расхода памяти умножением на среднюю длину строки пополам), но это имеет смысл для очень больших нагрузок, когда нормальной скорости сканирования памяти в десятки гб/сек окажется недостаточно. С соответствующими плюсами и минусами каждого варианта, и с наворотами типа кэширования для вариантов 1 и 2. |
||||||||
3 ноя 19, 00:03 [22008892] Ответить | Цитировать Сообщить модератору |
PsyMisha Member Откуда: другая столица Сообщений: 804 |
alexeyvg, Вообще, конечно, интересный технический момент. Тоже всегда было интересно, как такой упреждающий поиск по части ввода под капотом работает. наверное, - нужно изолировать окружение - фронт и бэк и, начиная вводить в поля формы, которые обладают такой "магией" мгновенного поиска-ответа - постоянно мониторить в открытом приложении Профайлера, что в итоге-то шлется на РСУБД и в каком виде. Пропускаются там лайки или нет, и какой в итоге код в базу летит |
3 ноя 19, 16:21 [22009045] Ответить | Цитировать Сообщить модератору |
Критик Member Откуда: Москва / Калуга Сообщений: 34967 Блог |
Так речь в исходном посте про сайты, а там, если не ошибаюсь, эти данные кэшируются на сервере. В общем, топик наверное нужно было создать в другом подфоруме. |
||
3 ноя 19, 18:05 [22009076] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47061 |
|
||
3 ноя 19, 19:28 [22009086] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31813 |
Для данного кейса случае даже упрощается, не нужно индексировать слова. |
||||
3 ноя 19, 19:32 [22009087] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4595 |
Какой-то странноватый кейс - искать по любому месту внутри слова. А по началу слова самый обычный фулл-текст сёрч нормально ищет. Но, вообще-то, по-моему лучше сразу двигать в сторону lucene/ellastic или чего-нибудь подобного. |
||
3 ноя 19, 22:39 [22009148] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31813 |
Для некоторых сценариев, например, поиск по номеру документа, или по названию, индекс предпочтительней. |
||||||
3 ноя 19, 23:07 [22009156] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 4068 |
жесткое заявление. ![]() SQL совсем не используется ни в каких поисковиках в этом мире! |
||
4 ноя 19, 10:42 [22009244] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3384 |
Дума, что всё, что мы пытаемся искать уже искали до нас. И где-то это хранится и проиндексировано. Соответственно никакого последовательного select тут для быстрых подсказок не нужно Достаточно более щадящих методов перемещения по отсортированной базе.. |
4 ноя 19, 11:31 [22009265] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
palladin600, инкрементный поиск делают с небольшим ожиданием ввода следующего символа, так экономятся обращения к серверу. |
4 ноя 19, 17:19 [22009447] Ответить | Цитировать Сообщить модератору |
Ролг Хупин Member Откуда: Чебаркуль Сообщений: 4068 |
что такое "отсортированная база"? и "перемещение" по ней? |
||||
4 ноя 19, 18:16 [22009469] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3384 |
Ты же не предлагаешь делать новый select после каждого изменения поисковой строки? Есть другие механизмы. |
5 ноя 19, 02:28 [22009649] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |