thaizip

การค้นหา

searchThaiAddress และ lookupByZipCode ตัวเลือก การจัดอันดับ รหัสไปรษณีย์ และการค้นด้วยภาษาอังกฤษ

searchThaiAddress

function searchThaiAddress(index: TrigramIndex, query: string, options?: SearchOptions): ThaiAddressRecord[]

ค้นหาด้วยชื่อตำบล อำเภอ หรือจังหวัด ทั้งภาษาไทยและอังกฤษ หรือด้วยรหัสไปรษณีย์ ถ้าไม่พบจะคืน [] และไม่ throw

searchThaiAddress(index, 'ลาดพร้าว', { limit: 5 })
searchThaiAddress(index, 'bang rak')
searchThaiAddress(index, '10500') // ตัวเลขล้วน: ค้นด้วยรหัสไปรษณีย์
ตัวเลือกTypeค่าเริ่มต้นรายละเอียด
limitnumber10จำนวนผลลัพธ์สูงสุดของการค้นด้วยข้อความ
thresholdnumber0.4คะแนนขั้นต่ำ (0–1) ของการค้นด้วยข้อความ
zipLimitnumberดูด้านล่างจำนวนผลลัพธ์สูงสุดเมื่อ query เป็นตัวเลขล้วน
romanizationAliasesbooleantrueแปลงคำสะกดภาษาอังกฤษที่ไม่ใช่ RTGS ก่อนค้นหา

ผลลัพธ์แต่ละรายการเป็น ThaiAddressRecord หนึ่งรายการต่อหนึ่งตำบล:

type ThaiAddressRecord = {
  provinceId: number
  provinceNameTh: string
  provinceNameEn: string
  amphureId: number
  amphureNameTh: string
  amphureNameEn: string
  tambonId: number
  tambonNameTh: string
  tambonNameEn: string
  zipCode: string
}

แปลง record เป็น label สำหรับ dropdown หรือเป็นที่อยู่สำหรับบันทึกได้ด้วยฟังก์ชันในจัดรูปแบบและแปลงที่อยู่

หลักการจับคู่

query จะถูก normalize ก่อน: ตัดคำนำหน้าที่อยู่ (จังหวัด, อำเภอ, ตำบล, แขวง, เขต และ จ. อ. ต. ข.) และวรรณยุกต์ออก จากนั้นจับคู่แบบ trigram (ชิ้นตัวอักษรละ 3 ตัวที่ซ้อนกัน) จึงยังเจอแม้พิมพ์ผิดหรือพิมพ์ไม่ครบ

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

query ที่สั้นกว่า 3 ตัวอักษรจะได้ [] และยังไม่รองรับชื่อกับรหัสไปรษณีย์ใน query เดียว (ลาดพร้าว 10900) ให้ค้นแยกกัน

ค้นด้วยภาษาอังกฤษ

ชื่อภาษาอังกฤษในชุดข้อมูลสะกดแบบ RTGS ดังนั้น bang rak หรือ chatuchak เจอได้ทันที นอกจากนี้มี alias ที่คัดไว้ 87 คำสำหรับคำสะกดที่คนนิยมแต่ไม่ใช่ RTGS เช่น lardprao → lat phrao และ krungthep → bangkok เป็นพจนานุกรม ไม่ใช่ตัวแปลงอักษรอัตโนมัติ คำสะกดที่ไม่อยู่ในรายการจะไม่เจอ ปิดได้ด้วย romanizationAliases: false

รหัสไปรษณีย์

query ที่เป็นตัวเลขล้วนตั้งแต่ 2 หลักขึ้นไปจะค้นด้วยรหัสไปรษณีย์ รหัสที่ตรงทั้งหมดขึ้นก่อน ตามด้วยรหัสที่ขึ้นต้นตรงกัน เรียงจากน้อยไปมาก

รหัสไปรษณีย์เดียวอาจครอบคลุมหลายตำบล (45000 มี 33 ตำบล) รหัสครบ 5 หลักจึงไม่ถูกจำกัดจำนวนตามค่าเริ่มต้น ส่วน prefix 2–4 หลักจะจำกัดที่ limit เพราะ 30 อย่างเดียวตรงกับราว 290 ตำบล ส่ง zipLimit เพื่อกำหนดเอง หรือ Infinity เพื่อเอาทั้งหมด

lookupByZipCode

function lookupByZipCode(index: TrigramIndex, zip: string, options?: SearchOptions): ThaiAddressRecord[]

ค้นด้วยรหัสไปรษณีย์อย่างเดียว ใช้เฉพาะ zipLimit ซึ่งค่าเริ่มต้นคือไม่จำกัด รวมถึงกรณี prefix ด้วย

lookupByZipCode(index, '45000') // ทั้ง 33 ตำบล
lookupByZipCode(index, '450', { zipLimit: 10 })

ฟังก์ชันช่วย

ทั้งสองฟังก์ชันทำงานอยู่ใน searchThaiAddress และ export ให้เรียกใช้แยกได้

ฟังก์ชันรายละเอียด
normalizeThaiAddressText(input)ตัดคำนำหน้าที่อยู่และวรรณยุกต์ แล้วแปลงเป็นตัวพิมพ์เล็ก แบบเดียวกับตอนค้นหา
applyRomanizationAliases(normalized)แปลงคำสะกดที่ไม่ใช่ RTGS ที่รู้จักเป็นคำสะกดในชุดข้อมูล เช่น 'lardprao' → 'lat phrao' ข้อความภาษาไทยจะคืนค่าเดิม