มีคำถามที่น่าสนใจจากกลุ่ม Thai Elastic User Group ว่า
ค้นหาข้อมูลภาษาไทยที่จัดเก็บใน Elasticsearch แล้ว
ผลของการค้นหาไม่ถูกต้องตามที่คาดหวัง
โดยที่ข้อมูลที่จัดเก็บประกอบไปด้วย ภาษาไทยและตัวเลข
ยกตัวอย่างเช่น กส1234
การค้นหาใช้งานผ่าน Match query
แล้วได้ผลไม่เป็นไปตามที่ต้องการ
นั่นคือ ค้นหาค่าอะไร ต้องคือ document นั้น ๆ เลยสิ
แสดงดังตัวอย่าง
คำถามคือ ปัญหานี้เกิดจากอะไร แก้ไขปัญหาได้อย่างไรได้บ้าง ?
เพื่อให้ค้นหาข้อมูลได้ตามที่ต้องการ
วิธีการแรก ทำความเข้าใจกับ Match query ก่อน
โดยที่ Match query นั้นมันมีขั้นตอนการทำงานดังนี้
- ทำการ analyze ข้อมูลก่อน เพื่อให้ได้คำหรือ term เพื่อนำไปค้นหา
- ทำการค้นหาจาก term ต่าง ๆ ที่ได้จากข้อ 1
- นำผลการค้นหาแต่ละ term มารวมกัน โดยค่า default คือการ union
- ส่งผลการค้นหากลับออกมา
โดยที่การ Analyze นั้น ค่า default จะเรียกว่า default analyzer
ซึ่งเราทำการทดสอบได้ดังนี้
จะเห็นได้ว่าจะมี 2 คำ หรือ 2 term นั่นเป็นที่มาของผลการค้นหาที่ออกมา !!
ถ้าเราเข้าใจว่า Elasticsearch ทำงานอย่างไร
จากปัญหาดังกว่า ถ้าเราไม่แก้ไขอะไรเลย
สิ่งที่ต้องทำคือ การปรับเปลี่ยน Query นั่นเอง
โดยถ้ายังใช้งาน Match query แล้ว
สามารถเปลี่ยนการรวมผลการค้นหาจากแต่ละ term
จาก union เป็น intersection (OR -> AND) ดังนี้
หรือถ้าผมไม่อยากใช้ Analyzer ละ ได้ไหม ?
เนื่องจากการ analyze ไม่เป็นไปตามที่ต้องการ
แน่นอนว่า ทำได้ด้วยการกำหนด mapping ของ document ให้ไม่ทำการ analyze
จากนั้นทำการเพิ่มข้อมูล และค้นหาด้วย Match query ปกติ
ใช้ค้นหาได้ข้อมูลตามปกติ
ลองทำความเข้าใจดูครับ