Как да добавите търсене в приложението си: от прости филтри до пълнотекстово търсене
За да добавите търсене в приложението си, започнете с най-простото нещо, което работи: поле за търсене, което извиква сървърен маршрут, който филтрира редовете в базата данни, като сравнява заявката с няколко колони, плюс филтри за неща като категория или цена. Когато това не е достатъчно — нужно ви е подреждане по релевантност, разпознаване на словоформи или много записи — преминете към пълнотекстовото търсене на базата данни, а към външна търсачка преминавайте само ако имате нужда от силна толерантност към печатни грешки или мигновени резултати върху много големи данни. Каквото и да изберете, търсенето трябва да спазва правата: потребителите никога не трябва да намират записи, които не имат право да виждат.
Какво означава „търсене“ за вашето приложение
Търсенето обхваща няколко различни неща и повечето приложения се нуждаят от повече от едно:
- Търсене по ключови думи: текстово поле — „намери обяви, които споменават „градина““.
- Филтри: структурирани избори — категория, град, ценови диапазон, дата, статус.
- Сортиране: най-нови, най-евтини, най-релевантни.
- Автодовършване: предложения, докато пишете.
- Толерантност към грешки: „ресторат“ все пак намира „ресторант“.
За директория, борса за работа или магазин филтрите често са по-важни от текстовото поле. Решете кое от тях наистина ви трябва, преди да изберете инструмент.
Вашите опции
| Подход | Как работи | Подходящ за | Ограничения |
|---|---|---|---|
| Филтриране в браузъра | Зареждате списъка и го филтрирате в JavaScript | Малки публични списъци (няколко стотин елемента) | Изпраща всички данни на всеки посетител; бавно при големи списъци |
| Търсене по образец в базата | Сървърна заявка като „името съдържа текста“, без значение от регистъра | Малки и средни приложения, административни инструменти | Без подреждане по релевантност; може да е бавно при големи таблици; без разпознаване на словоформи |
| Пълнотекстово търсене в базата | Postgres индексира думите и подрежда съвпаденията | Повечето приложения със съдържание | Слабо при печатни грешки, освен ако не добавите нечетко съвпадение |
| Нечетко съвпадение (триграми) | Postgres сравнява сходството на последователности от знаци | Имена, кратки полета, толерантност към грешки | Изисква разширение и индекс; настройката отнема време |
| Хостната търсачка | Отделна услуга индексира данните ви (Algolia, Meilisearch, Typesense, Elasticsearch и други) | Големи каталози, мигновено търсене, силна толерантност към грешки | Още една услуга за синхронизиране, плащане и защита |
Ако данните ви вече са в Postgres, неговото вградено пълнотекстово търсене е силен среден вариант. То разбива текста на думи, свежда ги до основи (така „running“ съвпада с „run“), пренебрегва често срещаните думи и може да подрежда резултатите според това колко добре съвпадат. С правилния индекс остава бързо върху големи таблици.
Примерни подсказки
Прост старт:
Добави поле за търсене и филтри към страницата с обяви. Търсенето да сравнява заявката със заглавието и описанието, без значение от регистъра. Филтри: категория (падащо меню), град (падащо меню) и максимална цена. Търсенето да се извършва на сървъра чрез маршрут с страниране, 20 резултата на страница. Търсенето и филтрите да се пазят в URL адреса, за да могат резултатите да се споделят и бутонът „назад“ да работи. Покажи приятелско празно състояние, когато нищо не съвпада.
Надграждане до пълнотекстово търсене:
Превключи търсенето на обяви към пълнотекстово търсене на Postgres върху заглавието (с по-голяма тежест) и описанието. Добави правилния индекс, подреди резултатите по релевантност и запази съществуващите филтри и страниране. Не променяй съществуващите данни.
Добавяне на толерантност към грешки за имена:
Добави нечетко съвпадение по име на бизнеса, така че малките печатни грешки да намират резултати. Използвай сходство по триграми, ако е налично, с индекс, и върни текущото търсене, ако не е.
Стъпка по стъпка
- Запишете какво търсят хората. Кои полета (заглавие, описание, тагове, име)? Кои филтри? Попитайте няколко реални потребители, ако можете.
- Започнете от сървъра. Добавете API маршрут, който приема заявката и филтрите и връща една страница резултати. Не зареждайте всичко в браузъра.
- Прилагайте правата в заявката. Ако потребителите виждат само своите записи или само публикуваните, това условие трябва да е в същата заявка като търсенето.
- Добавете страниране от самото начало — номера на страници или „зареди още“.
- Пазете състоянието на търсенето в URL адреса (например
?q=garden&city=leeds). Споделяеми връзки, работещ бутон „назад“ и търсачките могат да обхождат филтрираните страници, ако искате да го правят. - Забавете търсенето при писане. Изчаквайте няколкостотин милисекунди, след като спрете да пишете, преди да изпратите заявка, за да не изпращате по една на всеки натиснат клавиш.
- Добавете индекси, когато знаете по кои колони филтрирате и търсите.
- Надграждайте до пълнотекстово търсене, после до нечетко съвпадение, после до хостнатата търсачка — само когато по-простата стъпка се провали пред реални потребители.
- Тествайте с реалистични данни: стотици или хиляди реда, странни знаци, празни заявки, много дълги заявки, други езици, ако ги поддържате.
Чести грешки
- Зареждане на цялата таблица в браузъра. Добре е за 50 елемента, мъчително за 50 000, а и разкрива всеки запис — включително тези, които потребителят не трябва да вижда.
- Търсене, което игнорира правата. Търсенето е честа течаща точка: частен или чернов запис се появява, защото заявката е забравила условието „само моите“ или „само публикуваните“.
- Изграждане на SQL от сурови потребителски данни. Винаги използвайте параметризирани заявки. AI строителят обикновено ги използва, но проверете, ако виждате низове, слепени заедно.
- Няма празно състояние. „Няма резултати“ с предложение (изчистете филтрите, проверете изписването) задържа хората.
- Липсващи индекси. Търсенето изглежда добре с тестови данни и се забавя, когато реалните данни растат.
- Скачане направо към търсачка. После трябва да пазите второ копие на данните синхронизирано, да се справяте с изтриванията и да защитавате още един набор ключове — често без видима полза.
- Забравен мобилен екран. Филтрите трябва да се побират на телефон; панел с филтри, който се разгъва, обикновено работи по-добре от страничен панел.
Контролен списък
- Знаете кои полета се търсят и кои филтри съществуват
- Търсенето работи на сървъра и връща страниран резултат
- Заявката налага същите права като останалото приложение
- Потребителският вход се подава като параметри, никога не се слепва в SQL
- Състоянието на търсенето е в URL адреса
- Писането е с забавяне (debounce)
- Търсените и филтрираните колони са индексирани
- Празните, „без резултати“ и грешките са ясни
- Тествано с реалистични обеми данни и неподредени входни данни
Търсене с Mythex
В приложение, построено в Mythex, данните обикновено са в Postgres базата данни на проекта, така че можете да започнете с подсказките по-горе: първо търсене по образец, после пълнотекстово търсене в Postgres, когато ви трябва подреждане. Ако искате хостната търсачка, донесете собствен акаунт и ключ, съхранете го като тайна на проекта и поискайте от агента да индексира и търси през сървъра, както е описано в Интегриране на всяко API.
Търсенето е в основата на много приложения: вижте как да създадете уебсайт тип директория, как да създадете борса за работа и как да създадете маркетплейс, за да видите как се вписва в останалия продукт.
Въпроси
Кой е най-лесният начин да добавя търсене в приложение?
Ако данните ви са в база данни, най-лесното начало е сървърен маршрут, който филтрира редовете със сравнение без значение от малки и големи букви върху няколко колони. За малък списък, който вече е зареден в браузъра, филтрирането в браузъра е още по-просто.
Нужен ли ми е Algolia или Elasticsearch за търсене?
Обикновено не в началото. Пълнотекстовото търсене на Postgres се справя добре със съвпадения на думи, подреждане по релевантност и от хиляди до милиони редове. Външната търсачка си струва, когато имате нужда от силна толерантност към печатни грешки, мигновени резултати при писане върху големи данни или напреднала настройка на релевантността.
Защо търсенето ми не намира резултати при печатни грешки?
Основното съвпадение и стандартното пълнотекстово търсене търсят думите такива, каквито са написани (или техните основи), така че грешката в изписването пропуска. Нужно ви е нечетко съвпадение, например сходство по триграми в Postgres или търсачка с толерантност към грешки.
Търсенето трябва ли да работи в браузъра или на сървъра?
На сървъра за всичко, което е по-голямо от малък публичен списък. Търсенето от страна на сървъра се мащабира, спазва правата и не изпраща целия ви набор от данни на всеки посетител.