ในบทความนี้จะมาคุยกันเกี่ยวกับ analyzer ใน Elasticsearch กัน แต่ไม่ขอลงลึกมากนะเดี๋ยวจะไม่สนุกกัน ^^ เจ้า analyzer มีหน้าในการวิเคราะห์ (แหนะเล่นกันตรงๆ เลย) ประโยคหรือกลุ่มคำที่ถูกส่งเข้าไปหามันทั้งตอนที่เรา index ข้อมูลและตอนที่เราค้นหาข้อมูล เพื่อแบ่งให้เป็นคำๆ เช่น “This is a Elasticsearch Book” ก็อาจจะกลายเป็น “elasticsearch, book” ซึ่งจะกลายเป็นคำยังไงบ้างนั้นก็ขึ้นอยู่กับ analyzer แต่ละตัว
แล้วทำไมเราต้องเลือก analyzer ให้ดีล่ะ จะเห็นว่าหน้าที่ของ analyzer เอาง่ายๆ คือการตัดคำ ถ้าตัดคำไม่ถูกก็คงจะใช้หาไรไม่ได้ จริงอยู่ถ้าเราใช้ภาษาอังกฤษเลยก็อาจจะไม่ต้องคำนึงถึงมากนัก เพราะค่าเริ่มต้น (default) ของ analyzer คือ standard ที่แบ่งคำด้วยช่องว่างและตัวอักขระพิเศษอยู่แล้วอยู่แล้ว (ภาษาอังกฤษก็มีช่องว่างแบ่งเป็นคำๆ อ่ะนะ ง่ายเลย) พูดแล้วเหมือนจะงง ดูตัวอย่างดีกว่า
Analyzer: Standard จากรูปด้านล่างจะเห็นว่าเราจะได้เป็นคำๆ เหมือนด้านซ้ายมือ
แล้วจะเกิดอะไรขึ้นเมื่อเราใช้ standard analyzer กับภาษาไทย
จากรูปสิ่งที่เกิดขึ้นคือแยกคำไม่ออกเลยจ้า แล้วมันจะส่งผลยังไงล่ะ ก็อย่างที่บอกไว้ตั้งแต่ต้นละครับว่า analyzer จะถูกใช้ทั้งตอน index ข้อมูลและตอนค้นหา พอมันตัดคำได้ไม่ดีผลการค้นหาก็จะไม่ดีตามไปด้วยครับ
เราสร้าง index แล้วก็ระบุ analyzer ไปด้วยเลย จะได้เห็นภาพชัดขึ้นครับ
สร้าง index ชื่อ test-analyzer ก็แล้วกันครับ แล้วก็มี field อยู่ 2 field คือ thai_analyzer_msg ที่เราจะระบบตัว analyzer ให้เป็น thai ครับ อีก field ก็คือ standard_analyzer_msg ก็ให้ analyzer เป็น standard ไป
PUT test-analyzer
{
"mappings": {
"default": {
"properties": {
"thai_analyzer_msg": {
"type": "text",
"analyzer": "thai"
},
"standard_analyzer_msg": {
"type": "text",
"analyzer": "standard"
}
}
}
}
}
หลังจากสร้าง index เสร็จแล้ว ก็ลองเพิ่มข้อมูลเข้าไปดูครับ
POST test-analyzer/default
{
"thai_analyzer_msg": "เรียนรู้การใช้งาน analyzer",
"standard_analyzer_msg": "เรียนรู้การใช้งาน analyzer"
}
แล้วก็ลองค้นหาด้วยฟีลด์ standard_analyzer_msg ที่ analyzer มีค่าเป็น standard ดูก่อน เราจะเห็นว่าถ้าใช้บางคำในการค้นหา เช่น “เรียนรู้” เราจะไม่เจอข้อมูลที่เราพึ่งเพิ่มเข้าไป
แล้วทำยังไงถึงจะเจอล่ะ ลองย้อนไปดูว่าตอนเราใช้ analyze api ด้วย standard analyzer มันจะตัดเป็นคำว่า “เรียนรู้การใช้งาน, analyzer” งั้นลองค้นด้วยคำว่า “เรียนรู้การใช้งาน” เราถึงจะเจอ document ที่เราสร้างไป
ทีนี้เราลองค้นหาด้วยคำว่า “เรียนรู้” กับฟีลด์ thai_analyzer_msg ที่มี analyzer เป็น thai ดูครับ
จะเห็นว่าเราสามารถใช้แค่บางคำก็สามารถค้นหา document ของเราได้แล้วครับ ^^