Screen Shot 2558-08-23 at 9.25.09 PM
หลังจากที่รู้จักกับ Elasticsearch ตั้งแต่ verison 0.9 มาจนถึง 2.0 นั้น
มีความสามารถต่าง ๆ เปลี่ยนแปลงไปมากมาย
หนึ่งในนั้นคือ Mapping หรือ การกำหนดโครงสร้างของข้อมูล
มาดูว่าควรทำการกำหนด mapping อย่างไร
เพื่อให้ทำงานได้ดียิ่งขึ้น

สามารถใช้ได้ทั้ง version 1.7 และ 2.0

1. กำหนดชนิดของข้อมูลในแต่ละ field ให้ถูกต้อง และ เหมาะสม

โดยปกติ Elasticsearch นั้น
เราไม่จำเป็นต้องกำหนด mapping ของข้อมูล
เนื่องจากจะสร้าง mapping ให้อัตโนมัติจากข้อมูลนั่นเอง (Dynamic mapping)

แต่ถ้าผลการทำงานอาจจะไม่ถูกต้อง และ เหมาะสมกับความต้องการ
ดังนั้นแนะนำให้ทำการสร้าง mapping ขึ้นมาก่อน
หรืออาจจะใช้ index template ก็ได้

ตัวอย่างเช่น

  • ข้อมูลชนิด geo_point สำหรับเก็บข้อมูลตำแหน่ง latitude และ longitude
  • ข้อมูลชนิด date สำหรับข้อมูล timestame

2. ในแต่ละ field ควรกำหนดให้ Elasticsearch ทำการ analyse และ จัดเก็บเท่าที่จำเป็น

โดยปกติ Elasticsearch นั้น
จะทำการ analyse และ จัดเก็บข้อมูลของทุก ๆ field
ซึ่งไม่ค่อยมีผลมากนักสำหรับตอนเริ่มต้นของระบบ

แต่เมื่อข้อมูลเยอะขึ้นเรื่อย ๆ ปัญหาจะตามมาอย่างมาก
ทั้งพื้นที่การจัดเก็บ และ ขนาดของ memory ที่ต้องใช้งาน
ส่งผลต่อเวลาในการประมวลผล

ดังนั้น เพื่อลดการใช้ resource ต่าง ๆ โดยไม่จำเป็น
ต้องทำการพิจารณาว่า field ใดควร analyse และ จัดเก็บบ้าง ?
หรือ field ไหนไม่ถูกใช้งานเลย ?
ซึ่งสามารถกำหนดได้ใน mapping นั่นเอง

ตัวอย่างเช่น
ข้อมูลของหน้า web page ซึ่งเป็น HTML
ซึ่งใช้งานเพียงแสดงผลอย่างเดียว
ไม่เคยทำการค้นหาเลย
ดังนั้น ควรกำหนดให้จัดเก็บอย่างเดียว
แต่ไม่ทำการ analyze

3. ใช้งาน Multi-fields หรือ Raw field เมื่อต้องการทั้ง Analyse และ Aggregation

ตัวอย่างเช่น
ข้อมูลของ Tag ซึ่งสามารถจัดเก็บข้อมูลที่มีพวก white space ได้ เช่น ช่องว่าง และ – เป็นต้น
และข้อมูล Tag ต้องนำมาใช้งาน เพื่อนับว่าแต่ละ Tag มีข้อมูลที่เกี่ยวข้องจำนวนเท่าไร ?
แน่นอนว่า ต้องทำการนับผ่าน Aggregation นั่นเอง

ซึ่งเป็นปัญหา classic ที่ทุก ๆ คนจะต้องเจอ
การแก้ไขที่เหมาะสมที่สุด คือ การใช้ multi-field
โดย field หลัก กำหนดให้ทำการ analyze และ จัดเก็บ
ส่วน raw field จะกำหนดไม่ให้ analyze เพื่อนำมานับจำนวนข้อมูลที่เกี่ยวข้องได้อย่างถูกต้อง

4. ให้ระวังการกำหนดจำนวน Replica และ Shard ของแต่ละ index

เนื่องจากเราไม่สามารถแก้ไขค่าเหล่านี้ได้
หลังจากการ indexed ข้อมูลไปแล้วนะ
ดังนั้น ควรทำการประมาณการว่า ข้อมูลมีอัตราการเติบโตเท่าไร
เพื่อจะได้เตรียมแผนการรับมือไว้ได้

โดยค่าของ Replica นั้น เราจะเพิ่มก็ต่อเมื่อ

  • ต้องการเครื่องมาช่วยรองรับผู้ใช้งานที่มากขึ้น
  • ต้องการเพิ่มเรื่องของ Availability
  • ต้องการ scale up

แนะนำให้เริ่มค่า replica ที่ 1

ส่วนจำนวนของ Shard ขึ้นอยู่กับขนาดของข้อมูล
ซึ่งแต่ละ Shard ไม่ควรเกิน 30 GB

5. ถ้าไม่อยากให้ Elasticsearch cluster ตาย แนะนำให้กำหนดจำนวน field ซะ

จำนวน field มีเท่าที่จำเป็นเท่านั้น อย่าเผื่อ !!
อ่านเพิ่มเติมได้ที่ Mapping Explosion

6. สำหรับ Elasticsearch 1.x ให้ทำการกำหนดค่าของ doc_values=true

เพื่อไม่ให้ Elasticsearch ทำการ analyse ข้อมูลชนิด String
เป็นวิธีการลดจำนวน memory ที่ใช้งานลงไปอย่างมาก

ส่วนใน Elasticsearch 2.0 ไม่ต้องทำอะไร เพราะว่าเป็นค่า default อยู่แล้ว

7. แนะนำให้ทำการ reindex มากกว่าลบและสร้าง mapping ใหม่นะครับ

เนื่องจากการลบและสร้าง mapping ใหม่มันใช้ resource ที่สูงมาก ๆ แต่ง่ายและสะดวก
แต่ในการทำงานจริง ๆ จะไม่ทำการลบข้อมูลจริง ๆ นะ
เพียงทำการกำหนด delete flag = true ไว้เท่านั้นเอง
ดังนั้น คุณจะยังไม่ได้พื้นที่ของ harddisk กลัมบโดยทันทีนะ
ซึ่งจะได้กลับมาเมื่อทำการ merge segment เสร็จเรียบร้อย

ส่วนใน Elasticsearch 2.0 นั้นไม่สามารถลบ mapping ได้แล้วนะ
ต้องลบ และ สร้าง index ใหม่เท่านั้น

ทั้ง 7 ข้อ เป็นคำแนะนำสำหรับการจัดการกับ mapping

เนื่องจากปกติ mapping จะถูกสร้างอย่างอัตโนมัติเมื่อทำการ indexed ข้อมูล
แต่เพื่อให้ Elasticsearch ทำงานได้อย่างมีประสิทธิภาพกว่าเดิม
ควรที่จะต้องทำการปรับแต่ง mapping กันหน่อยนะครับ

น่าจะพอมีประโยชน์บ้าง
สำหรับคนที่ศึกษา และ นำ Elasticsearch ไปใช้งาน