เอกสารดัชนีลูซีนอย่างไร?


99

ฉันอ่านเอกสารเกี่ยวกับ Lucene; ฉันอ่านเอกสารในลิงค์นี้ด้วย ( http://lucene.sourceforge.net/talks/pisa )

ฉันไม่เข้าใจจริงๆว่า Lucene ทำดัชนีเอกสารอย่างไรและไม่เข้าใจว่า Lucene ใช้อัลกอริทึมใดในการจัดทำดัชนี

ในลิงค์ด้านบนกล่าวว่า Lucene ใช้อัลกอริทึมนี้ในการจัดทำดัชนี:

  • อัลกอริทึมที่เพิ่มขึ้น:
    • รักษาสแต็กของดัชนีเซ็กเมนต์
    • สร้างดัชนีสำหรับเอกสารขาเข้าแต่ละฉบับ
    • ดันดัชนีใหม่ไปยังสแต็ก
    • ให้ b = 10 เป็นปัจจัยผสาน M = 8

for (size = 1; size < M; size *= b) {
    if (there are b indexes with size docs on top of the stack) {
        pop them off the stack;
        merge them into a single index;
        push the merged index onto the stack;
    } else {
        break;
    }
}

อัลกอริทึมนี้จัดทำดัชนีที่เหมาะสมอย่างไร

Lucene ใช้อัลกอริทึม B-tree หรืออัลกอริทึมอื่น ๆ เช่นนั้นในการจัดทำดัชนีหรือไม่หรือมีอัลกอริทึมเฉพาะ?


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

1
อัปเดตคำตอบของฉันอีกครั้งเนื่องจากคำตอบปัจจุบัน (รวมถึงของฉันด้วย!) ไม่น่าพอใจจริงๆที่จะตอบคำถามสองข้อหลักของ OP (Lucene จัดทำดัชนีที่เหมาะสมและอัลกอริทึมใดโดยเฉพาะ - Skip-List ไม่ใช่ B-Tree BTW) หวังว่าการอัปเดตสุดท้ายของฉันจะตอบคำถามที่แท้จริงได้อย่างถูกต้องแล้ว!
fnl

คำตอบ:


50

โดยสรุป Lucene สร้างดัชนีกลับด้านโดยใช้Skip-Lists บนดิสก์จากนั้นโหลดการแมปสำหรับเงื่อนไขที่จัดทำดัชนีไว้ในหน่วยความจำโดยใช้Finite State Transducer (FST) อย่างไรก็ตามโปรดทราบว่า Lucene ไม่ (จำเป็น) โหลดเงื่อนไขที่จัดทำดัชนีทั้งหมดไปยัง RAMตามที่ Michael McCandless อธิบายโดยผู้เขียนระบบการจัดทำดัชนีของ Lucene เอง โปรดทราบว่าด้วยการใช้ Skip-Lists ดัชนีสามารถข้ามจาก Hit หนึ่งไปยังอีก Hit ได้ทำให้สิ่งต่างๆเช่นsetและโดยเฉพาะอย่างยิ่งการสืบค้นช่วงเป็นไปได้ (เช่นเดียวกับ B-Trees) และรายการ Wikipedia เกี่ยวกับการทำดัชนี Skip-Listsยังอธิบายว่าเหตุใดการนำ Skip-List ของ Lucene จึงเรียกว่าหลายระดับSkip-List - โดยพื้นฐานแล้วเพื่อให้การO(log n)ค้นหาเป็นไปได้ (อีกครั้งเหมือน B-Trees)

ดังนั้นเมื่อดัชนีกลับด้าน (คำ) ซึ่งเป็นไปตามโครงสร้างข้อมูลแบบข้ามรายการ - ถูกสร้างขึ้นจากเอกสารดัชนีจะถูกเก็บไว้ในดิสก์ Lucene แล้วโหลด (เป็นแล้วกล่าวว่าอาจจะเป็นเพียงบางส่วนของ) คำเหล่านั้นเป็นไฟไนต์รัฐ Transducerในการดำเนินการ FST หลวมแรงบันดาลใจโดยMorfologick

Michael McCandless (เช่นกัน) ทำงานได้ค่อนข้างดีและค่อนข้างสั้นในการอธิบายว่าทำไม Lucene จึงใช้ FST (acyclic น้อยที่สุด)เพื่อจัดทำดัชนีเงื่อนไขที่ Lucene เก็บไว้ในหน่วยความจำโดยพื้นฐานแล้วเป็น a SortedMap<ByteSequence,SomeOutput>และให้แนวคิดพื้นฐานสำหรับการทำงานของ FST (เช่น วิธีการที่ FST กระชับลำดับไบต์ [เช่นเงื่อนไขที่จัดทำดัชนี] เพื่อให้การใช้หน่วยความจำของการแม็ปนี้เติบโตเป็นเส้นตรงย่อย) และเขาชี้ไปที่กระดาษที่อธิบายถึงอัลกอริทึม FST ที่ Lucene ใช้ด้วย

สำหรับผู้ที่อยากรู้อยากเห็นว่าทำไม Lucene ใช้ข้ามรายการในขณะที่ส่วนใหญ่ใช้ฐานข้อมูล (B +) - และ / หรือ (ข) -Trees ใช้เวลาดูที่ขวาคำตอบ SOเกี่ยวกับคำถามนี้ (Skip รายการเทียบกับ B-ต้นไม้) คำตอบที่ให้ความดีงามคำอธิบายลึก - หลักไม่มากทำให้การปรับปรุงพร้อมกันของดัชนี "ง่ายกว่า" (เพราะคุณสามารถตัดสินใจที่จะไม่ RE-balance B-ต้นไม้ทันทีดังนั้นการเกี่ยวกับประสิทธิภาพการทำงานพร้อมกันเช่นเดียวกับ Skip-List) แต่การข้ามรายการช่วยให้คุณไม่ต้องทำงานในการปรับสมดุล (ล่าช้าหรือไม่) (ในที่สุด) จำเป็นสำหรับ B-Trees (ในความเป็นจริงตามที่คำตอบแสดง / การอ้างอิงอาจมีความแตกต่างด้านประสิทธิภาพน้อยมากระหว่าง B-Trees และ [หลายระดับ] Skip-Lists หากทั้งสองอย่าง "ทำถูกต้อง")


1
Afaik ใช้ Skip List แทน B-tree เพื่อลดจำนวนการค้นหาดิสก์เนื่องจากส่วนหนึ่งของ Skip List อยู่ในหน่วยความจำและดิสก์ IO น้อยมากที่ต้องใช้ในการข้ามดัชนี
Anton

56

มีบทความที่ค่อนข้างดีที่นี่: https://web.archive.org/web/20130904073403/http://www.ibm.com/developerworks/library/wa-lucene/

แก้ไข 12/2014: อัปเดตเป็นเวอร์ชันที่เก็บถาวรเนื่องจากต้นฉบับถูกลบอาจเป็นทางเลือกใหม่ล่าสุดที่ดีที่สุดคือhttp://lucene.apache.org/core/3_6_2/fileformats.html

มีเวอร์ชันล่าสุดที่http://lucene.apache.org/core/4_10_2/core/org/apache/lucene/codecs/lucene410/package-summary.html#package_descriptionแต่ดูเหมือนว่าจะมีข้อมูลน้อยกว่า มากกว่ารุ่นเก่า

โดยสรุปเมื่อ lucene ทำดัชนีเอกสารเอกสารจะแบ่งออกเป็นหลาย ๆ คำ จากนั้นจะเก็บคำศัพท์ไว้ในไฟล์ดัชนีที่แต่ละคำเชื่อมโยงกับเอกสารที่มีอยู่ คุณอาจคิดว่ามันเหมือนกับแฮชแท็ก

คำศัพท์ถูกสร้างขึ้นโดยใช้เครื่องวิเคราะห์ซึ่งทำให้แต่ละคำมีรูปแบบราก อัลกอริทึม Stemming ที่ได้รับความนิยมมากที่สุดสำหรับภาษาอังกฤษคือ Porter stemming algorithm: http://tartarus.org/~martin/PorterStemmer/

เมื่อออกแบบสอบถามจะถูกประมวลผลผ่านตัววิเคราะห์เดียวกับที่ใช้ในการสร้างดัชนีจากนั้นใช้เพื่อค้นหาคำที่ตรงกันในดัชนี ซึ่งแสดงรายการเอกสารที่ตรงกับแบบสอบถาม


ขอบคุณสำหรับคำตอบและลิงค์ แต่ฉันได้ยินมาว่าโครงการ Lucene มีต้นกำเนิดพิเศษชื่อ "Snowball"? คุณได้ยินอะไรเกี่ยวกับเรื่องนี้หรือไม่?
Mahdi Amrollahi

นี่เป็นคำถามที่แตกต่างกัน: ดูlucidimagination.com/search/…นอกเหนือจากนั้นเมื่อเห็นรูปแบบคำถามของคุณฉันขอแนะนำให้คุณอ่านหนังสือ 'Lucene in Action': manning.com/hatcher2 (ฉบับพิมพ์ครั้งแรกค่อนข้างล้าสมัย แต่สามารถเป็นได้ พบในเวอร์ชันต้นไม้ที่ตายแล้วฉบับที่สองสามารถซื้อเป็น e-book ได้)
Yuval F

5
ขอให้คุณแก้ไขคำตอบไม่พบลิงค์แรกซึ่งเป็นลิงค์ของ IBM :)
Adelin

นอกจากนี้ช่องต่างๆจะใส่ภาพรวมได้อย่างไร? หากแบบสอบถามอยู่ในเขตข้อมูลเฉพาะลูซีนจะรู้ได้อย่างไรว่าคำที่ชี้ไปยังเอกสารไม่ได้อยู่ที่ใดในเอกสาร แต่อยู่ในเขตข้อมูลที่ร้องขอ
Levon Tamrazov

24

ดูเหมือนคำถามของคุณเกี่ยวกับการรวมดัชนีมากกว่าการสร้างดัชนี

กระบวนการจัดทำดัชนีนั้นค่อนข้างง่ายหากคุณละเลยรายละเอียดระดับต่ำ Lucene สร้างสิ่งที่เรียกว่า "ดัชนีกลับด้าน" จากเอกสาร ดังนั้นหากเอกสารที่มีข้อความ "To be or not to" และ id = 1 เข้ามาดัชนีกลับด้านจะมีลักษณะดังนี้:

[to] → 1
[be] → 1
[or] → 1
[not] → 1

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

ในความเป็นจริงสิ่งต่าง ๆ มีความซับซ้อนมากขึ้น:

  • Lucene อาจข้ามบางคำตามตัววิเคราะห์ที่ระบุ
  • คำสามารถถูกประมวลผลล่วงหน้าโดยใช้อัลกอริธึมการแยกคำเพื่อลดความยืดหยุ่นของภาษา
  • รายการการโพสต์ไม่ได้มีเพียงตัวระบุของเอกสารเท่านั้น แต่ยังรวมถึงคำที่ระบุไว้ในเอกสาร (อาจมีหลายอินสแตนซ์) และข้อมูลเพิ่มเติมอื่น ๆ

มีภาวะแทรกซ้อนอื่น ๆ อีกมากมายซึ่งไม่สำคัญสำหรับความเข้าใจพื้นฐาน

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

จึงเกิดคำถามขึ้น - เราจะเปลี่ยนเอกสารที่ทำดัชนีแล้วได้อย่างไร?

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

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

การใช้กระบวนการง่ายๆนี้ Lucene สามารถรักษาดัชนีให้อยู่ในเกณฑ์ดีในแง่ของประสิทธิภาพการค้นหา

หวังว่ามันจะช่วยได้


1
ดังนั้นเพื่อประโยชน์ในการค้นหาผลลัพธ์ที่เป็นปัจจุบันที่สุดก่อนการค้นหาจะเริ่มต้นด้วยการดูกลุ่มใหม่ล่าสุดหรือไม่ เพื่อชี้แจง - สมมติว่ามีการอัปเดตเอกสาร เวอร์ชันเก่าของเอกสารจะถูกเพิ่มลงในรายการ kill จากนั้นการจับคู่ใด ๆ ที่พบในกลุ่มที่เก่ากว่าจะถูกลบออกจากผลการค้นหาหากรหัสเอกสารตรงกับ id ในรายการฆ่า
Joel B

2
ใช่คุณถูกต้อง. สิ่งเดียวที่จะกล่าวถึงคือลำดับสุดท้ายถูกกำหนดโดยใช้กฎการจัดเรียง (ดัชนีความเกี่ยวข้องในกรณีเล็กน้อย) ดังนั้นลำดับที่จะค้นหาส่วนต่างๆจึงไม่เกี่ยวข้อง
Denis Bazhenov

13

เป็นดัชนีกลับหัวแต่ไม่ได้ระบุโครงสร้างที่ใช้ รูปแบบดัชนีในลูซีนมีข้อมูลครบถ้วน
เริ่มต้นด้วย 'สรุปส่วนขยายไฟล์'

ก่อนอื่นคุณจะสังเกตเห็นว่ามันพูดถึงดัชนีต่างๆ เท่าที่ฉันสังเกตเห็นว่าไม่มีการใช้งานที่พูดถึงB-treeอย่างเคร่งครัดแต่มีความคล้ายคลึงกัน - โครงสร้างด้านบนคล้ายกับต้นไม้


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