SOLR เป็นเซิร์ฟเวอร์แอปพลิเคชันการค้นหาระดับองค์กรอิสระที่มีอินเตอร์เฟส API ที่มีลักษณะคล้ายเว็บ ผู้ใช้สามารถส่งไฟล์ XML ของรูปแบบที่แน่นอนไปยังเซิร์ฟเวอร์ Search Engine ผ่านคำขอ HTTP และสร้างดัชนี พวกเขายังสามารถส่งคำขอการค้นหาผ่าน HTTP Get Operations และรับผลตอบแทนในรูปแบบ XML/JSON พัฒนาขึ้นโดยใช้ Java5 ขึ้นอยู่กับ Lucene
Lucene เป็นโครงการย่อยของทีมโครงการจาก Jakarta 4 คนของ Apache Software Foundation มันเป็นชุดเครื่องมือค้นหาแบบเต็มรูปแบบโอเพ่นซอร์สนั่นคือไม่ใช่เครื่องมือค้นหาข้อความเต็มรูปแบบที่สมบูรณ์ แต่เป็นสถาปัตยกรรมของเครื่องมือค้นหาข้อความเต็มรูปแบบที่ให้บริการเครื่องมือค้นหาและเครื่องยนต์ดัชนีที่สมบูรณ์และเครื่องมือวิเคราะห์ข้อความบางส่วน (ภาษาอังกฤษและภาษาตะวันตกภาษาอังกฤษ)
ในหมู่พวกเขาหลักการพื้นฐานของการค้นหาข้อความเต็มรูปแบบของ Lucene นั้นสอดคล้องกับเทคโนโลยีในหลักสูตรการค้นหาเว็บที่สอนโดย Guo Jundaniu มันใช้การแบ่งส่วนคำ, การวิเคราะห์ไวยากรณ์ความหมาย, แบบจำลองพื้นที่เวกเตอร์และเทคโนโลยีอื่น ๆ เพื่อให้บรรลุ ต่อไปนี้เป็นบันทึกการโพสต์บล็อกโดยละเอียดเพิ่มเติม: http://www.cnblogs.com/guochunguang/articles/3641008.html
1. การสนทนาทั่วไป
คำจำกัดความตาม http://lucene.apache.org/java/docs/index.html:
Lucene เป็นไลบรารีการค้นหาข้อความแบบเต็มรูปแบบที่มีประสิทธิภาพและบน Java
ดังนั้นก่อนที่คุณจะเข้าใจ Lucene คุณต้องใช้เวลาสักครู่เพื่อเรียนรู้เกี่ยวกับการค้นหาข้อความแบบเต็ม
การค้นหาข้อความแบบเต็มคืออะไร? สิ่งนี้เริ่มต้นด้วยข้อมูลในชีวิตของเรา
ข้อมูลในชีวิตของเราโดยทั่วไปแบ่งออกเป็นสองประเภท: ข้อมูลที่มีโครงสร้างและข้อมูลที่ไม่มีโครงสร้าง
•ข้อมูลที่มีโครงสร้าง: หมายถึงข้อมูลที่มีรูปแบบคงที่หรือความยาว จำกัด เช่นฐานข้อมูลเมตาดาต้า ฯลฯ
•ข้อมูลที่ไม่มีโครงสร้าง: หมายถึงข้อมูลที่มีความยาวไม่แน่นอนหรือไม่มีรูปแบบคงที่เช่นอีเมลเอกสารคำ ฯลฯ
แน่นอนว่าบางสถานที่จะกล่าวถึงประเภทที่สามข้อมูลกึ่งโครงสร้างเช่น XML, HTML ฯลฯ เมื่อสามารถประมวลผลได้ตามข้อมูลที่มีโครงสร้างหรือข้อความธรรมดาสามารถแยกออกไปเพื่อประมวลผลเป็นข้อมูลที่ไม่มีโครงสร้าง
ข้อมูลที่ไม่มีโครงสร้างเรียกอีกอย่างว่าข้อมูลข้อความเต็ม
ตามการจำแนกประเภทของข้อมูลการค้นหาจะแบ่งออกเป็นสองประเภท:
•ค้นหาข้อมูลที่มีโครงสร้าง: ตัวอย่างเช่นการค้นหาฐานข้อมูลใช้คำสั่ง SQL ตัวอย่างเช่นการค้นหาข้อมูลเมตาเช่นการใช้ Windows Search เพื่อค้นหาชื่อไฟล์ประเภทเวลาการแก้ไขเวลา ฯลฯ
•ค้นหาข้อมูลที่ไม่มีโครงสร้าง: ตัวอย่างเช่นการค้นหา Windows ยังสามารถค้นหาเนื้อหาไฟล์คำสั่ง GREP ภายใต้ Linux และตัวอย่างเช่นการใช้ Google และ Baidu สามารถค้นหาข้อมูลเนื้อหาจำนวนมาก
มีสองวิธีหลักสำหรับการค้นหาข้อมูลที่ไม่มีโครงสร้างนั่นคือข้อมูลข้อความเต็ม:
หนึ่งคือ การสแกนแบบอนุกรม: การสแกนตามลำดับที่เรียกว่าเช่นการมองหาไฟล์ที่มีสตริงที่แน่นอนคือการดูเอกสารแต่ละฉบับในแต่ละครั้ง สำหรับแต่ละเอกสารดูตั้งแต่ต้นจนจบ หากเอกสารนี้มีสตริงนี้เอกสารนี้เป็นไฟล์ที่เรากำลังมองหาและจากนั้นดูที่ไฟล์ถัดไปจนกว่าไฟล์ทั้งหมดจะถูกสแกน หากคุณใช้ Windows ในการค้นหาคุณสามารถค้นหาเนื้อหาไฟล์ แต่ค่อนข้างช้า หากคุณมีฮาร์ดไดรฟ์ 80 กรัมหากคุณต้องการค้นหาไฟล์ที่มีสตริงบางตัวอยู่ก็กลัวว่าคุณจะไม่สามารถทำได้โดยไม่ต้องใช้เวลาสองสามชั่วโมง นี่เป็นวิธีเดียวกันสำหรับคำสั่ง GREP ภายใต้ Linux คุณอาจคิดว่าวิธีนี้ค่อนข้างดั้งเดิม แต่สำหรับไฟล์ที่มีปริมาณข้อมูลขนาดเล็กวิธีนี้ยังคงตรงและสะดวกที่สุด แต่สำหรับไฟล์จำนวนมากวิธีนี้ช้ามาก
บางคนอาจบอกว่าการสแกนตามลำดับของข้อมูลที่ไม่มีโครงสร้างนั้นช้ามาก แต่การค้นหาข้อมูลที่มีโครงสร้างค่อนข้างเร็ว (เนื่องจากข้อมูลที่มีโครงสร้างมีโครงสร้างที่แน่นอนอัลกอริทึมการค้นหาบางอย่างสามารถใช้เพื่อเพิ่มความเร็วในการเร่งความเร็ว) ดังนั้นจึงไม่เพียงพอที่จะหาวิธีที่จะทำให้ข้อมูลที่ไม่มีโครงสร้างของเรามีโครงสร้างบางอย่าง?
ความคิดนี้เป็นธรรมชาติ แต่เป็นแนวคิดพื้นฐานของการค้นหาข้อความแบบเต็มซึ่งเป็นการแยกข้อมูลบางส่วนในข้อมูลที่ไม่มีโครงสร้างและจัดระเบียบใหม่เพื่อให้มีโครงสร้างที่แน่นอนจากนั้นค้นหาข้อมูลที่มีโครงสร้างที่แน่นอนเพื่อให้บรรลุวัตถุประสงค์ในการค้นหาอย่างรวดเร็ว
ส่วนนี้ของข้อมูลที่สกัดจากข้อมูลที่ไม่มีโครงสร้างแล้วจัดโครงสร้างใหม่เรียกว่าดัชนี
คำแถลงนี้ค่อนข้างเป็นนามธรรมและเป็นเรื่องง่ายที่จะเข้าใจโดยยกตัวอย่าง ตัวอย่างเช่นพจนานุกรมตารางพินอินและตารางการตรวจสอบอย่างรุนแรงของพจนานุกรมนั้นเทียบเท่ากับดัชนีของพจนานุกรม คำอธิบายของตัวละครแต่ละตัวไม่มีโครงสร้าง หากพจนานุกรมไม่มีตารางพยางค์และตารางตัวละครตรวจสอบหัวรุนแรงคุณสามารถสแกนได้ในทะเลอันกว้างใหญ่ของคำ อย่างไรก็ตามข้อมูลบางอย่างของคำสามารถสกัดได้สำหรับการประมวลผลที่มีโครงสร้าง ตัวอย่างเช่นการออกเสียงมีโครงสร้างค่อนข้างแบ่งออกเป็นชื่อย่อและรอบชิงชนะเลิศและมีเพียงไม่กี่ประเภทที่สามารถแสดงรายการทีละรายการ ดังนั้นการออกเสียงจะถูกนำออกและจัดเรียงตามลำดับและการออกเสียงแต่ละชี้ไปที่จำนวนหน้าของคำอธิบายโดยละเอียดของคำนี้ เมื่อเราค้นหาเราจะค้นหาการออกเสียงตามพินอินที่มีโครงสร้างและจากนั้นเราสามารถค้นหาข้อมูลที่ไม่มีโครงสร้างของเรา - นั่นคือคำอธิบายของคำ
กระบวนการของการสร้างดัชนีครั้งแรกนี้จากนั้นค้นหาดัชนีเรียกว่าการค้นหาข้อความแบบเต็ม
ภาพด้านล่างนี้มาจาก "Lucene in Action" แต่ไม่เพียง แต่อธิบายกระบวนการค้นหาของ Lucene แต่ยังอธิบายถึงกระบวนการทั่วไปของการค้นหาข้อความแบบเต็ม
การค้นหาข้อความแบบเต็มโดยทั่วไปแบ่งออกเป็นสองกระบวนการ: การสร้างดัชนี (การจัดทำดัชนี) และดัชนีการค้นหา (การค้นหา)
•การสร้างดัชนี: กระบวนการแยกข้อมูลจากข้อมูลที่มีโครงสร้างและไม่มีโครงสร้างทั้งหมดในโลกแห่งความเป็นจริงและสร้างดัชนี
•ดัชนีการค้นหา: มันเป็นกระบวนการของการขอคำขอการสืบค้นของผู้ใช้ค้นหาดัชนีที่สร้างขึ้นแล้วส่งคืนผลลัพธ์
ดังนั้นจึงมีประเด็นสำคัญสามประการในการค้นหาข้อความแบบเต็ม:
1. มีอะไรบ้างในดัชนี? (ดัชนี)
2. จะสร้างดัชนีได้อย่างไร? (การจัดทำดัชนี)
3. จะค้นหาดัชนีได้อย่างไร? (ค้นหา)
ด้านล่างเราศึกษาแต่ละปัญหาตามลำดับ
2. มีอะไรอยู่ในดัชนี
สิ่งที่ต้องเก็บไว้ในดัชนีคืออะไร?
ก่อนอื่นมาดูกันว่าทำไมความเร็วในการสแกนตามลำดับจึงช้า:
ในความเป็นจริงมันเกิดจากความไม่สอดคล้องกันระหว่างข้อมูลที่เราต้องการค้นหาและข้อมูลที่เก็บไว้ในข้อมูลที่ไม่มีโครงสร้าง
ข้อมูลที่เก็บไว้ในข้อมูลที่ไม่มีโครงสร้างคือสิ่งที่แต่ละไฟล์มีอยู่นั่นคือไฟล์ที่รู้จักและค่อนข้างง่ายที่จะค้นหาสตริงนั่นคือการแมปจากไฟล์ไปยังสตริง ข้อมูลที่เราต้องการค้นหาคือไฟล์ที่มีสตริงนี้นั่นคือสตริงที่รู้จักและไฟล์ที่ต้องการนั่นคือการแมปจากสตริงไปยังไฟล์ ทั้งสองเป็นสิ่งที่ตรงกันข้าม ดังนั้นหากดัชนีสามารถบันทึกการแมปจากสตริงไปยังไฟล์ได้เสมอความเร็วในการค้นหาจะได้รับการปรับปรุงอย่างมาก
เนื่องจากการแมปจากสตริงไปยังไฟล์เป็นกระบวนการย้อนกลับของไฟล์ไปยังการแมปสตริงดัชนีที่เก็บข้อมูลดังกล่าวเรียกว่า ดัชนีย้อนกลับ
ข้อมูลที่บันทึกไว้ของดัชนีย้อนกลับโดยทั่วไปดังนี้:
สมมติว่ามี 100 เอกสารในคอลเลกชันเอกสารของฉัน เพื่อความสะดวกเราได้หมายเลขเอกสารตั้งแต่ 1 ถึง 100 และรับโครงสร้างต่อไปนี้
ด้านซ้ายเป็นชุดของสตริงที่เรียกว่า พจนานุกรม
แต่ละสตริงชี้ไปยังรายการที่เชื่อมโยงกับเอกสารที่มีสตริงนี้ซึ่งเรียกว่า รายการโพสต์
ด้วยการจัดทำดัชนีข้อมูลที่บันทึกไว้นั้นสอดคล้องกับข้อมูลที่จะค้นหาซึ่งสามารถเพิ่มความเร็วในการค้นหาได้อย่างมาก
ตัวอย่างเช่นหากเราต้องการค้นหาเอกสารที่มีทั้งสตริง "Lucene" และสตริง "Solr" เราต้องการขั้นตอนต่อไปนี้เท่านั้น:
1. ลบรายการลิงก์เอกสารที่มีสตริง "Lucene"
2. ลบรายการลิงค์เอกสารที่มีสตริง "SOLR"
3. โดยการรวมรายการที่เชื่อมโยงค้นหาไฟล์ที่มีทั้ง "Lucene" และ "Solr"
เมื่อเห็นสถานที่แห่งนี้บางคนอาจบอกว่าการค้นหาข้อความแบบเต็มจะเพิ่มความเร็วในการค้นหา แต่ด้วยกระบวนการของการทำดัชนีพิเศษทั้งสองอาจไม่เร็วกว่าการสแกนตามลำดับ อันที่จริงด้วยกระบวนการจัดทำดัชนีการดึงข้อความแบบเต็มไม่จำเป็นต้องเร็วกว่าการสแกนตามลำดับโดยเฉพาะอย่างยิ่งเมื่อปริมาณข้อมูลมีขนาดเล็ก การสร้างดัชนีข้อมูลจำนวนมากก็เป็นกระบวนการที่ช้ามาก
อย่างไรก็ตามยังมีความแตกต่างระหว่างทั้งสอง การสแกนแบบต่อเนื่องเป็นการสแกนทุกครั้งและกระบวนการสร้างดัชนีจะต้องเป็นเพียงครั้งเดียวเท่านั้น การค้นหาแต่ละครั้งกระบวนการสร้างดัชนีไม่จำเป็นต้องผ่านเพียงแค่ค้นหาดัชนีที่สร้างขึ้น
นี่เป็นหนึ่งในข้อดีของการค้นหาข้อความเต็มรูปแบบการสแกนแบบต่อเนื่อง: การจัดทำดัชนีหนึ่งครั้งโดยใช้หลายครั้ง
3. วิธีสร้างดัชนี
กระบวนการสร้างดัชนีของการค้นหาข้อความแบบเต็มโดยทั่วไปมีขั้นตอนต่อไปนี้:
ขั้นตอนที่ 1: เอกสารต้นฉบับบางฉบับที่จะจัดทำดัชนี (เอกสาร)
เพื่ออำนวยความสะดวกในการอธิบายกระบวนการสร้างดัชนีที่นี่เราใช้สองไฟล์เป็นตัวอย่าง:
ไฟล์หนึ่ง: นักเรียนควรได้รับอนุญาตให้ออกไปเที่ยวกับเพื่อน แต่ไม่ได้รับอนุญาตให้ดื่มเบียร์
ไฟล์ 2: เจอร์รี่เพื่อนของฉันไปโรงเรียนเพื่อดูนักเรียนของเขา แต่พบว่าพวกเขาเมาซึ่งไม่ได้รับอนุญาต
ขั้นตอนที่ 2: ส่งเอกสารต้นฉบับไปยัง Tokenizer
ส่วนประกอบคำนาม (tokenizer) จะทำสิ่งต่อไปนี้ (กระบวนการนี้เรียกว่า tokenize):
1. แบ่งเอกสารออกเป็นคำแยก
2. ลบเครื่องหมายวรรคตอน
3. ลบคำหยุด
คำหยุดที่เรียกว่าเป็นคำที่พบบ่อยที่สุดในภาษา เนื่องจากไม่มีความหมายพิเศษจึงไม่สามารถเป็นคำค้นหาในกรณีส่วนใหญ่ ดังนั้นเมื่อสร้างดัชนีคำนี้จะถูกลบออกและขนาดของดัชนีจะลดลง
ภาษาอังกฤษหยุดคำเช่น: "The", "a", "this" ฯลฯ
สำหรับ tokenizer ของแต่ละภาษามีชุดคำหยุด
ผลลัพธ์ที่ได้รับหลังจากคำนาม (tokenizer) เรียกว่าองค์ประกอบคำ
ในตัวอย่างของเราเราได้รับองค์ประกอบคำต่อไปนี้ (โทเค็น):
"นักเรียน", "อนุญาต", "go", "พวกเขา", "เพื่อน", "อนุญาต", "ดื่ม", "เบียร์", "ฉัน", "เพื่อน", "เจอร์รี่", "ไป", "โรงเรียน", "ดู", "ของเขา", "นักเรียน", "พบ", "พวกเขา", "เมา", "
ขั้นตอนที่ 3: ส่งโทเค็นที่ได้รับไปยังองค์ประกอบการประมวลผลภาษา (โปรเซสเซอร์ภาษา)
องค์ประกอบการประมวลผลภาษา (โปรเซสเซอร์ภาษาศาสตร์) ส่วนใหญ่เกี่ยวข้องกับองค์ประกอบคำที่เกิดขึ้น (โทเค็น)
สำหรับภาษาอังกฤษส่วนประกอบการประมวลผลภาษา (โปรเซสเซอร์ภาษาศาสตร์) โดยทั่วไปจะทำดังต่อไปนี้:
1. เปลี่ยนเป็นตัวพิมพ์เล็ก (ตัวพิมพ์เล็ก)
2. ลดคำลงในรูปแบบรากเช่น "รถยนต์" เป็น "รถยนต์" ฯลฯ การดำเนินการนี้เรียกว่า: เกิดขึ้น
3. แปลงคำเป็นรูปแบบรูทเช่น "ขับ" เป็น "ไดรฟ์" ฯลฯ การดำเนินการนี้เรียกว่า lemmatization
ความคล้ายคลึงและความแตกต่างระหว่างการเกิดและ lemmatization:
• Symmetric: การเกิดและ lemmatization ทั้งคู่ทำให้คำศัพท์เป็นรูปแบบราก
•ทั้งสองวิธีแตกต่างกัน:
◦ระบบใช้วิธีการ "ลด": "รถยนต์" ถึง "รถยนต์", "ขับรถ" ถึง "ไดรฟ์"
◦เลมมาเมชั่นใช้วิธีการ "การเปลี่ยนแปลง": "ขับ" ถึง "ขับ", "ขับรถ" เป็น "ขับ"
•อัลกอริทึมของทั้งสองนั้นแตกต่างกัน:
◦ระบบส่วนใหญ่ใช้อัลกอริทึมคงที่บางอย่างเพื่อลดการลดลงเช่นการลบ "s", ลบ "ing" และเพิ่ม "e", การเปลี่ยนแปลง "ational" เป็น "กิน" และเปลี่ยน "tional" เป็น "tion"
◦เลมมาเมชั่นส่วนใหญ่ใช้วิธีการบันทึกพจนานุกรมบางอย่างเพื่อทำการเปลี่ยนแปลงนี้ ตัวอย่างเช่นมีการแมปจาก "การขับขี่" ถึง "ขับรถ", "ขับ" ถึง "ไดรฟ์", "ฉันคือคือ" เป็น "เป็น" ในพจนานุกรม เมื่อทำการเปลี่ยนแปลงให้ค้นหาพจนานุกรม
• stemming และ lemmatization ไม่ใช่ความสัมพันธ์ที่ไม่เกิดร่วมกัน แต่มีทางแยก คำบางคำสามารถบรรลุการแปลงเดียวกันโดยใช้ทั้งสองวิธี
ผลลัพธ์ของโปรเซสเซอร์ทางภาษาเรียกว่าคำ
ในตัวอย่างของเราหลังจากการประมวลผลภาษาคำ (คำ) ที่ได้รับมีดังนี้:
"นักเรียน", "อนุญาต", "ไป", "พวกเขา", "เพื่อน", "อนุญาต", "ดื่ม", "เบียร์", "ฉัน", "เพื่อน", "เจอร์รี่", "ไป", "โรงเรียน", "ดู", "เขา", "นักเรียน", "ค้นหา", "พวกเขา", "ดื่ม"
เป็นเพราะขั้นตอนการประมวลผลภาษาที่สามารถค้นหาไดรฟ์ได้และสามารถค้นหาไดรฟ์ได้
ขั้นตอนที่ 4: ผ่านคำที่ได้รับ (คำ) ไปยังองค์ประกอบดัชนี (ดัชนี)
ตัวทำดัชนีส่วนใหญ่ทำดังต่อไปนี้:
1. สร้างพจนานุกรมโดยใช้คำที่ได้ (คำศัพท์)
ในตัวอย่างของเราพจนานุกรมมีดังนี้:
ภาคเรียน | รหัสเอกสาร |
นักเรียน | 1 |
อนุญาต | 1 |
ไป | 1 |
ของพวกเขา | 1 |
เพื่อน | 1 |
อนุญาต | 1 |
ดื่ม | 1 |
เบียร์ | 1 |
ของฉัน | 2 |
เพื่อน | 2 |
เจอร์รี่ | 2 |
ไป | 2 |
โรงเรียน | 2 |
ดู | 2 |
ของเขา | 2 |
นักเรียน | 2 |
หา | 2 |
พวกเขา | 2 |
ดื่ม | 2 |
อนุญาต | 2 |
2. เรียงลำดับพจนานุกรมตามตัวอักษร
ภาคเรียน | รหัสเอกสาร |
อนุญาต | 1 |
อนุญาต | 1 |
อนุญาต | 2 |
เบียร์ | 1 |
ดื่ม | 1 |
ดื่ม | 2 |
หา | 2 |
เพื่อน | 1 |
เพื่อน | 2 |
ไป | 1 |
ไป | 2 |
ของเขา | 2 |
เจอร์รี่ | 2 |
ของฉัน | 2 |
โรงเรียน | 2 |
ดู | 2 |
นักเรียน | 1 |
นักเรียน | 2 |
ของพวกเขา | 1 |
พวกเขา | 2 |
•ความถี่เอกสารหมายถึงความถี่ของเอกสารซึ่งระบุจำนวนไฟล์ที่มีคำนี้ (คำศัพท์)
•ความถี่หมายถึงความถี่ของคำซึ่งหมายความว่าไฟล์นี้มีหลายคำ (คำ)
ดังนั้นสำหรับคำว่า "อนุญาต" มีเอกสารสองฉบับที่มีคำนี้ (คำศัพท์) ดังนั้นจึงมีเอกสารสองฉบับต่อไปนี้รายการเอกสารหลังจากคำ (คำ) รายการแรกแสดงถึงเอกสารแรกที่มี "อนุญาต" นั่นคือเอกสาร 1 ในเอกสารนี้ "อนุญาต" ปรากฏขึ้นสองครั้งและรายการที่สองแสดงถึงเอกสารที่สองที่มี "อนุญาต" เป็นเอกสาร 2 ในเอกสารนี้ "อนุญาต" ปรากฏขึ้นหนึ่งครั้ง
จนถึงตอนนี้ดัชนีได้ถูกสร้างขึ้นและเราสามารถค้นหาเอกสารที่เราต้องการได้อย่างรวดเร็ว
และในกระบวนการเรารู้สึกประหลาดใจที่พบว่าการค้นหา "ไดรฟ์", "ขับรถ", "ขับรถ" และ "ขับเคลื่อน" ก็สามารถพบได้เช่นกัน เพราะในดัชนีของเรา "ขับรถ", "ขับรถ" และ "ขับเคลื่อน" ทั้งหมดจะถูกประมวลผลผ่านภาษาและกลายเป็น "ไดรฟ์" เมื่อค้นหาหากคุณป้อน "การขับขี่" คำสั่งค้นหาที่ป้อนจะผ่านขั้นตอนหนึ่งถึงสามขั้นตอนที่นี่แล้วกลายเป็น "ไดรฟ์" แบบสอบถามเพื่อให้คุณสามารถค้นหาเอกสารที่ต้องการได้
3. จะค้นหาดัชนีได้อย่างไร?
ดูเหมือนว่าเราสามารถประกาศ "เราพบเอกสารที่เราต้องการ"
อย่างไรก็ตามเรื่องนี้ยังไม่จบและพบว่ามันเป็นเพียงแง่มุมเดียวของการค้นหาข้อความแบบเต็ม ไม่ใช่เหรอ? หากมีเพียงหนึ่งหรือสิบเอกสารที่มีสตริงที่เราสอบถามเราก็พบว่า แต่ถ้ามีพันหรือพันล่ะ? ไฟล์ไหนที่คุณต้องการมากที่สุด?
เปิด Google ตัวอย่างเช่นหากคุณต้องการหางานที่ Microsoft คุณจะป้อน "Microsoft Job" และคุณจะได้ผลลัพธ์ทั้งหมด 22600,000 รายการ ช่างเป็นปัญหาใหญ่มากที่ฉันพบว่ามันไม่พบและมีปัญหามากเกินไปเช่นกัน ด้วยผลลัพธ์มากมายคุณจะใส่สิ่งที่เกี่ยวข้องมากที่สุดก่อนได้อย่างไร?
แน่นอนว่า Google ทำงานได้ดีคุณจะพบงานที่ Microsoft ในครั้งเดียว ลองนึกภาพว่ามันแย่แค่ไหนถ้าคนแรก ๆ คนแรก "Microsoft ทำงานได้ดีในอุตสาหกรรมซอฟต์แวร์ ... "
วิธีค้นหาคำสั่งการสืบค้นที่เกี่ยวข้องมากที่สุดระหว่างผลการค้นหาหลายพันรายการเช่น Google
จะกำหนดความสัมพันธ์ระหว่างเอกสารค้นหาและคำสั่งค้นหาได้อย่างไร?
นี่คือคำถามที่สามของเรา: จะค้นหาดัชนีได้อย่างไร?
การค้นหาส่วนใหญ่แบ่งออกเป็นขั้นตอนต่อไปนี้:
ขั้นตอนที่ 1: ผู้ใช้ป้อนคำสั่ง Query
คำสั่งค้นหามีไวยากรณ์บางอย่างเช่นเดียวกับภาษาธรรมดาของเรา
คำสั่งค้นหาที่แตกต่างกันมีไวยากรณ์ที่แตกต่างกันเช่นคำสั่ง SQL มีไวยากรณ์บางอย่าง
ไวยากรณ์ของคำสั่ง Query แตกต่างกันไปตามการใช้งานระบบดึงข้อความแบบเต็มข้อความ พื้นฐานที่สุด ได้แก่ : และหรือไม่ ฯลฯ
ตัวอย่างเช่นคำสั่งอินพุตของผู้ใช้: Lucene และเรียนรู้ไม่ได้เป็น Hadoop
อธิบายว่าผู้ใช้ต้องการค้นหาเอกสารที่มี Lucene และเรียนรู้ แต่ไม่รวม Hadoop
ขั้นตอนที่ 2: ดำเนินการวิเคราะห์คำศัพท์การวิเคราะห์ทางไวยากรณ์และการประมวลผลภาษาของคำสั่งค้นหา
เนื่องจากคำสั่งค้นหามีไวยากรณ์จึงจำเป็นต้องทำการวิเคราะห์ไวยากรณ์การวิเคราะห์ไวยากรณ์และการประมวลผลภาษา
1. การวิเคราะห์คำศัพท์ส่วนใหญ่ใช้เพื่อระบุคำและคำหลัก
ดังในตัวอย่างข้างต้นหลังจากการวิเคราะห์คำศัพท์คำนี้รวมถึง Lucene, Learning, Hadoop และคำหลักรวมถึงและไม่ใช่
หากพบคำหลักที่ผิดกฎหมายในการวิเคราะห์คำศัพท์ข้อผิดพลาดจะเกิดขึ้น ตัวอย่างเช่น Lucene AMD เรียนรู้ที่ AMD มีส่วนร่วมในการสอบถามเป็นคำธรรมดาเนื่องจากการสะกดผิดและ
2. การวิเคราะห์ไวยากรณ์ส่วนใหญ่จะสร้างแผนผังไวยากรณ์ตามกฎไวยากรณ์ของคำสั่งค้นหา
หากคุณพบว่าคำสั่ง Query ไม่เป็นไปตามกฎไวยากรณ์จะมีการรายงานข้อผิดพลาด หาก Lucene ไม่ได้เรียนรู้ข้อผิดพลาดจะเกิดขึ้น
ในตัวอย่างข้างต้นต้นไม้ไวยากรณ์ที่เกิดขึ้นโดยลูซีนและเรียนรู้ว่าไม่ใช่ Hadoop มีดังนี้:
3. การประมวลผลภาษาเกือบจะเหมือนกับการประมวลผลภาษาระหว่างการจัดทำดัชนี
ตัวอย่างเช่นการเรียนรู้จะได้เรียนรู้ ฯลฯ
หลังจากขั้นตอนที่สองเราได้รับแผนผังไวยากรณ์ที่ประมวลผลภาษา
ขั้นตอนที่ 3: ค้นหาดัชนีและรับเอกสารที่ตรงกับแผนผังไวยากรณ์
ขั้นตอนนี้แบ่งออกเป็นหลายขั้นตอนเล็ก ๆ :
1. อันดับแรกในตารางดัชนีย้อนกลับค้นหารายการลิงค์เอกสารที่มี Lucene เรียนรู้และ Hadoop
2. ประการที่สองรวมรายการที่เชื่อมโยงที่มี Lucene และเรียนรู้ที่จะได้รับเอกสารที่เชื่อมโยงกับเอกสารที่มีทั้ง Lucene และเรียนรู้
3 จากนั้นดำเนินการแตกต่างระหว่างรายการที่เชื่อมโยงนี้และรายการที่เชื่อมโยงกับเอกสารของ Hadoop และลบเอกสารที่มี Hadoop เพื่อรับเอกสารที่เชื่อมโยงเอกสารที่มีทั้ง Lucene และเรียนรู้และไม่มี Hadoop
4. รายการลิงค์เอกสารนี้เป็นเอกสารที่เรากำลังมองหา
ขั้นตอนที่ 4: เรียงลำดับผลลัพธ์ตามความสัมพันธ์ระหว่างเอกสารที่ได้รับและคำสั่ง Query
แม้ว่าในขั้นตอนก่อนหน้านี้เราได้รับเอกสารที่ต้องการผลลัพธ์การสืบค้นควรจัดเรียงตามความสัมพันธ์กับคำสั่งค้นหาและยิ่งมีความเกี่ยวข้องมากเท่าไหร่
วิธีการคำนวณความสัมพันธ์ระหว่างเอกสารและคำสั่งค้นหา?
เป็นการดีกว่าที่จะพิจารณาคำสั่งค้นหาเป็นเอกสารสั้น ๆ และให้คะแนนความเกี่ยวข้องระหว่างเอกสาร หากความสัมพันธ์กับคะแนนสูงเป็นสิ่งที่ดีควรจัดอันดับก่อน
แล้วคุณให้คะแนนความสัมพันธ์ระหว่างเอกสารอย่างไร?
นี่ไม่ใช่เรื่องง่าย ก่อนอื่นมาดูการตัดสินความสัมพันธ์ระหว่างผู้คน
ก่อนอื่น เมื่อมองดูบุคคลมักจะมี องค์ประกอบ มากมายเช่นบุคลิกภาพความเชื่องานอดิเรกเสื้อผ้าความสูงความอ้วนและความผอม
ประการที่สอง สำหรับความสัมพันธ์ระหว่างผู้คน องค์ประกอบต่าง ๆ มีความสำคัญแตกต่างกัน ตัวละครความเชื่อและงานอดิเรกอาจมีความสำคัญมากกว่า เสื้อผ้าความสูงและความอ้วนอาจไม่สำคัญ ดังนั้นคนที่มีบุคลิกความเชื่อและงานอดิเรกที่เหมือนกันหรือคล้ายคลึงกันมีแนวโน้มที่จะกลายเป็นเพื่อนที่ดี แต่คนที่มีเสื้อผ้าความสูงและความอ้วนต่างกันและความผอมบางก็สามารถกลายเป็นเพื่อนที่ดีได้
ดังนั้นเมื่อตัดสินความสัมพันธ์ระหว่างผู้คน เราต้องค้นหาว่าองค์ประกอบใดที่สำคัญที่สุดต่อความสัมพันธ์ระหว่างผู้คน เช่นบุคลิกภาพความเชื่อและงานอดิเรก ประการที่สองเราต้องตัดสินความสัมพันธ์ระหว่างองค์ประกอบเหล่านี้ของคนสองคน เช่นคนหนึ่งมีบุคลิกที่ร่าเริงอีกฝ่ายมีบุคลิกที่เปิดเผยคนหนึ่งเชื่อในศาสนาพุทธอีกคนหนึ่งเชื่อในพระเจ้าคนหนึ่งชอบเล่นบาสเก็ตบอล เราพบว่าทั้งคู่มีความเป็นบวกมากในแง่ของบุคลิกภาพชนิดในแง่ของศรัทธาและกีฬาในแง่ของงานอดิเรกดังนั้นความสัมพันธ์ระหว่างพวกเขาควรจะดีมาก
มาดูความสัมพันธ์ระหว่าง บริษัท กันเถอะ
ก่อนอื่น ให้ดูที่ บริษัท ซึ่งประกอบด้วยคนจำนวนมากเช่นผู้จัดการทั่วไปผู้จัดการหัวหน้าเจ้าหน้าที่เทคนิคพนักงานสามัญเจ้าหน้าที่รักษาความปลอดภัย Doormen ฯลฯ
ประการที่สองคนที่แตกต่างกันมีความสำคัญที่แตกต่างกันสำหรับความสัมพันธ์ระหว่าง บริษัท ผู้จัดการทั่วไปผู้จัดการและหัวหน้าเจ้าหน้าที่ด้านเทคนิคอาจมีความสำคัญมากกว่าและพนักงานทั่วไปเจ้าหน้าที่รักษาความปลอดภัยและ Doormen อาจมีความสำคัญน้อยกว่า ดังนั้นหากความสัมพันธ์ระหว่างผู้จัดการทั่วไปผู้จัดการและหัวหน้าเจ้าหน้าที่เทคโนโลยีของสอง บริษัท นั้นค่อนข้างดีทั้งสอง บริษัท มีแนวโน้มที่จะมีความสัมพันธ์ที่ดีขึ้น อย่างไรก็ตามแม้ว่าพนักงานธรรมดาจะมีความเกลียดชังอย่างลึกซึ้งกับพนักงานสามัญของ บริษัท อื่น แต่ก็ไม่น่าเป็นไปได้ที่จะส่งผลกระทบต่อความสัมพันธ์ระหว่างทั้งสอง บริษัท
ดังนั้นเพื่อตัดสินความสัมพันธ์ระหว่าง บริษัท เราต้องค้นหาว่าใครเป็นคนสำคัญที่สุดต่อความสัมพันธ์ระหว่าง บริษัท เช่นผู้จัดการทั่วไปผู้จัดการและหัวหน้าเจ้าหน้าที่เทคโนโลยี ประการที่สองเราจำเป็นต้องตัดสินความสัมพันธ์ระหว่างคนเหล่านี้ ซึ่งไม่ดีเท่าผู้จัดการทั่วไปของทั้งสอง บริษัท ผู้จัดการเป็นเพื่อนชาวบ้านและเจ้าหน้าที่เทคโนโลยีหัวหน้าเป็นหุ้นส่วนผู้ประกอบการ เราพบว่าความสัมพันธ์ระหว่างทั้งสอง บริษัท นั้นดีไม่ว่าจะเป็นผู้จัดการทั่วไปผู้จัดการหรือหัวหน้าเจ้าหน้าที่เทคโนโลยีเป็นสิ่งที่ดีดังนั้นความสัมพันธ์ระหว่างทั้งสอง บริษัท ควรจะดี
หลังจากวิเคราะห์ความสัมพันธ์ทั้งสองลองมาดูกันว่า จะตัดสินความสัมพันธ์ระหว่างเอกสารได้อย่างไร
ก่อนอื่นเอกสารประกอบด้วยคำหลายคำ (คำศัพท์) เช่นการค้นหา, ลูซีน, ข้อความเต็ม, สิ่งนี้, อะไร, อะไร, ฯลฯ
ประการที่สองคำที่แตกต่างมีความสำคัญแตกต่างกันสำหรับความสัมพันธ์ระหว่างเอกสาร ตัวอย่างเช่นสำหรับเอกสารนี้การค้นหาลูซีนข้อความเต็มมีความสำคัญค่อนข้างนี่คือสิ่งที่อาจไม่สำคัญ ดังนั้นหากเอกสารทั้งสองมีการค้นหา, Lucene และ FullText ความสัมพันธ์ระหว่างเอกสารทั้งสองนี้จะดีกว่า อย่างไรก็ตามแม้ว่าเอกสารฉบับหนึ่งจะมีสิ่งนี้ A, อะไรและเอกสารอื่น ๆ ไม่มีสิ่งนี้, A, อะไร, มันไม่สามารถส่งผลกระทบต่อความสัมพันธ์ระหว่างเอกสารทั้งสอง
ดังนั้นเพื่อตัดสินความสัมพันธ์ระหว่างเอกสารก่อนอื่นให้ค้นหาคำว่าคำใด (คำ) ที่สำคัญที่สุดสำหรับความสัมพันธ์ระหว่างเอกสารเช่นการค้นหา, Lucene, FullText จากนั้นตัดสินความสัมพันธ์ระหว่างคำเหล่านี้ (คำศัพท์)
กระบวนการค้นหาความสำคัญของคำ (คำ) ไปยังเอกสารเรียกว่ากระบวนการคำนวณน้ำหนักของคำ
มีสองพารามิเตอร์ในการคำนวณน้ำหนักคำ ข้อแรกคือคำ (คำ) และคำที่สองคือเอกสาร (เอกสาร)
น้ำหนักของคำบ่งบอกถึงความสำคัญของคำนี้ในเอกสารนี้ คำที่สำคัญยิ่งกว่านั้นมีน้ำหนักมากขึ้น (น้ำหนักระยะเวลา) และดังนั้นจึงจะมีบทบาทมากขึ้นในการคำนวณความสัมพันธ์ระหว่างเอกสาร
กระบวนการตัดสินความสัมพันธ์ระหว่างคำ (คำ) และทำให้ได้รับความสัมพันธ์ของเอกสารใช้ในการใช้อัลกอริทึมโมเดลพื้นที่เวกเตอร์ (โมเดลพื้นที่เวกเตอร์)
มาวิเคราะห์กระบวนการทั้งสองนี้อย่างรอบคอบ:
1. กระบวนการคำนวณน้ำหนัก (น้ำหนักระยะเวลา)
มีสองปัจจัยหลักที่มีอิทธิพลต่อความสำคัญของคำ (คำ) ในเอกสาร:
•คำศัพท์ความถี่ (TF): นั่นคือคำนี้กี่ครั้งที่ปรากฏในเอกสารนี้ ยิ่ง TF ยิ่งใหญ่เท่าไหร่ก็ยิ่งมีความสำคัญมากขึ้นเท่านั้น
•ความถี่เอกสาร (DF): นั่นคือจำนวนเอกสารที่มีคำศัพท์สอง ยิ่ง DF มีขนาดใหญ่ขึ้นเท่าไหร่ก็ยิ่งมีความสำคัญน้อยลงเท่านั้น
เข้าใจง่าย? ยิ่งคำว่าคำ (คำ) ปรากฏในเอกสารมากเท่าไหร่ก็ยิ่งมีความสำคัญต่อเอกสาร ตัวอย่างเช่นคำว่า "การค้นหา" ปรากฏขึ้นหลายครั้งในเอกสารนี้ซึ่งหมายความว่าเอกสารนี้ส่วนใหญ่พูดถึงด้านนี้ อย่างไรก็ตามในเอกสารภาษาอังกฤษหากปรากฏบ่อยขึ้นมันหมายความว่ามันสำคัญกว่าหรือไม่? ไม่นี่คือการปรับโดยปัจจัยที่สอง ปัจจัยที่สองแสดงให้เห็นว่ายิ่งเอกสารมีคำนี้มากขึ้น (คำ) หมายความว่าคำ (คำ) นั้นธรรมดาเกินไปและไม่เพียงพอที่จะแยกแยะเอกสารเหล่านี้ดังนั้นจึงมีความสำคัญน้อยกว่า
นี่คือเทคโนโลยีที่โปรแกรมโปรแกรมเมอร์เรียนรู้ สำหรับโปรแกรมเมอร์ของตัวเองยิ่งพวกเขามีความเชี่ยวชาญด้านเทคโนโลยีนี้มากเท่าไหร่ก็ยิ่งดีขึ้นเท่านั้น อย่างไรก็ตามสำหรับโปรแกรมเมอร์ทั้งหมดคนที่น้อยกว่าที่เข้าใจเทคโนโลยีนี้ดีกว่า (คนน้อยกว่าที่เข้าใจมัน) และยิ่งพวกเขามีการแข่งขันมากขึ้นในการหางาน นี่คือเหตุผลว่าทำไมคุณค่าของมนุษย์จึงอยู่ในสภาพที่ไม่สามารถสูญเสียได้
เมื่อเข้าใจความจริงลองมาดูสูตร:
นี่เป็นเพียงการใช้งานโดยทั่วไปของสูตรการคำนวณน้ำหนักคำ ผู้ที่ใช้ระบบดึงข้อความแบบเต็มจะมีการใช้งานของตัวเองและลูซีนแตกต่างจากสิ่งนี้เล็กน้อย
2. กระบวนการตัดสินความสัมพันธ์ระหว่างคำว่าและการได้รับความสัมพันธ์ของเอกสารนั่นคืออัลกอริทึม (VSM) ของแบบจำลองพื้นที่เวกเตอร์
เราถือว่าเอกสารเป็นชุดของคำ (คำ) แต่ละคำ (คำ) มีน้ำหนัก (น้ำหนักคำศัพท์) และคำที่แตกต่างกัน (คำ) มีผลต่อการคำนวณการให้คะแนนของความเกี่ยวข้องของเอกสารตามน้ำหนักของตนเองในเอกสาร
ดังนั้นเราจึงพิจารณาน้ำหนักของคำในเอกสารนี้เป็นเวกเตอร์
document = {term1, term2, …, term n}
Document Vector = {weight1, weight2, ... , น้ำหนัก n}
ในทำนองเดียวกันเราถือว่าคำสั่งแบบสอบถามเป็นเอกสารง่ายๆและยังแสดงเป็นเวกเตอร์
query = {term1, term 2, …, term n}
แบบสอบถามเวกเตอร์ = {weight1, weight2, ... , น้ำหนัก n}
เราใส่เวกเตอร์เอกสารที่ค้นหาทั้งหมดและเวกเตอร์แบบสอบถามลงในพื้นที่ N มิติและแต่ละคำ (คำ) เป็นมิติเดียว
ดังที่แสดงในภาพ:
เราเชื่อว่ายิ่งมุมเล็ก ๆ ระหว่างเวกเตอร์สองตัวเท่าไหร่ก็ยิ่งมีความสัมพันธ์มากขึ้นเท่านั้น
ดังนั้นเราจึงคำนวณค่าโคไซน์ของมุมที่รวมเป็นคะแนนความสัมพันธ์ ยิ่งมุมที่เล็กลงเท่าใดค่าโคไซน์ก็ยิ่งมีคะแนนมากขึ้นและยิ่งมีความสัมพันธ์มากขึ้นเท่านั้น
บางคนอาจถามว่าคำสั่งแบบสอบถามโดยทั่วไปสั้นมากและมีคำน้อยมาก (คำ) ดังนั้นขนาดของเวกเตอร์แบบสอบถามมีขนาดเล็กมากในขณะที่เอกสารมีความยาวมากมีหลายคำ (คำ) และขนาดของเวกเตอร์เอกสารมีขนาดใหญ่มาก ทำไมขนาดของทั้งสองในกราฟ N ของคุณ
ที่นี่เนื่องจากคุณต้องการวางไว้ในพื้นที่เวกเตอร์เดียวกันขนาดธรรมชาติจะเหมือนกัน แตกต่างกันในเวลาเดียวกันรับสหภาพของทั้งสอง หากไม่มีคำ (คำ) น้ำหนัก (น้ำหนักคำ) คือ 0
สูตรการให้คะแนนความสัมพันธ์มีดังนี้:
ตัวอย่างเช่นมีคำศัพท์ 11 คำในคำสั่ง Query และมีการค้นหาเอกสารสามฉบับ น้ำหนักที่เกี่ยวข้อง (น้ำหนักคำศัพท์) มีดังนี้
T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | T11 | |
D1 | 0 | 0 | .477 | 0 | .477 | .176 | 0 | 0 | 0 | .176 | 0 |
D2 | 0 | .176 | 0 | .477 | 0 | 0 | 0 | 0 | .954 | 0 | .176 |
D3 | 0 | .176 | 0 | 0 | 0 | .176 | 0 | 0 | 0 | .176 | .176 |
ถาม | 0 | 0 | 0 | 0 | 0 | .176 | 0 | 0 | .477 | 0 | .176 |
ดังนั้นคะแนนความสัมพันธ์ระหว่างเอกสารทั้งสามและคำสั่งค้นหาจะคำนวณเป็น:
ดังนั้นเอกสารที่ 2 มีความสัมพันธ์สูงสุดผลตอบแทนแรกตามด้วยเอกสาร 1 และในที่สุดเอกสาร 3
จนถึงตอนนี้เราสามารถค้นหาเอกสารที่เราต้องการได้มากที่สุด
ต้องพูดมากฉันยังไม่ได้เข้ามาในลูซีน แต่มันเป็นเพียงทฤษฎีพื้นฐานในการดึงข้อมูล อย่างไรก็ตามหลังจากที่เราดูลูซีนเราจะพบว่าลูซีนเป็นแนวปฏิบัติพื้นฐานของทฤษฎีพื้นฐานนี้ ดังนั้นในบทความที่วิเคราะห์ลูซีนเรามักจะเห็นการประยุกต์ใช้ทฤษฎีข้างต้นในลูซีน
ก่อนเข้าสู่ Lucene บทสรุปของการสร้างดัชนีและกระบวนการค้นหาข้างต้นดังแสดงในรูป:
รูปนี้หมายถึงบทความ "Lucene เครื่องมือค้นหาข้อความแบบเต็มของรหัสโอเพนซอร์ส" ใน http://www.lucene.com.cn/about.htm
1. กระบวนการจัดทำดัชนี:
1) มีชุดไฟล์ที่จัดทำดัชนี
2) ไฟล์ที่จัดทำดัชนีได้รับการวิเคราะห์แบบไวยากรณ์และการประมวลผลภาษาเพื่อสร้างชุดคำ (คำ)
3) สร้างตารางพจนานุกรมและดัชนีย้อนกลับผ่านการจัดทำดัชนี
4) เขียนดัชนีไปยังฮาร์ดดิสก์ผ่านที่เก็บดัชนี
2. กระบวนการค้นหา:
a) คำสั่งค้นหาอินพุตผู้ใช้
b) ชุดของคำ (คำ) ได้รับจากการวิเคราะห์ไวยากรณ์และการวิเคราะห์ภาษาของคำสั่งค้นหา
c) รับต้นไม้แบบสอบถามผ่านการวิเคราะห์ไวยากรณ์
d) อ่านดัชนีลงในหน่วยความจำผ่านที่เก็บดัชนี
e) ใช้ทรีแบบสอบถามเพื่อค้นหาดัชนีเพื่อรับรายการลิงค์เอกสารสำหรับแต่ละคำ (คำ) ส่งรายการลิงค์เอกสารและรับเอกสารผลลัพธ์
f) เรียงลำดับเอกสารผลลัพธ์ที่ค้นหาไปยังความเกี่ยวข้องของแบบสอบถาม
g) ส่งคืนผลลัพธ์การสืบค้นไปยังผู้ใช้
2. เรียงลำดับพจนานุกรมตามตัวอักษร
ภาคเรียน | รหัสเอกสาร |
อนุญาต | 1 |
อนุญาต | 1 |
อนุญาต | 2 |
เบียร์ | 1 |
ดื่ม | 1 |
ดื่ม | 2 |
หา | 2 |
เพื่อน | 1 |
เพื่อน | 2 |
ไป | 1 |
ไป | 2 |
ของเขา | 2 |
เจอร์รี่ | 2 |
ของฉัน | 2 |
โรงเรียน | 2 |
ดู | 2 |
นักเรียน | 1 |
นักเรียน | 2 |
ของพวกเขา | 1 |
พวกเขา | 2 |
3. รวมคำเดียวกัน (คำ) ลงในรายการลิงก์ย้อนกลับเอกสาร (รายการโพสต์)
ในตารางนี้มีคำจำกัดความหลายประการ: