Elasticsearch เลือก analyzer ผิดชีวิตเปลี่ยนนะจ๊ะ

ในบทความนี้จะมาคุยกันเกี่ยวกับ analyzer ใน Elasticsearch กัน แต่ไม่ขอลงลึกมากนะเดี๋ยวจะไม่สนุกกัน ^^ เจ้า analyzer มีหน้าในการวิเคราะห์ (แหนะเล่นกันตรงๆ เลย) ประโยคหรือกลุ่มคำที่ถูกส่งเข้าไปหามันทั้งตอนที่เรา index ข้อมูลและตอนที่เราค้นหาข้อมูล เพื่อแบ่งให้เป็นคำๆ เช่น “This is a Elasticsearch Book” ก็อาจจะกลายเป็น “elasticsearch, book” ซึ่งจะกลายเป็นคำยังไงบ้างนั้นก็ขึ้นอยู่กับ analyzer แต่ละตัว

แล้วทำไมเราต้องเลือก analyzer ให้ดีล่ะ จะเห็นว่าหน้าที่ของ analyzer เอาง่ายๆ คือการตัดคำ ถ้าตัดคำไม่ถูกก็คงจะใช้หาไรไม่ได้ จริงอยู่ถ้าเราใช้ภาษาอังกฤษเลยก็อาจจะไม่ต้องคำนึงถึงมากนัก เพราะค่าเริ่มต้น (default) ของ analyzer คือ standard ที่แบ่งคำด้วยช่องว่างและตัวอักขระพิเศษอยู่แล้วอยู่แล้ว (ภาษาอังกฤษก็มีช่องว่างแบ่งเป็นคำๆ อ่ะนะ ง่ายเลย) พูดแล้วเหมือนจะงง ดูตัวอย่างดีกว่า

Analyzer: Standard จากรูปด้านล่างจะเห็นว่าเราจะได้เป็นคำๆ เหมือนด้านซ้ายมือ

ใช้ Standard Analyzer กับภาษาอังกฤษ

แล้วจะเกิดอะไรขึ้นเมื่อเราใช้ standard analyzer กับภาษาไทย

ใช้ 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 ดูก่อน เราจะเห็นว่าถ้าใช้บางคำในการค้นหา เช่น “เรียนรู้” เราจะไม่เจอข้อมูลที่เราพึ่งเพิ่มเข้าไป

ค้นหาด้วยคำบางคำกับฟีลด์ที่มี analyzer เป็นค่า standard

แล้วทำยังไงถึงจะเจอล่ะ ลองย้อนไปดูว่าตอนเราใช้ analyze api ด้วย standard analyzer มันจะตัดเป็นคำว่า “เรียนรู้การใช้งาน, analyzer” งั้นลองค้นด้วยคำว่า “เรียนรู้การใช้งาน” เราถึงจะเจอ document ที่เราสร้างไป

ค้นหาด้วยคำที่ถูก analyze ด้วย standard analyzer

ทีนี้เราลองค้นหาด้วยคำว่า “เรียนรู้” กับฟีลด์ thai_analyzer_msg ที่มี analyzer เป็น thai ดูครับ

ค้นหาด้วยคำที่ถูก analyze ด้วย thai analyzer

จะเห็นว่าเราสามารถใช้แค่บางคำก็สามารถค้นหา document ของเราได้แล้วครับ ^^