มีคำถามเกี่ยวกับการจัดการข้อมูลใน 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 ได้แล้ว
แน่นอนว่า มันสามารถค้นหาได้ด้วยนั้นเอง