ข้ามไปยังเนื้อหา

การค้นหา

ลองพิมพ์ในช่องด้านล่าง — ค้นหาด้วยชื่อตำบล อำเภอ จังหวัด (ไทยหรืออังกฤษ) หรือรหัสไปรษณีย์ก็ได้:

กำลังโหลดข้อมูลที่อยู่…

searchThaiAddress(index, query, options?) คืนค่า ThaiAddressRecord[] โดยตรง ไม่ต้องแปลงข้อมูลเพิ่มก่อนใช้:

searchThaiAddress(index, query, {
limit: 10, // text queries only
threshold: 0.4, // match quality 0–1
zipLimit: Infinity, // all-digit queries — unlimited by default
romanizationAliases: true, // expand non-RTGS spellings
})
  • limit จำกัดจำนวนผลลัพธ์เฉพาะการค้นหาด้วยข้อความ ไม่มีผลกับการค้นหาด้วยรหัสไปรษณีย์
  • threshold คือคะแนนขั้นต่ำ (0–1) ที่ผลลัพธ์ต้องได้ถึงจะถูกนับว่า match
  • zipLimit ควบคุมจำนวนผลลัพธ์เมื่อ query เป็นตัวเลขล้วน ค่าเริ่มต้นไม่จำกัดโดยตั้งใจ — ดูเหตุผลในหัวข้อถัดไป
  • romanizationAliases เปิดการแปลงคำสะกดภาษาอังกฤษที่ไม่ใช่ RTGS ให้ตรงกับข้อมูลในระบบโดยอัตโนมัติ

ผลลัพธ์เรียงตามคะแนน trigram ก่อน จากนั้นดูว่า query ตรงกับชื่อของตัวตำบลเองแค่ไหน (ตรงเป๊ะ → ขึ้นต้นด้วย → มีคำอยู่ในชื่อ) แล้วจึงเรียงตามตัวอักษรไทยเป็นลำดับสุดท้าย

กติกาข้อสองนี้เองที่ทำให้ตำบลลาดพร้าวขึ้นอยู่เหนือกว่าตำบลอื่น ๆ ที่แค่ตั้งอยู่ในเขตลาดพร้าว — ถ้าไม่มีเกณฑ์นี้ ทั้งสองกลุ่มจะได้คะแนน trigram เท่ากันและอันดับจะสับสน

การพิมพ์ชื่อกับรหัสไปรษณีย์รวมกันในช่องเดียว เช่น "ลาดพร้าว 10900" ยังไม่รองรับ ต้องค้นหาด้วยชื่อกับรหัสไปรษณีย์แยกกันคนละครั้ง

เบื้องหลังการค้นหา

หัวข้อ “เบื้องหลังการค้นหา”

ก่อนค้นหา ระบบจะ normalize ข้อความ query ก่อนเสมอ: ตัดคำนำหน้าที่อยู่ไทยออก ทั้งรูปแบบเต็ม (จังหวัด/อำเภอ/ตำบล/แขวง/เขต) และแบบย่อ (จ. อ. ต. ข.) แล้วตัดวรรณยุกต์ไทยออกด้วย ข้อมูลในดัชนีก็ผ่านการ normalize แบบเดียวกันตอนสร้าง index

จากนั้นเป็นการจับคู่แบบ trigram —ตัดข้อความ query เป็นชุดตัวอักษรกลุ่มละ 3 ตัว นับว่า trigram ไหนตรงกับ record ไหนบ้าง แล้วคิดคะแนนเป็น hits / queryTrigrams ผลลัพธ์ที่คะแนนไม่ถึง threshold จะถูกกรองทิ้งไปก่อนจัดอันดับ