ช่องค้นหาสถานที่เป็นจุดแรกที่ลูกค้าแตะในแอปส่งของ เรียกรถ หรือจองบริการ ถ้าพิมพ์แล้วไม่เจอ ลูกค้าก็ปิดแอป ภาษาไทยมีปัญหาเฉพาะที่ระบบค้นหาทั่วไปไม่ได้ออกแบบมาให้ บทความนี้สรุปปัญหาและหลักทำช่องค้นหาที่คนไทยใช้แล้วเจอ
คนไทยพิมพ์ค้นหาแบบนี้
| ผู้ใช้พิมพ์ | ต้องการเจอ | ทำไมยาก |
|---|---|---|
| รพ.รามาธิบดี | โรงพยาบาลรามาธิบดี | ตัวย่อ |
| BTS อารีย์ | สถานีอารีย์ | ชื่อในข้อมูลไม่มีคำว่า BTS |
| เซ็นทรัล ลาดพร้าว | เซ็นทรัลลาดพร้าว | เว้นวรรคไม่ตรงกัน |
| ICONSIAM | ไอคอนสยาม | ชื่ออังกฤษ ข้อมูลเป็นภาษาไทย |
| สุวรรณภูมิ | ท่าอากาศยานสุวรรณภูมิ | มีร้านเล็ก ๆ ชื่อ "สุวรรณภูมิ" ตรงกว่าแต่ไม่ใช่ที่ที่ต้องการ |
| Patuxay | ประตูชัย เวียงจันทน์ | สะกดได้หลายแบบ ข้อมูลเป็นภาษาลาว |
หลัก 5 ข้อ
- ทำให้ข้อความเป็นรูปเดียวกันก่อนเทียบ ตัดเว้นวรรค เครื่องหมาย วรรณยุกต์ และตัวการันต์ ทั้งคำค้นและชื่อในฐานข้อมูล "เซ็นทรัล ลาดพร้าว" กับ "เซ็นทรัลลาดพร้าว" จะกลายเป็นข้อความเดียวกัน
- ขยายตัวย่อทั้งสองฝั่ง รพ. = โรงพยาบาล, ม. = มหาวิทยาลัย, รร. = โรงเรียน, BTS/MRT/รถไฟฟ้า = สถานี, ท่าอากาศยาน = สนามบิน
- เก็บชื่ออื่นของสถานที่ ชื่อไทย อังกฤษ ลาว ชื่อเล่น และชื่อเดิม ให้ค้นได้ทุกชื่อแต่แสดงชื่อหลักชื่อเดียว
- จัดอันดับด้วยความสำคัญ ไม่ใช่แค่ตัวอักษรตรง สนามบิน สถานี ห้าง โรงพยาบาล ต้องขึ้นก่อนร้านที่ชื่อตรงกว่า และสถานที่ใกล้ผู้ใช้ขึ้นก่อนที่ไกล
- เติมคำขณะพิมพ์อย่างประหยัด รอผู้ใช้หยุดพิมพ์ราว 250 มิลลิวินาทีก่อนส่ง ยกเลิกคำขอเก่า และนับเงินเป็นรอบการค้นหา (session) ไม่ใช่ทุกตัวอักษร
ผลทดสอบของ RRevX Maps API
ข้อมูลสถานที่ไทยและลาว 731,096 แห่ง (Overture Maps อัปเดตทุกเดือน) ใช้หลักทั้ง 5 ข้อข้างบน ทดสอบเมื่อ 10 ต.ค. 2569 ด้วยคำค้น 17 คำในตารางชุดเดียวกับที่ใช้ในแอป RRevX Ride: สถานที่ที่ถูกต้องขึ้นอันดับ 1 ครบ 17/17 ห่างจากตำแหน่งจริงไม่เกิน 300 เมตร · เวลาค้นในฐานข้อมูลขณะพิมพ์ p95 38 มิลลิวินาที
สิ่งที่ยังค้นไม่ได้: บ้านเลขที่และที่อยู่ที่ไม่ใช่สถานที่ (ให้ผู้ใช้ปักหมุดแทน) · หมู่บ้านเล็กหรือร้านเปิดใหม่ที่ยังไม่อยู่ในข้อมูล
ตัวอย่างโค้ดเติมคำขณะพิมพ์
let session = crypto.randomUUID(), ctrl, timer;
input.addEventListener('input', () => {
clearTimeout(timer);
timer = setTimeout(async () => {
ctrl?.abort(); ctrl = new AbortController();
const p = new URLSearchParams({ q: input.value, session, focus: `${lng},${lat}`, key: PUBLIC_KEY });
const { results } = await fetch('https://api.rrevx.com/v1/autocomplete?' + p, { signal: ctrl.signal }).then((x) => x.json());
show(results); // แสดง name + region.name + ใต้ผลค้นหาใส่ "Places © Overture Maps Foundation"
}, 250);
});
function picked(place) { session = crypto.randomUUID(); /* place.lat, place.lng */ }
คำขอที่ใช้ session เดียวกันภายใน 3 นาทีนับเป็น 1 ครั้ง · ฟรี 10,000 ครั้งต่อเดือน เกินแล้ว 0.09 บาท รวม VAT · ใช้คีย์ rx_pub_ ที่ผูกโดเมนในหน้าเว็บได้ ดูรายละเอียดในเอกสาร API