เทคนิคการจัดทำดัชนีข้อมูลที่มีประสิทธิภาพที่สุดคืออะไร


10

อย่างที่เราทราบกันดีว่ามีเทคนิคการจัดทำดัชนีข้อมูลบางอย่างใช้โดยแอพทำดัชนีที่รู้จักกันดีเช่น Lucene (สำหรับ java) หรือ Lucene.NET (สำหรับ. NET), MurMurHash, B + Tree เป็นต้นสำหรับ No-Sql / Object Oriented Database (ซึ่งฉันพยายามเขียน / เล่นกับ C #) ซึ่งเป็นเทคนิคที่คุณแนะนำ?

ฉันอ่านเกี่ยวกับ MurMurhash-2 และความคิดเห็น v3 พิเศษบอกว่า Murmur นั้นเร็วมาก Lucene.Net ก็มีความเห็นที่ดีเช่นกัน แต่สิ่งที่เกี่ยวกับรอยเท้าหน่วยความจำโดยทั่วไป? มีวิธีแก้ปัญหาที่มีประสิทธิภาพซึ่งใช้การปล่อยน้อยกว่า (และแน่นอนถ้าเป็นที่ต้องการได้เร็วกว่า) กว่า Lucene หรือ Murmur? หรือฉันควรเขียนโครงสร้างดัชนีพิเศษเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด?

ถ้าฉันพยายามเขียนของตัวเองมีสเกลที่ยอมรับสำหรับการจัดทำดัชนีที่ดีหรือไม่เช่น 1% ของ data-node หรือ 5% ของ data-node คำแนะนำใด ๆ ที่เป็นประโยชน์จะได้รับการชื่นชม

คำตอบ:


10

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

BTree (ดูหน้า Wikipediaสำหรับรายละเอียดเพิ่มเติม) เป็นโครงสร้างข้อมูลแบบต้นไม้ซึ่งเหมาะสำหรับการทำงานกับกลุ่มข้อมูลขนาดใหญ่และมักจะใช้สำหรับจัดเก็บโครงสร้างแบบต้นไม้ที่สั่งเหมือนดิสก์ สำหรับต้นไม้อื่นในหน่วยความจำจะทำงานได้ดีกว่า

Murmur hash (ดูหน้า Wikipediaสำหรับรายละเอียดเพิ่มเติม) เป็นฟังก์ชันแฮชที่ใช้ในตารางแฮช การนำไปใช้งานของตารางแฮชไม่สำคัญอาจเป็นการนำไปปฏิบัติแบบมาตรฐานหรือแบบแผนการแฮชเปิดขั้นสูงขึ้น แนวคิดก็คือตารางแฮชอนุญาตให้ผู้ใช้รับกุญแจได้อย่างรวดเร็วจากชุดแป้นที่ไม่ได้เรียงลำดับและสามารถตอบสนองต่องานเช่น: ส่วนสำคัญของชุดกุญแจนี้หรือไม่ ค่าใดเกี่ยวข้องกับคีย์นี้

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

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

คุณต้องการเพียงรับค่าคีย์หรือคุณต้องการค้นหาองค์ประกอบทั้งหมดในช่วงหรือไม่ คุณต้องการคำสั่งซื้อหรือไม่? ถ้าคุณทำมากกว่าต้นไม้สามารถช่วยได้ หากคุณไม่ใช้งานมากกว่าตารางแฮชซึ่งเร็วกว่าสามารถใช้แทนได้

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


ขอบคุณมาก Rapaio :) จุดที่คุณให้ฉันมีประโยชน์มากและได้รับบางสิ่งบางอย่างที่ชัดเจนขึ้น .. เนื่องจากฉันเป็นนักพัฒนา. NET และเป็นคนที่อยากรู้อยากเห็นใน C ธรรมดา (ฉันเริ่มที่จะเรียนรู้) และใหม่รวดเร็วเชื่อถือได้ แน่นอนสามารถควบคุมได้อย่างสมบูรณ์ - ในระยะสั้น: ตื่นเต้นมาก - เทคนิค .. ดังนั้นฉันจำเป็นต้องเรียนรู้อย่างมาก .. เพื่อเรียนรู้ฉันพยายามอ่านเอกสารมากมาย แต่เนื่องจากคุณสามารถเดาได้ว่าฉันเป็นผู้เริ่มต้น ... ฉันไม่ทราบว่า BTree มีข้อดีบนดิสก์ (ในโลก. Net นักเขียนหลายคนอธิบายว่า: โครงสร้างข้อมูลแบบลำดับชั้นเช่น Linked-List .. ไม่มาก!) ขอบคุณมากอีกครั้ง
sihirbazzz

และถ้าคุณอนุญาตให้ฉันจนกว่าจะมีคำอธิบาย / คำตอบที่มีคุณภาพสูงกว่าของคุณฉันต้องการที่จะยอมรับว่านี่เป็นคำตอบ .. และ BTW, Lucene.NET คือการนำ. NET มาใช้ของ Lucene ของ Java
sihirbazzz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.