Lucene ทำงานอย่างไร


90

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

ข้อความค้นหาโดยใช้การค้นหาข้อความ mysql5 ด้วยดัชนีใช้เวลาประมาณ 18 นาทีในกรณีของฉัน การค้นหาลูซีนสำหรับข้อความค้นหาเดียวกันใช้เวลาไม่ถึงหนึ่งวินาที


2
ฉันสามารถขอให้แปลงคำถามนี้เป็นวิกิชุมชนได้หรือไม่ ตอนนี้ Lucene ดูเหมือนแพลตฟอร์ม
asyncwait

คำตอบ:


75

Lucene เป็นดัชนีข้อความเต็มกลับหัว ซึ่งหมายความว่ามันต้องใช้เอกสารทั้งหมดที่แยกพวกเขาเป็นคำแล้วสร้างดัชนีสำหรับแต่ละคำ เนื่องจากดัชนีเป็นการจับคู่สตริงที่แน่นอนไม่มีการเรียงลำดับจึงสามารถทำได้เร็วมาก สมมุติฐานดัชนีที่ไม่เรียงลำดับของ SQL บนvarcharฟิลด์อาจเร็วพอ ๆ กันและอันที่จริงฉันคิดว่าคุณจะพบว่าฐานข้อมูลขนาดใหญ่สามารถทำแบบสอบถามความเท่าเทียมกันของสตริงได้อย่างรวดเร็วในกรณีนั้น

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

อย่างไรก็ตามในตอนท้ายของวันหากคุณต้องการทราบจริงๆคุณต้องอ่านที่มา ทั้งสองสิ่งที่คุณอ้างอิงเป็นโอเพ่นซอร์สหลังจากทั้งหมด


ถ้าฉันเข้าใจถูกต้องสิ่งที่ทำให้เครื่องมือค้นหาข้อความแตกต่างออกไปคือวิธีที่พวกเขาจัดการการค้นหาหลายคำและรวมผลการค้นหากับดัชนีหลายรายการในแบบเรียลไทม์ ฉันไม่แนะนำให้ปรึกษาแหล่งที่มาของ Lucene สำหรับเรื่องนี้ คงจะดีกว่าถ้าอ่านทฤษฎีการค้นหาข้อความสักหน่อยคำตอบของ @ AlienCoder ช่วยฉันได้
Chris Dutrow

1
@bmargulies หากการสร้างดัชนีเป็น "ต่อคำ" เหตุใดการค้นหาผู้ใช้stackoverflow stackoverflow.com/users จึงอนุญาตให้จับคู่สตริงย่อย
Pacerier

2
นี่ไม่ใช่สถานที่สำหรับคำตอบทั้งเล่ม มีรายละเอียดมากมายเกี่ยวกับแนวคิดพื้นฐานในนั้น
bmargulies

คุณหมายถึงอะไร "ดัชนีสำหรับแต่ละคำ" ... ถ้าฉันเริ่มพิมพ์ "abc" จะพบ "abc" ในเอกสารได้อย่างไร
Alexander Mills

1
ดัชนี (B-tree) จากคำไปยังเอกสารสามารถค้นหาเอกสารด้วยคำในเอกสารได้เนื่องจากตารางของดัชนีดังกล่าวคือ (word, document) โดยที่ดัชนีอยู่ในคอลัมน์คำ ลองใช้คำค้นหาเช่น: "ค้นหาเอกสารที่มีคำว่า" police "," Crime "," statistics "" อยู่ในเอกสารเหล่านี้ ด้วยการค้นหาดัชนีคำคุณสามารถค้นหาบันทึก (N) สามรายการเพื่อรับเอกสาร O (N) ที่มีคำใดคำหนึ่งอยู่ในนั้น จากนั้นคุณสามารถทำสอง O (N) ลูปเพื่อสร้างชุดที่มีเอกสารที่มีทั้งสามคำ แม้ว่าในทางทฤษฎีจะเป็นการดำเนินการ O (N) แต่เอกสารส่วนใหญ่ไม่มีทั้งสามคำดังนั้นจึงเป็น O (n) โดยที่ n <N.
Calicoder

34

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

สำหรับข้อมูลเพิ่มเติมโปรดอ่านบทความนี้โดยนักพัฒนาของ Google - http://infolab.stanford.edu/~backrub/google.html


8
อ่านดูแล้วมันมีประโยชน์มาก โดยเฉพาะ "4.5 Searching" มีคำตอบที่ฉันต้องการ โดยเฉพาะดูเหมือนว่าการค้นหาแฮช O (1) จะใช้สำหรับแต่ละคำ แต่จากนั้นการสแกน O (n) จะใช้เพื่อรวมผลลัพธ์ที่มีขีด จำกัด เอกสาร 40,000 รายการ ฉันคิดว่าอัลกอริทึมการลดแผนที่ถูกใช้เพื่อแยกงานนี้เพื่อให้ผู้ใช้ได้รับผลลัพธ์ทันที
Chris Dutrow

ขั้นตอนวิธีหนึ่งที่ได้รับความนิยมคืออัลกอริทึมอันดับนกพิราบ แม้ว่าฉันจะไม่ค่อยรู้เรื่อง
alienCoder

3
กระดาษแผ่นนั้นน่าขบขัน: "ในบทความนี้เรานำเสนอ Google ซึ่งเป็นต้นแบบ ... " ฉันเดาว่า Google ไม่ใช่ บริษัท ขนาดใหญ่เสมอไป
ปุ่ม 840

ไม่รู้จัก Lucene แต่มีคำถามหนึ่งข้อ: การจัดอันดับเกิดขึ้นในการค้นหาแต่ละครั้ง? หรือเก็บรักษาเอกสารที่จัดลำดับไว้ล่วงหน้า? หากเก็บรักษาเอกสารตามอันดับล่วงหน้าจะดูแลรักษาคำค้นหาหลายคำได้อย่างไร
Vikas Prasad

ตอนนี้ลิงค์เสีย @alienCoder
CEGRD

20

ในคำ: การจัดทำดัชนี

Lucene สร้างดัชนีของเอกสารของคุณที่ช่วยให้ค้นหาได้เร็วขึ้นมาก

ความแตกต่างที่เหมือนกันระหว่างโครงสร้างข้อมูลรายการ O (N) และโครงสร้างข้อมูลตารางแฮช O (1) รายการต้องเดินผ่านคอลเลคชันทั้งหมดเพื่อค้นหาสิ่งที่คุณต้องการ ตารางแฮชมีดัชนีที่ช่วยให้สามารถระบุได้อย่างชัดเจนว่ารายการที่ต้องการอยู่ที่ใดและเพียงแค่ดึงมันมา

อัปเดต:

ฉันไม่แน่ใจว่าคุณหมายถึงอะไร "การค้นหาดัชนีของ Lucene เร็วกว่าการค้นหาดัชนี mysql มาก"

ฉันเดาว่าคุณกำลังใช้ MySQL "WHERE document LIKE '% phrase%'" เพื่อค้นหาเอกสาร หากเป็นเช่นนั้น MySQL จะต้องทำการสแกนตารางทุกแถวซึ่งจะเป็น O (N)

Lucene จะแยกวิเคราะห์เอกสารเป็นโทเค็นจัดกลุ่มเป็น n-g ตามทิศทางของคุณและคำนวณดัชนีสำหรับแต่ละรายการ เป็น O (1) เพื่อค้นหาคำในเอกสาร Lucene ที่จัดทำดัชนี


10
ใช่ฉันเข้าใจส่วนการจัดทำดัชนี แต่อีกครั้งการค้นหาดัชนี lucene นั้นเร็วกว่าการค้นหาดัชนี mysql มาก มันเกิดขึ้นได้อย่างไร
Midhat

9

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

ตัวอย่าง :

ไฟล์ 1: Random Access Memory เป็นหน่วยความจำหลัก

ไฟล์ 2: ฮาร์ดดิสก์เป็นหน่วยความจำรอง

Lucene สร้างดัชนีย้อนกลับบางอย่างเช่น

ไฟล์ 1:

ระยะ: สุ่ม

ความถี่: 1

ตำแหน่ง: 0

ระยะ: หน่วยความจำ

ความถี่: 2

ตำแหน่ง: 3

ตำแหน่ง: 6

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

หลัก

ไฟล์ 1: ความถี่ - 1

หน่วยความจำ

ไฟล์ 1: ความถี่ - 2

ไฟล์ 2: ความถี่ - 1

ผลที่ตามมาจะเป็นFile1ตามFile2 หากต้องการหยุดการชั่งน้ำหนักของคำที่ใช้บ่อยที่สุดเช่น 'และ', 'หรือ' 'ให้พิจารณาความถี่ของเอกสารผกผัน (กล่าวคือ' จะลดน้ำหนักของคำที่เป็นที่นิยมมากที่สุดในชุดเอกสาร)

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