การค้นหา
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 | ค่าเริ่มต้น | รายละเอียด |
|---|---|---|---|
limit | number | 10 | จำนวนผลลัพธ์สูงสุดของการค้นด้วยข้อความ |
threshold | number | 0.4 | คะแนนขั้นต่ำ (0–1) ของการค้นด้วยข้อความ |
zipLimit | number | ดูด้านล่าง | จำนวนผลลัพธ์สูงสุดเมื่อ query เป็นตัวเลขล้วน |
romanizationAliases | boolean | true | แปลงคำสะกดภาษาอังกฤษที่ไม่ใช่ 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' ข้อความภาษาไทยจะคืนค่าเดิม |