การค้นหาแบบยืดหยุ่นดัชนีหลายรายการเทียบกับหนึ่งดัชนีและประเภทสำหรับชุดข้อมูลที่แตกต่างกันอย่างไร


161

ฉันมีแอพพลิเคชั่นที่พัฒนาขึ้นโดยใช้รูปแบบ MVC และฉันต้องการทำดัชนีตอนนี้หลาย ๆ โมเดลซึ่งหมายความว่าแต่ละรุ่นมีโครงสร้างข้อมูลที่แตกต่างกัน

  • ควรใช้ดัชนี mutliple ดีกว่าสำหรับแต่ละรุ่นหรือมีประเภทภายในดัชนีเดียวกันสำหรับแต่ละรุ่นหรือไม่ ทั้งสองวิธีจะต้องใช้คำค้นหาอื่นที่ฉันคิด ฉันเพิ่งเริ่มสิ่งนี้

  • มีความแตกต่างระหว่างทั้งสองแนวคิดในด้านประสิทธิภาพหรือไม่หากชุดข้อมูลมีขนาดเล็กหรือใหญ่?

ฉันจะทดสอบคำถามที่ 2 ด้วยตนเองถ้ามีใครแนะนำข้อมูลตัวอย่างที่ดีให้ฉันเพื่อจุดประสงค์นั้น

คำตอบ:


184

มีความหมายที่แตกต่างกันสำหรับทั้งสองวิธี

สมมติว่าคุณกำลังใช้การตั้งค่าเริ่มต้นของ Elasticsearch การมี 1 ดัชนีสำหรับแต่ละรุ่นจะเพิ่มจำนวนเศษของคุณอย่างมีนัยสำคัญเนื่องจาก 1 ดัชนีจะใช้ 5 ชิ้นส่วน 5 รุ่นข้อมูลจะใช้ 25 ชิ้นส่วน ในขณะที่มีวัตถุ 5 ชนิดใน 1 ดัชนีจะยังคงใช้ 5 ชิ้น

ผลกระทบของการมีตัวแบบข้อมูลแต่ละตัวเป็นดัชนี:

  • มีประสิทธิภาพและรวดเร็วในการค้นหาภายในดัชนีเนื่องจากปริมาณข้อมูลควรมีขนาดเล็กลงในแต่ละเศษเนื่องจากมีการกระจายไปยังดัชนีที่แตกต่างกัน
  • การค้นหาชุดข้อมูลจากแบบจำลองดัชนีตั้งแต่ 2 ดัชนีขึ้นไปจะทำให้เกิดโอเวอร์เฮดเนื่องจากแบบสอบถามจะต้องส่งไปยังเศษชิ้นส่วนต่างๆทั่วทั้งดัชนีรวบรวมและส่งกลับไปยังผู้ใช้มากขึ้น
  • ไม่แนะนำหากชุดข้อมูลของคุณมีขนาดเล็กเนื่องจากคุณจะต้องมีพื้นที่เก็บข้อมูลมากขึ้นเมื่อสร้างส่วนเพิ่มเติมแต่ละครั้งและประสิทธิภาพเพิ่มขึ้นเล็กน้อย
  • แนะนำให้ถ้าชุดข้อมูลของคุณมีขนาดใหญ่และแบบสอบถามของคุณใช้เวลาในการประมวลผลนานเนื่องจากเศษชิ้นส่วนเฉพาะจัดเก็บข้อมูลเฉพาะของคุณและจะง่ายกว่าสำหรับ Elasticsearch ในการประมวลผล

ผลกระทบสำหรับการมีโมเดลข้อมูลแต่ละชนิดเป็นชนิดวัตถุภายในดัชนี:

  • ข้อมูลเพิ่มเติมจะถูกจัดเก็บภายใน 5 shard ของดัชนีซึ่งหมายความว่ามีปัญหาค่าใช้จ่ายน้อยลงเมื่อคุณค้นหาข้ามรุ่นข้อมูลที่แตกต่างกัน แต่ขนาดของชิ้นของคุณจะใหญ่ขึ้นอย่างมีนัยสำคัญ
  • ข้อมูลเพิ่มเติมในส่วนต่าง ๆ จะใช้เวลานานกว่าที่ Elasticsearch จะค้นหาผ่านเนื่องจากมีเอกสารจำนวนมากที่จะทำการกรอง
  • ไม่แนะนำถ้าคุณรู้ว่าคุณกำลังผ่านข้อมูล 1 เทราไบต์และคุณไม่ได้กระจายข้อมูลของคุณในดัชนีที่แตกต่างกันหรือหลายชิ้นในการทำแผนที่ Elasticsearch
  • แนะนำสำหรับชุดข้อมูลขนาดเล็กเนื่องจากคุณจะไม่ต้องเสียพื้นที่เก็บข้อมูลเพื่อเพิ่มประสิทธิภาพส่วนเพิ่มเนื่องจากแต่ละส่วนจะใช้พื้นที่ในฮาร์ดแวร์ของคุณ

หากคุณถามว่าข้อมูลอะไรมากเกินไปเทียบกับข้อมูลขนาดเล็ก? โดยทั่วไปแล้วจะขึ้นอยู่กับความเร็วโปรเซสเซอร์และ RAM ของฮาร์ดแวร์จำนวนข้อมูลที่คุณจัดเก็บภายในแต่ละตัวแปรในการแมปสำหรับ Elasticsearch และข้อกำหนดการสืบค้นของคุณ การใช้หลายแง่มุมในข้อความค้นหาของคุณจะทำให้เวลาตอบสนองของคุณช้าลงอย่างมาก ไม่มีคำตอบที่ตรงไปตรงมาสำหรับเรื่องนี้และคุณจะต้องทำการวัดประสิทธิภาพตามความต้องการของคุณ


8
คำตอบนี้ไม่สมบูรณ์หากไม่มีข้อมูลจากelasticsearch.org/guide/en/elasticsearch/guide/current/ …
AndreKR

5
เพื่อเพิ่มคำตอบที่ยอดเยี่ยมฉันขอใบเสนอราคาจากES 5.2 docที่อธิบายว่าทำไมไม่แนะนำให้เก็บเศษไว้จำนวนมาก: " By default elasticsearch rejects search requests that would query more than 1000 shards. The reason is that such large numbers of shards make the job of the coordinating node very CPU and memory intensive. It is usually a better idea to organize data in such a way that there are fewer larger shards. In case you would like to bypass this limit, which is discouraged, you can update the action.search.shard_count.limit cluster setting to a greater value."
การให้อภัย

49

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

ที่ที่เราต้องการไปที่: เราต้องการลบแนวคิดประเภทจาก Elasticsearch ในขณะที่ยังคงสนับสนุนผู้ปกครอง / เด็ก

ดังนั้นสำหรับโครงการใหม่การใช้เพียงชนิดเดียวต่อดัชนีจะทำให้การปรับรุ่นในที่สุดเป็น ElasticSearch 6.x ง่ายขึ้น


13

คำตอบของโจนาธานนั้นเยี่ยมมาก ฉันจะเพิ่มจุดอื่น ๆ เพื่อพิจารณา:

  • สามารถกำหนดจำนวนของเศษต่อโซลูชันที่คุณเลือก คุณอาจมีหนึ่งดัชนีที่มี 15 เศษหลักหรือแบ่งเป็น 3 ดัชนีสำหรับ 5 ชิ้น - มุมมองของประสิทธิภาพจะไม่เปลี่ยนแปลง (สมมติว่ามีการเผยแพร่ข้อมูลอย่างเท่าเทียมกัน)
  • คิดเกี่ยวกับการใช้ข้อมูล กล่าวคือ ถ้าคุณใช้ kibana เพื่อให้เห็นภาพได้ง่ายกว่าที่จะรวม / แยกดัชนีเฉพาะ (es) แต่จะต้องกรองประเภทในแดชบอร์ด
  • การเก็บข้อมูล: สำหรับข้อมูลบันทึกแอปพลิเคชัน / ตัวชี้วัดให้ใช้ดัชนีที่แตกต่างกันหากคุณต้องการระยะเวลาการเก็บรักษาที่แตกต่างกัน

ระยะเวลาเก็บรักษาหมายถึงอะไร คุณหมายถึงเวลาในการถ่ายทอดสดหรือไม่? ที่ตั้งอยู่บนพื้นฐานต่อเอกสาร
Kshitiz Sharma

ไม่ที่นี่ระยะเวลาเก็บรักษาหมายถึงการเก็บรักษาเอกสาร / ดัชนี - ระยะเวลาในการจัดเก็บข้อมูลเหล่านั้น ตามคุณภาพข้อมูลขนาดความสำคัญ - ฉันใช้เพื่อระบุนโยบายการเก็บข้อมูลที่แตกต่างกัน ข้อมูล / ดัชนีบางส่วนจะถูกลบหลังจาก 7 วันส่วนอื่น ๆ หลังจาก 6w และบางส่วนหลังจาก 10 ปี ...
Marcel Matus

2

ทั้งคำตอบข้างต้นนั้นยอดเยี่ยมมาก!

ฉันกำลังเพิ่มตัวอย่างหลายประเภทในดัชนี สมมติว่าคุณกำลังพัฒนาแอพเพื่อค้นหาหนังสือในห้องสมุด มีคำถามสองสามข้อที่จะถามเจ้าของห้องสมุด

คำถาม:

  1. คุณวางแผนที่จะจัดเก็บหนังสือกี่เล่ม

  2. คุณจะเก็บหนังสือประเภทไหนในห้องสมุด?

  3. คุณจะค้นหาหนังสืออย่างไร

คำตอบ:

  1. ฉันวางแผนที่จะเก็บหนังสือ 50 k - เป็น 70 k หนังสือ (โดยประมาณ)

  2. ฉันจะมีหนังสือเกี่ยวกับเทคโนโลยี 15 k -20 k (วิทยาศาสตร์คอมพิวเตอร์วิศวกรรมเครื่องกลวิศวกรรมเคมีและอื่น ๆ ) หนังสือประวัติศาสตร์ 15 พันเล่มหนังสือวิทยาศาสตร์การแพทย์ 10 พันเล่ม หนังสือเกี่ยวกับภาษา 10 k (อังกฤษ, สเปนและอื่น ๆ )

  3. ค้นหาตามชื่อผู้แต่งชื่อผู้แต่งปีที่พิมพ์ชื่อผู้จัดพิมพ์ (สิ่งนี้ทำให้คุณมีความคิดเกี่ยวกับข้อมูลที่คุณควรเก็บไว้ในดัชนี)

จากคำตอบข้างต้นเราสามารถพูดได้ว่าสคีมาในดัชนีของเราควรมีลักษณะเช่นนี้

// นี่ไม่ใช่การแม็พที่แน่นอนเพียงเพื่อเป็นตัวอย่าง

            "yearOfPublish":{
                "type": "integer"
            },
            "author":{
                "type": "object",
                "properties": {
                    "firstName":{
                        "type": "string"
                    },
                    "lastName":{
                        "type": "string"
                    }
                }
            },
            "publisherName":{
                "type": "string"
            }
        }

เพื่อให้บรรลุตามข้างต้นเราสามารถสร้างดัชนีหนึ่งชื่อ Books และสามารถมีหลายประเภท

ดัชนี: หนังสือ

ประเภท: วิทยาศาสตร์ศิลปะ

(หรือคุณสามารถสร้างหลายประเภทเช่นเทคโนโลยีวิทยาศาสตร์การแพทย์ประวัติศาสตร์ภาษาหากคุณมีหนังสือมากขึ้น)

สิ่งสำคัญที่ควรทราบที่นี่คือสคีมาจะคล้ายกัน แต่ข้อมูลไม่เหมือนกัน และที่สำคัญอื่น ๆ คือข้อมูลทั้งหมดที่คุณจัดเก็บ

หวังว่าข้างต้นช่วยเมื่อไปสำหรับประเภทที่แตกต่างกันในดัชนีถ้าคุณมีสคีที่แตกต่างกันคุณควรพิจารณาดัชนีที่แตกต่างกัน ดัชนีขนาดเล็กสำหรับข้อมูลน้อยลง ดัชนีใหญ่สำหรับข้อมูลขนาดใหญ่ :-)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.