Screen Shot 2558-10-22 at 11.06.50 PM
มีคำถามเกี่ยวกับการจัดการข้อมูลใน Elasticsearch
ว่าด้วยเรื่อง การจัดการอักขระพิเศษ ดังนี้

ถ้าต้องการเก็บข้อมูลจาก Twitter ซึ่งมีข้อมูล hashtag และ mention ดังนี้

Hello #Elasticsearch with @somkiat

คำถาม ถ้าต้องการให้ Elasticsearch เก็บข้อมูล

  • #Elasticsearch
  • @somkiat

จะทำอย่างไรดีล่ะ ?

การทำงานปกติ หรือ default ของ Elasticsearch

ถ้าไม่ทำการ configuration พวกตัวตัดคำ และ filter ต่าง ๆ เลย
จากข้อมูลข้างต้นจะถูกตัดคำ และ จัดเก็บดังนี้

  • hello
  • elasticsearch
  • with
  • somkiat

จะเห็นได้ว่า จะทำการลบพวกอักขระพิเศษออกไปทั้ง # และ @
เนื่องจากโดย default แล้วนั้น การตัดคำจะใช้ standard analyzer
สามารถตรวจสอบได้ดังนี้

แน่นอนว่าผลการทำงาน มันไม่ถูกใจ!!

คำถาม ถ้าต้องการเก็บข้อมูล #elasticsearch และ @somkiat จะทำอย่างไรดี ?

วิธีการที่คนส่วนใหญ่ทำก็คือ
การแทนที @ และ # ด้วยคำอื่น ๆ
และสามารถทำงานได้ดีด้วยนะ
แต่ไม่น่าจะเป็นวิธีการที่ดี และ เหมาะสมเท่าไรนัก !!

เนื่องจาก Elasticsearch ได้เตรียมวิธีการที่ดีกว่า ไว้ให้แล้ว
นั่นคือ Word delimiter นั่นเอง
โดยเราสามารถทำการ custom ตัว word delimiter filter
หรือทำการจัดการกับตัวแบ่งคำในส่วนของการ filter ได้เลย

จากข้อมูลตัวอย่างนั้น
เราสามารถกำหนดให้ # และ @ เป็นตัวอักษรธรรมดา หรือ Alphabet ได้เลย
เพื่อไม่ให้ถูกลบออกไป เนื่องจากมันเป็นอักขระพิเศษนั่นเอง

สามารถทำได้ด้วยการกำหนดค่าใน index ดังนี้
ในส่วนของ analysis นั้นต้องทำการ custom filter และ analyser ใหม่
ดังนี้

สิ่งที่น่าสนใจคือ ส่วนของ filter
ซึ่งใช้ word_delimiter รวมทั้งสามารถกำหนดอักขระพิเศษที่เราต้องการให้จัดเก็บ
ไว้ในส่วนของ type_table นั่นเอง

เมื่อทุกอย่างเรียบร้อย ก็ถึงเวลาทดสอบ analyze ข้อมูลก่อนสิ

ว่าทำงานตามที่เราต้องการหรือไม่ ?
ดังนี้

เพียงเท่านั้น ก็สามารถจัดเก็บข้อมูลอักขระพิเศษใน Elasticsearch ได้แล้ว
แน่นอนว่า มันสามารถค้นหาได้ด้วยนั้นเอง