มีคำถามที่น่าสนใจจากกลุ่ม Thai Elastic User Group ว่า
ค้นหาข้อมูลภาษาไทยที่จัดเก็บใน Elasticsearch แล้ว
ผลของการค้นหาไม่ถูกต้องตามที่คาดหวัง
โดยที่ข้อมูลที่จัดเก็บประกอบไปด้วย ภาษาไทยและตัวเลข
ยกตัวอย่างเช่น กส1234

การค้นหาใช้งานผ่าน Match query

แล้วได้ผลไม่เป็นไปตามที่ต้องการ
นั่นคือ ค้นหาค่าอะไร ต้องคือ document นั้น ๆ เลยสิ
แสดงดังตัวอย่าง

คำถามคือ ปัญหานี้เกิดจากอะไร แก้ไขปัญหาได้อย่างไรได้บ้าง ?

เพื่อให้ค้นหาข้อมูลได้ตามที่ต้องการ

วิธีการแรก ทำความเข้าใจกับ Match query ก่อน

โดยที่ Match query นั้นมันมีขั้นตอนการทำงานดังนี้

  1. ทำการ analyze ข้อมูลก่อน เพื่อให้ได้คำหรือ term เพื่อนำไปค้นหา
  2. ทำการค้นหาจาก term ต่าง ๆ ที่ได้จากข้อ 1 
  3. นำผลการค้นหาแต่ละ term มารวมกัน โดยค่า default คือการ union
  4. ส่งผลการค้นหากลับออกมา

โดยที่การ Analyze นั้น ค่า default จะเรียกว่า default analyzer 
ซึ่งเราทำการทดสอบได้ดังนี้

จะเห็นได้ว่าจะมี 2 คำ หรือ 2 term นั่นเป็นที่มาของผลการค้นหาที่ออกมา !!
ถ้าเราเข้าใจว่า Elasticsearch ทำงานอย่างไร

จากปัญหาดังกว่า ถ้าเราไม่แก้ไขอะไรเลย

สิ่งที่ต้องทำคือ การปรับเปลี่ยน Query นั่นเอง
โดยถ้ายังใช้งาน Match query แล้ว
สามารถเปลี่ยนการรวมผลการค้นหาจากแต่ละ term
จาก union เป็น intersection (OR -> AND) ดังนี้

หรือถ้าผมไม่อยากใช้ Analyzer ละ ได้ไหม ?

เนื่องจากการ analyze ไม่เป็นไปตามที่ต้องการ
แน่นอนว่า ทำได้ด้วยการกำหนด mapping ของ document ให้ไม่ทำการ analyze
จากนั้นทำการเพิ่มข้อมูล และค้นหาด้วย Match query ปกติ 
ใช้ค้นหาได้ข้อมูลตามปกติ

ลองทำความเข้าใจดูครับ