วิธีเพิ่มการค้นหาในแอปของคุณ: ตั้งแต่ตัวกรองง่ายๆ ไปจนถึงการค้นหาข้อความเต็ม
ในการเพิ่มการค้นหาให้แอปของคุณ ให้เริ่มจากสิ่งที่ง่ายที่สุดและใช้งานได้: กล่องค้นหาที่เรียกเส้นทางบนเซิร์ฟเวอร์ ซึ่งกรองแถวในฐานข้อมูลโดยเทียบคำค้นกับไม่กี่คอลัมน์ พร้อมตัวกรองสิ่งต่างๆ เช่น หมวดหมู่หรือราคา เมื่อสิ่งนั้นยังไม่เพียงพอ เช่น คุณต้องการการจัดอันดับตามความเกี่ยวข้อง การตัดรากคำ หรือมีระเบียนจำนวนมาก ให้เปลี่ยนไปใช้การค้นหาข้อความเต็มของฐานข้อมูล และย้ายไปใช้บริการค้นหาแบบโฮสต์ก็ต่อเมื่อคุณต้องการการทนต่อคำพิมพ์ผิดอย่างดีหรือผลลัพธ์ทันทีบนข้อมูลขนาดใหญ่ ไม่ว่าจะเลือกแบบไหน การค้นหาต้องเคารพสิทธิ์: ผู้ใช้ไม่ควรพบระเบียนที่ตนไม่มีสิทธิ์เห็น
"การค้นหา" หมายถึงอะไรสำหรับแอปของคุณ
การค้นหาครอบคลุมหลายอย่าง และแอปส่วนใหญ่ต้องการมากกว่าหนึ่งอย่าง:
- การค้นหาด้วยคำสำคัญ: กล่องข้อความ เช่น "หารายการที่มีคำว่า 'garden'"
- ตัวกรอง: ตัวเลือกที่มีโครงสร้าง เช่น หมวดหมู่ เมือง ช่วงราคา วันที่ สถานะ
- การเรียงลำดับ: ใหม่สุด ถูกสุด เกี่ยวข้องสุด
- การเติมคำอัตโนมัติ: คำแนะนำขณะพิมพ์
- การทนต่อคำพิมพ์ผิด: "restuarant" ยังหา "restaurant" ได้
สำหรับไดเรกทอรี กระดานงาน หรือร้านค้า ตัวกรองมักสำคัญกว่ากล่องข้อความ ตัดสินใจว่าคุณต้องการอะไรจริงๆ ก่อนเลือกเครื่องมือ
ตัวเลือกของคุณ
| แนวทาง | วิธีทำงาน | เหมาะกับ | ข้อจำกัด |
|---|---|---|---|
| กรองในเบราว์เซอร์ | โหลดรายการ แล้วกรองด้วย JavaScript | รายการสาธารณะขนาดเล็ก (ไม่กี่ร้อยรายการ) | ส่งข้อมูลทั้งหมดให้ผู้เข้าชมทุกคน และช้าเมื่อรายการใหญ่ |
| การจับคู่รูปแบบในฐานข้อมูล | คิวรีฝั่งเซิร์ฟเวอร์ เช่น "ชื่อมีข้อความ" ไม่สนตัวพิมพ์ | แอปขนาดเล็กถึงกลาง เครื่องมือผู้ดูแล | ไม่มีการจัดอันดับ อาจช้าบนตารางใหญ่ ไม่มีการตัดรากคำ |
| การค้นหาข้อความเต็มในฐานข้อมูล | Postgres จัดทำดัชนีคำและจัดอันดับผลที่ตรงกัน | แอปที่มีเนื้อหาจำนวนมากส่วนใหญ่ | อ่อนต่อคำพิมพ์ผิด เว้นแต่คุณเพิ่มการจับคู่แบบคลุมเครือ |
| การจับคู่แบบคลุมเครือ (trigram) | Postgres เปรียบเทียบลำดับตัวอักษรเพื่อหาความคล้าย | ชื่อ ฟิลด์สั้นๆ การทนต่อคำพิมพ์ผิด | ต้องใช้ extension และดัชนี และต้องปรับแต่ง |
| บริการค้นหาแบบโฮสต์ | บริการแยกทำดัชนีข้อมูลของคุณ (Algolia, Meilisearch, Typesense, Elasticsearch และอื่นๆ) | แคตตาล็อกขนาดใหญ่ การค้นหาทันที การทนต่อคำพิมพ์ผิดสูง | ต้องดูแลการซิงก์อีกบริการ จ่ายเงิน และรักษาความปลอดภัยเพิ่ม |
หากข้อมูลของคุณอยู่ใน Postgres อยู่แล้ว การค้นหาข้อความเต็ม ในตัวของมันคือทางเลือกกลางที่ดี มันแบ่งข้อความเป็นคำ ลดคำเป็นรากคำ (ทำให้ "running" ตรงกับ "run") ข้ามคำทั่วไป และจัดอันดับผลตามความตรงกัน ด้วยดัชนีที่เหมาะสม มันจะยังคงเร็วบนตารางขนาดใหญ่
พรอมต์ตัวอย่าง
จุดเริ่มต้นที่ง่าย:
เพิ่มกล่องค้นหาและตัวกรองในหน้ารายการ การค้นหาควรเทียบคำค้นกับ title และ description โดยไม่สนตัวพิมพ์ใหญ่-เล็ก ตัวกรอง: หมวดหมู่ (รายการเลือก) เมือง (รายการเลือก) และราคาสูงสุด ทำการค้นหาบนเซิร์ฟเวอร์ด้วยเส้นทาง API แบบแบ่งหน้า 20 ผลต่อหน้า เก็บการค้นหาและตัวกรองไว้ใน URL เพื่อให้แชร์ผลลัพธ์ได้และปุ่มย้อนกลับทำงาน แสดงสถานะว่างที่เป็นมิตรเมื่อไม่มีอะไรตรง
การอัปเกรดเป็นการค้นหาข้อความเต็ม:
เปลี่ยนการค้นหารายการเป็นการค้นหาข้อความเต็มของ Postgres บน title (ให้น้ำหนักสูงกว่า) และ description เพิ่มดัชนีที่เหมาะสม จัดอันดับผลตามความเกี่ยวข้อง และคงตัวกรองและการแบ่งหน้าที่มีอยู่ไว้ อย่าเปลี่ยนข้อมูลที่มีอยู่
การเพิ่มการทนต่อคำพิมพ์ผิดสำหรับชื่อ:
เพิ่มการจับคู่แบบคลุมเครือบนชื่อธุรกิจ เพื่อให้คำพิมพ์ผิดเล็กน้อยยังหาผลลัพธ์ได้ ใช้ trigram similarity ถ้ามี พร้อมดัชนี และถอยกลับไปใช้การค้นหาปัจจุบันถ้าไม่มี
ทำทีละขั้น
- ลิสต์สิ่งที่ผู้คนค้นหา ฟิลด์ใดบ้าง (title, description, tags, name) ตัวกรองใดบ้าง ถามผู้ใช้จริงสักไม่กี่คนถ้าทำได้
- เริ่มจากฝั่งเซิร์ฟเวอร์ เพิ่ม API route ที่รับคำค้นและตัวกรอง และคืนผลหนึ่งหน้า อย่าโหลดทุกอย่างเข้าเบราว์เซอร์
- ใช้สิทธิ์ในคิวรี หากผู้ใช้เห็นเฉพาะระเบียนของตนเอง หรือเฉพาะที่เผยแพร่แล้ว เงื่อนไขนั้นต้องอยู่ในคิวรีเดียวกับการค้นหา
- เพิ่มการแบ่งหน้าตั้งแต่วันแรก ไม่ว่าจะเป็นหมายเลขหน้าหรือ "โหลดเพิ่ม"
- เก็บสถานะการค้นหาไว้ใน URL (เช่น
?q=garden&city=leeds) ลิงก์ที่แชร์ได้ ปุ่มย้อนกลับที่ทำงาน และเครื่องมือค้นหาสามารถรวบรวมข้อมูลหน้าที่กรองแล้วได้หากคุณต้องการ - หน่วงเวลาการค้นหาขณะพิมพ์ รอไม่กี่ร้อยมิลลิวินาทีหลังหยุดพิมพ์ก่อนส่งคิวรี เพื่อไม่ให้ส่งคำขอทุกการกดแป้น
- เพิ่มดัชนี เมื่อคุณรู้แล้วว่าคุณกรองและค้นหาจากคอลัมน์ใด
- อัปเกรด ไปเป็นการค้นหาข้อความเต็ม จากนั้นการจับคู่แบบคลุมเครือ แล้วจึงบริการแบบโฮสต์ เฉพาะเมื่อขั้นตอนที่ง่ายกว่าไม่ตอบโจทย์ผู้ใช้จริง
- ทดสอบ ด้วยข้อมูลที่ดูสมจริง: หลายร้อยหรือหลายพันแถว อักขระแปลกๆ คำค้นว่าง คำค้นที่ยาวมาก และภาษาอื่นหากคุณรองรับ
ข้อผิดพลาดที่พบบ่อย
- โหลดตารางทั้งหมดเข้าเบราว์เซอร์ ใช้ได้สำหรับ 50 รายการ แต่ทรมานสำหรับ 50,000 และเปิดเผยทุกระเบียน รวมถึงระเบียนที่ผู้ใช้ไม่ควรเห็น
- การค้นหาที่เพิกเฉยต่อสิทธิ์ การค้นหาเป็นช่องรั่วที่พบบ่อย: ระเบียนส่วนตัวหรือฉบับร่างโผล่ขึ้นมาเพราะคิวรีค้นหาลืมเงื่อนไข "เฉพาะของฉัน" หรือ "เฉพาะที่เผยแพร่แล้ว"
- สร้าง SQL จากข้อมูลดิบของผู้ใช้ ใช้คิวรีแบบมีพารามิเตอร์เสมอ เครื่องมือสร้างแอปด้วย AI มักทำให้อยู่แล้ว แต่ให้ตรวจหากเห็นการต่อสตริง
- ไม่มีสถานะว่าง "ไม่พบผลลัพธ์" พร้อมคำแนะนำ (ล้างตัวกรอง ตรวจการสะกด) ช่วยไม่ให้คนออกจากหน้า
- ไม่มีดัชนี การค้นหาดูดีกับข้อมูลทดสอบ แต่ช้าลงเมื่อข้อมูลจริงเติบโต
- กระโดดไปใช้บริการค้นหาทันที คุณต้องดูแลสำเนาข้อมูลที่สองให้ซิงก์ จัดการการลบ และรักษาความปลอดภัยชุดคีย์อีกชุด มักโดยไม่ได้ประโยชน์ที่มองเห็นได้
- ลืมมือถือ ตัวกรองต้องพอดีกับหน้าจอโทรศัพท์ ลิ้นชักตัวกรองหรือแผงที่พับได้มักใช้งานได้ดีกว่าแถบข้าง
เช็กลิสต์
- คุณรู้ว่าฟิลด์ใดถูกค้นหาและมีตัวกรองอะไรบ้าง
- การค้นหาทำงานบนเซิร์ฟเวอร์และคืนผลแบบแบ่งหน้า
- คิวรีบังคับใช้สิทธิ์เดียวกับส่วนอื่นของแอป
- ข้อมูลที่ผู้ใช้ป้อนส่งเป็นพารามิเตอร์ ไม่ต่อเข้ากับ SQL
- สถานะการค้นหาอยู่ใน URL
- การพิมพ์ถูกหน่วงเวลา
- คอลัมน์ที่ค้นหาและกรองมีดัชนี
- สถานะว่าง ไม่พบผลลัพธ์ และข้อผิดพลาดชัดเจน
- ทดสอบด้วยปริมาณข้อมูลที่สมจริงและข้อมูลที่ไม่เรียบร้อย
การเพิ่มการค้นหาด้วย Mythex
ในแอปที่สร้างบน Mythex ข้อมูลมักอยู่ใน ฐานข้อมูล Postgres ของโปรเจกต์เอง ดังนั้นคุณเริ่มได้ด้วยพรอมต์ด้านบน คือการจับคู่รูปแบบก่อน แล้วค่อยใช้การค้นหาข้อความเต็มของ Postgres เมื่อต้องการการจัดอันดับ หากต้องการบริการค้นหาแบบโฮสต์ ให้นำบัญชีและคีย์ของคุณเอง เก็บเป็นความลับของโปรเจกต์ แล้วขอให้เอเจนต์จัดทำดัชนีและคิวรีจากฝั่งเซิร์ฟเวอร์ ตามที่อธิบายใน Integrate any API
การค้นหาคือแกนกลางของหลายแอป ดู วิธีสร้างเว็บไซต์ไดเรกทอรี วิธีสร้างกระดานงาน และ วิธีสร้างมาร์เก็ตเพลส เพื่อดูว่าการค้นหาเข้ากับส่วนอื่นของผลิตภัณฑ์อย่างไร
คำถาม
วิธีที่ง่ายที่สุดในการเพิ่มการค้นหาในแอปคืออะไร?
หากข้อมูลของคุณอยู่ในฐานข้อมูล เส้นทางบนเซิร์ฟเวอร์ที่กรองแถวด้วยการจับคู่ที่ไม่สนตัวพิมพ์ใหญ่-เล็กในไม่กี่คอลัมน์ คือจุดเริ่มต้นที่ง่ายที่สุด สำหรับรายการเล็กๆ ที่โหลดอยู่ในเบราว์เซอร์แล้ว การกรองในเบราว์เซอร์ง่ายกว่าอีก
ต้องใช้ Algolia หรือ Elasticsearch สำหรับการค้นหาหรือไม่?
โดยทั่วไปยังไม่ต้องในตอนแรก การค้นหาข้อความเต็มของ Postgres จัดการการจับคู่คำ การจัดอันดับ และหลักพันถึงหลักล้านแถวได้ดี บริการค้นหาแบบโฮสต์คุ้มค่าเมื่อคุณต้องการการทนต่อคำที่พิมพ์ผิดได้ดี ผลลัพธ์ทันทีขณะพิมพ์บนข้อมูลขนาดใหญ่ หรือการปรับความเกี่ยวข้องขั้นสูง
ทำไมการค้นหาของฉันไม่พบผลลัพธ์เมื่อพิมพ์ผิด?
การจับคู่พื้นฐานและการค้นหาข้อความเต็มมาตรฐานมองหาคำตามที่พิมพ์ (หรือรากของคำ) ดังนั้นการสะกดผิดจึงหาไม่เจอ คุณต้องใช้การจับคู่แบบคลุมเครือ (fuzzy) เช่น trigram similarity ใน Postgres หรือบริการค้นหาที่ทนต่อคำพิมพ์ผิด
การค้นหาควรทำงานในเบราว์เซอร์หรือบนเซิร์ฟเวอร์?
บนเซิร์ฟเวอร์สำหรับทุกอย่างที่เกินกว่ารายการสาธารณะขนาดเล็ก การค้นหาฝั่งเซิร์ฟเวอร์ขยายขนาดได้ เคารพสิทธิ์ และไม่ส่งชุดข้อมูลทั้งหมดของคุณไปยังผู้เข้าชมทุกคน