Аппдаа хайлт нэмэх хэрхэн вэ: энгийн шүүлтүүрээс бүтэн текстийн хайлт хүртэл
Аппдаа хайлт нэмэхийн тулд хамгийн энгийн ажиллах зүйлээс эхэл: серверийн маршрут руу дуудах хайлтын хайрцаг, энэ маршрут нь өгөгдлийн санд хэдэн баганад асуултыг таарч мөрүүдийг шүүнэ, мөн ангилал эсвэл үнэ гэх мэт шүүлтүүртэй. Үүнээс хангалтгүй болвол — үр дүнг эрэмбэлэх, үгийн үндсийг таних, олон бичлэг шаардагдвал — өгөгдлийн сангийн бүтэн текстийн хайлт руу шилж, зөвхөн алдаа тэсвэрлэлт эсвэл маш том өгөгдөл дээр шууд үр дүн хэрэгтэй бол л хостлогдсон хайлтын системд шилж. Ямар ч сонголт хийсэн ч хайлт зөвшөөрлийг хүндэтгэх ёстой: хэрэглэгч ямар ч үед өөрт хандах эрхгүй бичлэгийг олох ёсгүй.
Аппдаа "хайлт" гэдэг нь юу вэ
Хайлт хэд хэдэн өөр зүйлийг хамардаг бөгөөд ихэнх апп нэгээс илүүг хэрэгтэй болдог:
- Түлхүүр үгээр хайлт: текстийн хайрцаг — "'garden'-ийг дурдсан жагсаалтуудыг ол".
- Шүүлтүүр: бүтэцтэй сонголтууд — ангилал, хот, үнийн хүрээ, огноо, статус.
- Эрэмбэлэх: хамгийн шинэ, хамгийн хямд, хамгийн тохирох.
- Автомат бүрэн: бичих явцад санал болгох.
- Алдаа тэсвэрлэх: "restuarant" нь "restaurant"-ийг олно.
Лавлах, ажлын зар, дэлгүүрийн хувьд шүүлтүүр нь текстийн хайрцагаас илүү чухал байдаг. Хэрэгсэл сонгохоосоо өмнө эдгээрээс аль нь жинхэнэ хэрэгтэйг шийд.
Таны сонголтууд
| Арга | Хэрхэн ажилладаг | Тохиромжтой | Хязгаар |
|---|---|---|---|
| Браузер дээр шүүх | Жагсаалтыг ачаалж, JavaScript-ээр шүүнэ | Жижиг нийтийн жагсаалт (хэдэн зуун зүйл) | Бүх өгөгдлийг зочин бүрт илгээнэ; том жагсаалт удаан |
| Өгөгдлийн сангийн загвараар таарах | Серверийн асуулга "нэр нь текстийг агуулдаг", том үсэг үл ялгана | Жижиг-дунд апп, админы хэрэгсэл | Эрэмбэлэлт байхгүй; том хүснэгт удаан байж болно; үгийн үндэс үгүй |
| Өгөгдлийн сангийн бүтэн текстийн хайлт | Postgres үгсийг индекслэж, таарсан үрийг эрэмбэлнэ | Ихэнх контент ихтэй апп | Алдаанд сул, хэрэв fuzzy таарах нэмээгүй бол |
| Fuzzy таарах (trigram) | Postgres тэмдэгтийн дарааллыг ижил төстэй эсэхийг харьцуулна | Нэр, богино талбар, алдаа тэсвэрлэх | Өргөтгөл болон индекс хэрэгтэй; тохируулга хэрэгтэй |
| Хостлогдсон хайлтын систем | Тусдаа үйлчилгээ таны өгөгдлийг индекслэнэ (Algolia, Meilisearch, Typesense, Elasticsearch болон бусад) | Том каталог, шууд хайлт, хүчтэй алдаа тэсвэрлэлт | Синк хийх, төлбөр төлөх, хамгаалах өөр нэг үйлчилгээ |
Хэрэв таны өгөгдөл аль хэдийн Postgres-д байгаа бол түүний суурилуулсан бүтэн текстийн хайлт сайн дунд зам юм. Энэ нь текстийг үгс болгон хуваана, үгсийг үндэс рүү багасгана (тиймээс "running" нь "run"-тай таарна), түгээмэл үгсийг үл тооно, мөн таарах чанараар үр дүнг эрэмбэлж чадна. Зохистой индекстэй бол том хүснэгт дээр ч хурдан байна.
Жишээ запрууд
Энгийн эхлэл:
Жагсаалтын хуудсанд хайлтын хайрцаг болон шүүлтүүр нэм. Хайлт нь асуултыг гарчиг болон тайлбартай таарууулна, том жижиг үсэг үл ялгана. Шүүлтүүрүүд: ангилал (dropdown), хот (dropdown) болон дээд үнэ. Хайлтыг серверт, хуудаслагдсан API маршрутаар хий, хуудас бүрт 20 үр дүн. Хайлт болон шүүлтүүрийг URL-д хадгал, ингэснээр үр дүнг хуваалцаж, буцах товчлуур ажиллана. Ямар ч таарахгүй үед найрсаг хоосон төлөв харуул.
Бүтэн текстийн хайлт руу шилжүүлэх:
Жагсаалтын хайлтыг гарчиг (илүү жинтэй) болон тайлбар дээр Postgres-ийн бүтэн текстийн хайлт руу шилжүүл. Зохих индекс нэм, үр дүнг хамааралтай байдлаар эрэмбэл, одоо байгаа шүүлтүүр болон хуудаслалтыг хадгал. Одоогийн өгөгдлийг өөрчлөхгүй.
Нэрний алдаа тэсвэрлэх:
Бизнесийн нэр дээр fuzzy таарах нэм, ингэснээр жижиг алдаатай бичсэн ч үр дүн олдоно. Боломжтой бол trigram ижил төстэй байдлыг индекстэй ашигла, боломжгүй бол одоогийн хайлтад буцаж унах.
Алхам алхмаар
- Хүмүүс юу хайдгийг жагсаа. Аль талбарууд (гарчиг, тайлбар, таг, нэр)? Ямар шүүлтүүр? Боломжтой бол хэдэн жинхэнэ хэрэглэгчээс асуу.
- Серверээс эхэл. Асуулга ба шүүлтүүрийг хүлээж, нэг хуудас үр дүн буцаадаг API маршрут нэм. Бүх зүйлийг браузерт ачаалахгүй.
- Асуулгад зөвшөөрлийг хэрэгжүүл. Хэрэглэгч зөвхөн өөрийн бичлэгийг, эсвэл зөвхөн нийтлэгдсэнийг харвал тэр нөхцөл хайлттай нэг асуулгад байх ёстой.
- Эхнээсээ хуудаслалт нэм — хуудасны дугаар эсвэл "илүү ачаалах".
- Хайлтын төлөвийг URL-д байрлуул (жишээ нь
?q=garden&city=leeds). Хуваалцах боломжтой линк, ажилладаг буцах товчлуур, мөн хүсвэл шүүсэн хуудсуудыг хайлтын системүүд үзэх боломж. - Бичих явцад хайлтыг хойшлуул. Бичиж дуусгасны дараа хэдэн зуун миллисекунд хүлээгээд асуу, ингэснээр гар бүрт хүсэлт явахгүй.
- Индекс нэм таны хайж, шүүдэг баганыг мэдсэний дараа.
- Шинэчил: бүтэн текст, дараа нь fuzzy, дараа нь хостлогдсон систем — зөвхөн энгийн алхам бодит хэрэглэгчдэд хангалтгүй байх үед.
- Туршаарай бодит мэт өгөгдөлтэй: хэдэн зуу, хэдэн мянган мөр, хачин тэмдэгт, хоосон асуулга, маш урт асуулга, дэмжсэн бол бусад хэлээр.
Түгээмэл алдаанууд
- Бүх хүснэгтийг браузерт ачаалах. 50 зүйлд зүгээр, 50,000 дээр зовлонтой, мөн хэрэглэгчийн харах ёсгүй бичлэг бүрийг ил болгоно.
- Зөвшөөрлийг үл тооцсон хайлт. Хайлт бол түгээмэл алдагдлын зам: хувийн эсвэл ноорог бичлэг гарч ирнэ, учир нь асуулга "зөвхөн миний" эсвэл "зөвхөн нийтлэгдсэн" нөхцөлийг мартсан.
- Хэрэглэгчийн оруулгаас SQL бүтээх. Үргэлж параметрлэгдсэн асуулга ашигла. AI builder ихэвчлэн ийм байдаг, гэхдээ мөрүүд наагдсан байгааг харвал шалга.
- Хоосон төлөв байхгүй. "Үр дүн олдсонгүй" гэж санал (шүүлтүүрээ цэвэрлэх, бичлгээ шалгах) хамт харуул, ингэснээр хүмүүс явахгүй.
- Индекс байхгүй. Туршилтын өгөгдөлд хайлт сайн харагдаад, жинхэнэ өгөгдөл өсөхөд удаашрана.
- Шууд хайлтын үйлчилгээ рүү үсрэх. Тэгвэл та өгөгдлийнхөө хоёр дахь хуулбарыг синк хийх, устгалыг зохицуулах, өөр түлхүүрүүдийг хамгаалах — ихэнхдээ харагдах ашиггүйгээр.
- Мобайлыг мартах. Шүүлтүүр утсан дээр багтах ёстой; шүүлтүүрийн шургуулага эсвэл нугалдаг самбар ихэвчлэн хажуугийн самбараас илүү сайн.
Жагсаалт
- Ямар талбар хайгдаж, ямар шүүлтүүр байгааг мэдэж байна
- Хайлт серверт ажиллаж, хуудаслагдсан үр дүн буцаана
- Асуулга аппын бусад хэсэгтэй адил зөвшөөрлийг хэрэгжүүлнэ
- Хэрэглэгчийн оруулгыг параметр болгон дамжуулж, SQL-д наахгүй
- Хайлтын төлөв URL-д байна
- Бичих явцыг хойшлуулсан
- Хайж, шүүдэг баганууд индекслэгдсэн
- Хоосон, үр дүнгүй, алдааны төлөв тодорхой
- Бодит хэмжээ, мессий оролтоор туршсан
Mythex-ээр хайлт нэмэх нь
Mythex дээр бүтээсэн аппд өгөгдөл ихэвчлэн төслийн өөрийн Postgres өгөгдлийн сан дээр байдаг, тиймээс дээрх запрууд ашиглан эхэлж болно: эхлээд загвараар таарах, дараа нь эрэмбэлэхэд Postgres-ийн бүтэн текстийн хайлт. Хэрэв хостлогдсон хайлтын систем хүсвэл өөрийн данс, түлхүүрээ авч, төслийн нууц мэдээллээр хадгалж, агентаас серверээс индекслэх, асуух хүс — Any API-г холбох хуудсанд тайлбарласнаар.
Хайлт нь олон аппын гол хэсэг юм: үүнийг бусад бүтээгдэхүүнд хэрхэн нийцдэгийг лавлах вэбсайт хэрхэн бүтээх вэ, ажлын зар хэрхэн бүтээх вэ болон зах зээл хэрхэн бүтээх вэ хуудсуудаас үзнэ үү.
Асуултууд
Аппд хайлт нэмэх хамгийн хялбар арга юу вэ?
Таны өгөгдөл өгөгдлийн санд байвал, хэдэн баганад таарсан текстээр мөрүүдийг шүүдэг серверийн маршрут хамгийн энгийн эхлэл юм. Хөтөчд аль хэдийн ачаалагдсан жижиг жагсаалтын хувьд хөтөч дээр шүүх бүр энгийн.
Хайлтад Algolia эсвэл Elasticsearch хэрэгтэй юу?
Эхлээд ихэвчлэн хэрэггүй. Postgres-ийн бүтэн текстийн хайлт нь үг таарах, эрэмбэлэх, мянга-сая мөрийг сайн даадаг. Хостлогдсон хайлтын систем нь хүчтэй алдаа тэсвэрлэлт, том өгөгдөл дээрх шууд хайлт, нарийн харьцаа тохируулах шаардлагатай үед л үнэ цэнэтэй.
Яагаад миний хайлт алдаатай бичсэн үгээр үр дүн олохгүй байна вэ?
Энгийн таарах болон стандарт бүтэн текстийн хайлт нь үгсийг бичсэнээр (эсвэл тэдгээрийн үндсээр) хайдаг тул андуурсан бичвэр алддаг. Fuzzy таарах, жишээ нь Postgres-ийн trigram ижил төстэй байдал эсвэл алдаа тэсвэрлэдэг хайлтын систем хэрэгтэй.
Хайлт браузер дээр ажиллах уу, серверт уу?
Жижиг нийтийн жагсаалтаас илүү бүх зүйлд серверт. Серверийн хайлт нь өргөжин, зөвшөөрлийг хүндэтгэж, бүх өгөгдлөө зочин бүрт илгээхгүй.