Lucene - คู่มือฉบับย่อ
Lucene เป็น Java ที่เรียบง่าย แต่ทรงพลัง Searchห้องสมุด. สามารถใช้ในแอปพลิเคชันใดก็ได้เพื่อเพิ่มความสามารถในการค้นหา Lucene เป็นโครงการโอเพ่นซอร์ส สามารถปรับขนาดได้ ไลบรารีประสิทธิภาพสูงนี้ใช้ในการจัดทำดัชนีและค้นหาข้อความแทบทุกประเภท ไลบรารี Lucene มีการดำเนินการหลักที่จำเป็นสำหรับแอปพลิเคชันการค้นหาใด ๆ การสร้างดัชนีและการค้นหา
Search Application ทำงานอย่างไร
แอปพลิเคชันการค้นหาดำเนินการทั้งหมดหรือบางส่วนต่อไปนี้ -
ขั้นตอน | หัวข้อ | คำอธิบาย |
---|---|---|
1 | Acquire Raw Content |
ขั้นตอนแรกของแอปพลิเคชันการค้นหาคือการรวบรวมเนื้อหาเป้าหมายที่จะดำเนินการแอปพลิเคชันการค้นหา |
2 | Build the document |
ขั้นตอนต่อไปคือการสร้างเอกสารจากเนื้อหาดิบซึ่งแอปพลิเคชันการค้นหาสามารถเข้าใจและตีความได้ง่าย |
3 | Analyze the document |
ก่อนที่กระบวนการจัดทำดัชนีจะเริ่มขึ้นเอกสารจะถูกวิเคราะห์ว่าส่วนใดของข้อความที่เป็นตัวเลือกที่จะจัดทำดัชนี กระบวนการนี้เป็นที่ที่เอกสารจะถูกวิเคราะห์ |
4 | Indexing the document |
เมื่อสร้างและวิเคราะห์เอกสารแล้วขั้นตอนต่อไปคือการจัดทำดัชนีเพื่อให้สามารถดึงเอกสารนี้โดยใช้คีย์บางอย่างแทนที่จะเป็นเนื้อหาทั้งหมดของเอกสาร กระบวนการจัดทำดัชนีจะคล้ายกับดัชนีในตอนท้ายของหนังสือที่มีการแสดงคำทั่วไปพร้อมหมายเลขหน้าเพื่อให้สามารถติดตามคำเหล่านี้ได้อย่างรวดเร็วแทนที่จะค้นหาหนังสือทั้งเล่ม |
5 | User Interface for Search |
เมื่อฐานข้อมูลของดัชนีพร้อมแล้วแอปพลิเคชันสามารถทำการค้นหาได้ เพื่ออำนวยความสะดวกให้กับผู้ใช้ในการค้นหาแอปพลิเคชันจะต้องให้ผู้ใช้a mean หรือ a user interface ที่ผู้ใช้สามารถป้อนข้อความและเริ่มกระบวนการค้นหา |
6 | Build Query |
เมื่อผู้ใช้ร้องขอเพื่อค้นหาข้อความแอปพลิเคชันควรเตรียมวัตถุแบบสอบถามโดยใช้ข้อความนั้นซึ่งสามารถใช้เพื่อสอบถามฐานข้อมูลดัชนีเพื่อรับรายละเอียดที่เกี่ยวข้อง |
7 | Search Query |
การใช้วัตถุแบบสอบถามฐานข้อมูลดัชนีจะถูกตรวจสอบเพื่อรับรายละเอียดที่เกี่ยวข้องและเอกสารเนื้อหา |
8 | Render Results |
เมื่อได้รับผลลัพธ์แล้วแอปพลิเคชันควรตัดสินใจว่าจะแสดงผลลัพธ์ต่อผู้ใช้โดยใช้อินเทอร์เฟซผู้ใช้อย่างไร ข้อมูลที่จะแสดงในการดูครั้งแรกและอื่น ๆ |
นอกเหนือจากการดำเนินการขั้นพื้นฐานเหล่านี้แล้วแอปพลิเคชันการค้นหายังสามารถให้ administration user interfaceและช่วยผู้ดูแลระบบของแอปพลิเคชันในการควบคุมระดับการค้นหาตามโปรไฟล์ผู้ใช้ การวิเคราะห์ผลการค้นหาเป็นอีกหนึ่งสิ่งที่สำคัญและก้าวหน้าของแอปพลิเคชันการค้นหาใด ๆ
บทบาทของ Lucene ในแอปพลิเคชันการค้นหา
Lucene มีบทบาทในขั้นตอนที่ 2 ถึงขั้นตอนที่ 7 ที่กล่าวถึงข้างต้นและจัดให้มีชั้นเรียนเพื่อดำเนินการที่จำเป็น โดยสรุป Lucene เป็นหัวใจของแอปพลิเคชันการค้นหาและให้การดำเนินการที่สำคัญเกี่ยวกับการจัดทำดัชนีและการค้นหา การรับเนื้อหาและการแสดงผลลัพธ์จะเหลือไว้ให้ส่วนของแอปพลิเคชันจัดการ
ในบทถัดไปเราจะดำเนินการแอปพลิเคชันการค้นหาอย่างง่ายโดยใช้ไลบรารี Lucene Search
บทช่วยสอนนี้จะแนะนำคุณเกี่ยวกับวิธีเตรียมสภาพแวดล้อมการพัฒนาเพื่อเริ่มงานของคุณกับ Spring Framework บทช่วยสอนนี้จะสอนวิธีตั้งค่า JDK, Tomcat และ Eclipse บนเครื่องของคุณก่อนที่คุณจะตั้งค่า Spring Framework -
ขั้นตอนที่ 1 - การตั้งค่า Java Development Kit (JDK)
คุณสามารถดาวน์โหลด SDK เวอร์ชันล่าสุดจากเว็บไซต์ Java ของออราเคิล: Java SE ดาวน์โหลด คุณจะพบคำแนะนำในการติดตั้ง JDK ในไฟล์ที่ดาวน์โหลด ทำตามคำแนะนำที่กำหนดเพื่อติดตั้งและกำหนดค่าการตั้งค่า สุดท้ายตั้งค่าตัวแปรสภาพแวดล้อม PATH และ JAVA_HOME เพื่ออ้างถึงไดเร็กทอรีที่มี Java และ javac โดยทั่วไปคือ java_install_dir / bin และ java_install_dir ตามลำดับ
หากคุณใช้ Windows และติดตั้ง JDK ใน C: \ jdk1.6.0_15 คุณจะต้องใส่บรรทัดต่อไปนี้ในไฟล์ C: \ autoexec.bat ของคุณ
set PATH = C:\jdk1.6.0_15\bin;%PATH%
set JAVA_HOME = C:\jdk1.6.0_15
หรือใน Windows NT / 2000 / XP คุณสามารถคลิกขวาที่ My Computerเลือก Propertiesแล้ว Advancedแล้ว Environment Variables. จากนั้นคุณจะอัปเดตไฟล์PATH ค่าและกด OK ปุ่ม.
ใน Unix (Solaris, Linux ฯลฯ ) หากติดตั้ง SDK ใน /usr/local/jdk1.6.0_15 และคุณใช้ C เชลล์คุณจะใส่สิ่งต่อไปนี้ลงในไฟล์. cshrc ของคุณ
setenv PATH /usr/local/jdk1.6.0_15/bin:$PATH
setenv JAVA_HOME /usr/local/jdk1.6.0_15
หรือหากคุณใช้ไฟล์ Integrated Development Environment (IDE) เช่น Borland JBuilder, Eclipse, IntelliJ IDEA หรือ Sun ONE Studio ให้คอมไพล์และรันโปรแกรมง่ายๆเพื่อยืนยันว่า IDE รู้ตำแหน่งที่คุณติดตั้ง Java หรือทำการตั้งค่าที่เหมาะสมตามที่ระบุไว้ในเอกสารของ IDE
ขั้นตอนที่ 2 - การตั้งค่า Eclipse IDE
ตัวอย่างทั้งหมดในบทช่วยสอนนี้เขียนขึ้นโดยใช้ Eclipse IDE. ดังนั้นฉันขอแนะนำให้คุณติดตั้ง Eclipse เวอร์ชันล่าสุดในเครื่องของคุณ
ในการติดตั้ง Eclipse IDE ให้ดาวน์โหลดไบนารี Eclipse ล่าสุดจาก https://www.eclipse.org/downloads/. เมื่อคุณดาวน์โหลดการติดตั้งแล้วให้แกะการแจกแจงไบนารีในตำแหน่งที่สะดวก ตัวอย่างเช่นในC:\eclipse on windows, หรือ /usr/local/eclipse on Linux/Unix และสุดท้ายตั้งค่าตัวแปร PATH ให้เหมาะสม
Eclipse สามารถเริ่มต้นได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง windows หรือคุณสามารถดับเบิลคลิกที่ eclipse.exe
%C:\eclipse\eclipse.exe
Eclipse สามารถเริ่มต้นได้โดยดำเนินการคำสั่งต่อไปนี้บนเครื่อง Unix (Solaris, Linux และอื่น ๆ ) -
$/usr/local/eclipse/eclipse
หลังจากเริ่มต้นสำเร็จควรแสดงผลลัพธ์ต่อไปนี้ -

ขั้นตอนที่ 3 - ตั้งค่าไลบรารีของ Lucene Framework
หากการเริ่มต้นทำงานสำเร็จคุณสามารถดำเนินการตั้งค่าเฟรมเวิร์ก Lucene ของคุณได้ ต่อไปนี้เป็นขั้นตอนง่ายๆในการดาวน์โหลดและติดตั้งเฟรมเวิร์กบนเครื่องของคุณ
https://archive.apache.org/dist/lucene/java/3.6.2/
เลือกว่าคุณต้องการติดตั้ง Lucene บน Windows หรือ Unix จากนั้นดำเนินการในขั้นตอนต่อไปเพื่อดาวน์โหลดไฟล์. zip สำหรับ windows และไฟล์. tz สำหรับ Unix
ดาวน์โหลดเวอร์ชันไบนารีของเฟรมเวิร์ก Lucene ที่เหมาะสมจาก https://archive.apache.org/dist/lucene/java/.
ในขณะที่เขียนบทช่วยสอนนี้ฉันดาวน์โหลด lucene-3.6.2.zip บนเครื่อง Windows ของฉันและเมื่อคุณเปิดเครื่องรูดไฟล์ที่ดาวน์โหลดมามันจะให้โครงสร้างไดเรกทอรีภายใน C: \ lucene-3.6.2 ดังต่อไปนี้

คุณจะพบไลบรารี Lucene ทั้งหมดในไดเร็กทอรี C:\lucene-3.6.2. ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าตัวแปร CLASSPATH บนไดเร็กทอรีนี้อย่างถูกต้องมิฉะนั้นคุณจะประสบปัญหาขณะเรียกใช้แอปพลิเคชันของคุณ หากคุณใช้ Eclipse คุณไม่จำเป็นต้องตั้งค่า CLASSPATH เนื่องจากการตั้งค่าทั้งหมดจะดำเนินการผ่าน Eclipse
เมื่อคุณทำขั้นตอนสุดท้ายนี้เสร็จแล้วคุณก็พร้อมที่จะดำเนินการต่อสำหรับ Lucene Example แรกของคุณซึ่งคุณจะเห็นในบทถัดไป
ในบทนี้เราจะเรียนรู้การเขียนโปรแกรมจริงด้วย Lucene Framework ก่อนที่คุณจะเริ่มเขียนตัวอย่างแรกโดยใช้เฟรมเวิร์กของ Lucene คุณต้องแน่ใจว่าคุณได้ตั้งค่าสภาพแวดล้อม Lucene ของคุณอย่างถูกต้องตามที่อธิบายไว้ในบทช่วยสอนLucene - Environment Setup ขอแนะนำให้คุณมีความรู้ในการทำงานของ Eclipse IDE
ตอนนี้ให้เราดำเนินการต่อโดยเขียนแอปพลิเคชันการค้นหาอย่างง่ายซึ่งจะพิมพ์จำนวนผลการค้นหาที่พบ นอกจากนี้เรายังจะเห็นรายการดัชนีที่สร้างขึ้นในระหว่างกระบวนการนี้
ขั้นตอนที่ 1 - สร้างโครงการ Java
ขั้นตอนแรกคือการสร้าง Java Project อย่างง่ายโดยใช้ Eclipse IDE ทำตามตัวเลือกFile > New -> Project และสุดท้ายเลือก Java Projectตัวช่วยสร้างจากรายการตัวช่วยสร้าง ตอนนี้ตั้งชื่อโครงการของคุณเป็นLuceneFirstApplication โดยใช้หน้าต่างตัวช่วยสร้างดังนี้ -

เมื่อสร้างโครงการของคุณสำเร็จคุณจะมีเนื้อหาต่อไปนี้ในไฟล์ Project Explorer -

ขั้นตอนที่ 2 - เพิ่มไลบรารีที่ต้องการ
ให้เราเพิ่มไลบรารี Lucene core Framework ในโครงการของเรา ในการดำเนินการนี้ให้คลิกขวาที่ชื่อโครงการของคุณLuceneFirstApplication จากนั้นทำตามตัวเลือกต่อไปนี้ที่มีอยู่ในเมนูบริบท: Build Path -> Configure Build Path เพื่อแสดงหน้าต่าง Java Build Path ดังนี้ -

ตอนนี้ใช้ Add External JARs ปุ่มอยู่ใต้ Libraries เพื่อเพิ่ม JAR หลักต่อไปนี้จากไดเร็กทอรีการติดตั้ง Lucene -
- lucene-core-3.6.2
ขั้นตอนที่ 3 - สร้างไฟล์ต้นฉบับ
ตอนนี้ให้เราสร้างไฟล์ต้นฉบับจริงภายใต้ไฟล์ LuceneFirstApplicationโครงการ. ก่อนอื่นเราต้องสร้างแพ็คเกจที่เรียกว่าcom.tutorialspoint.lucene. ในการดำเนินการนี้ให้คลิกขวาที่ src ในส่วน package explorer และทำตามตัวเลือก: New -> Package.
ต่อไปเราจะสร้าง LuceneTester.java และคลาส Java อื่น ๆ ภายใต้ไฟล์ com.tutorialspoint.lucene แพ็คเกจ
LuceneConstants.java
คลาสนี้ใช้เพื่อระบุค่าคงที่ต่างๆที่จะใช้กับแอปพลิเคชันตัวอย่าง
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
TextFileFilter.java
คลาสนี้ใช้เป็นไฟล์ .txt file กรอง.
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
public class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}
Indexer.java
คลาสนี้ใช้เพื่อจัดทำดัชนีข้อมูลดิบเพื่อให้เราสามารถค้นหาได้โดยใช้ไลบรารี Lucene
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Indexer {
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException {
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
public void close() throws CorruptIndexException, IOException {
writer.close();
}
private Document getDocument(File file) throws IOException {
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS, new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME,
file.getName(),Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH,
file.getCanonicalPath(),Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
public int createIndex(String dataDirPath, FileFilter filter)
throws IOException {
//get all files in the data directory
File[] files = new File(dataDirPath).listFiles();
for (File file : files) {
if(!file.isDirectory()
&& !file.isHidden()
&& file.exists()
&& file.canRead()
&& filter.accept(file)
){
indexFile(file);
}
}
return writer.numDocs();
}
}
Searcher.java
คลาสนี้ใช้เพื่อค้นหาดัชนีที่สร้างโดย Indexer เพื่อค้นหาเนื้อหาที่ร้องขอ
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Searcher {
IndexSearcher indexSearcher;
QueryParser queryParser;
Query query;
public Searcher(String indexDirectoryPath)
throws IOException {
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
public TopDocs search( String searchQuery)
throws IOException, ParseException {
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
public void close() throws IOException {
indexSearcher.close();
}
}
LuceneTester.java
คลาสนี้ใช้เพื่อทดสอบความสามารถในการสร้างดัชนีและการค้นหาของไลบรารีลูซีน
package com.tutorialspoint.lucene;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Indexer indexer;
Searcher searcher;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.createIndex();
tester.search("Mohan");
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
private void createIndex() throws IOException {
indexer = new Indexer(indexDir);
int numIndexed;
long startTime = System.currentTimeMillis();
numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
long endTime = System.currentTimeMillis();
indexer.close();
System.out.println(numIndexed+" File indexed, time taken: "
+(endTime-startTime)+" ms");
}
private void search(String searchQuery) throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
TopDocs hits = searcher.search(searchQuery);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime));
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.println("File: "
+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
}
ขั้นตอนที่ 4 - การสร้างไดเร็กทอรี Data & Index
เราใช้ไฟล์ข้อความ 10 ไฟล์จาก record1.txt ถึง record10.txt ที่มีชื่อและรายละเอียดอื่น ๆ ของนักเรียนและใส่ไว้ในไดเร็กทอรี E:\Lucene\Data. ข้อมูลการทดสอบ ควรสร้างพา ธ ไดเร็กทอรีดัชนีเป็นE:\Lucene\Index. หลังจากรันโปรแกรมนี้คุณจะเห็นรายการไฟล์ดัชนีที่สร้างขึ้นในโฟลเดอร์นั้น
ขั้นตอนที่ 5 - เรียกใช้โปรแกรม
เมื่อคุณสร้างซอร์สเสร็จแล้วข้อมูลดิบไดเร็กทอรีข้อมูลและไดเร็กทอรีดัชนีคุณก็พร้อมสำหรับการคอมไพล์และรันโปรแกรมของคุณ ในการดำเนินการนี้ให้เก็บไฟล์LuceneTester.Java แท็บไฟล์ทำงานอยู่และใช้ไฟล์ Run ตัวเลือกที่มีอยู่ใน Eclipse IDE หรือใช้ Ctrl + F11 เพื่อรวบรวมและเรียกใช้ไฟล์ LuceneTesterใบสมัคร หากแอปพลิเคชันทำงานสำเร็จแอปพลิเคชันจะพิมพ์ข้อความต่อไปนี้ในคอนโซลของ Eclipse IDE -
Indexing E:\Lucene\Data\record1.txt
Indexing E:\Lucene\Data\record10.txt
Indexing E:\Lucene\Data\record2.txt
Indexing E:\Lucene\Data\record3.txt
Indexing E:\Lucene\Data\record4.txt
Indexing E:\Lucene\Data\record5.txt
Indexing E:\Lucene\Data\record6.txt
Indexing E:\Lucene\Data\record7.txt
Indexing E:\Lucene\Data\record8.txt
Indexing E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms
1 documents found. Time :0
File: E:\Lucene\Data\record4.txt
เมื่อคุณรันโปรแกรมสำเร็จคุณจะมีเนื้อหาต่อไปนี้ในไฟล์ index directory -

กระบวนการจัดทำดัชนีเป็นหนึ่งในฟังก์ชันหลักที่ให้บริการโดย Lucene แผนภาพต่อไปนี้แสดงให้เห็นถึงกระบวนการสร้างดัชนีและการใช้คลาสIndexWriter เป็นองค์ประกอบที่สำคัญที่สุดและเป็นองค์ประกอบหลักของกระบวนการจัดทำดัชนี

เราเพิ่ม Document(s) ที่มี Field(s) ถึง IndexWriter ซึ่งวิเคราะห์ไฟล์ Document(s) ใช้ Analyzer จากนั้นสร้าง / เปิด / แก้ไขดัชนีตามต้องการและจัดเก็บ / อัปเดตในไฟล์ Directory. IndexWriter ใช้เพื่ออัปเดตหรือสร้างดัชนี ไม่ได้ใช้เพื่ออ่านดัชนี
คลาสการทำดัชนี
ต่อไปนี้เป็นรายการคลาสที่ใช้กันทั่วไปในระหว่างกระบวนการสร้างดัชนี
ส. | ชั้นเรียนและคำอธิบาย |
---|---|
1 | IndexWriter คลาสนี้ทำหน้าที่เป็นส่วนประกอบหลักซึ่งสร้าง / อัพเดตดัชนีในระหว่างกระบวนการสร้างดัชนี |
2 | ไดเรกทอรี คลาสนี้แสดงตำแหน่งที่เก็บของดัชนี |
3 | เครื่องวิเคราะห์ ชั้นนี้มีหน้าที่วิเคราะห์เอกสารและรับโทเค็น / คำจากข้อความที่จะจัดทำดัชนี หากไม่มีการวิเคราะห์ IndexWriter จะไม่สามารถสร้างดัชนีได้ |
4 | เอกสาร คลาสนี้แสดงถึงเอกสารเสมือนที่มีฟิลด์ซึ่งฟิลด์เป็นอ็อบเจ็กต์ที่สามารถมีเนื้อหาของเอกสารฟิสิคัลข้อมูลเมตาและอื่น ๆ เครื่องวิเคราะห์สามารถเข้าใจเอกสารเท่านั้น |
5 | ฟิลด์ นี่คือหน่วยต่ำสุดหรือจุดเริ่มต้นของกระบวนการสร้างดัชนี แสดงถึงความสัมพันธ์คู่ค่าคีย์ที่ใช้คีย์เพื่อระบุค่าที่จะจัดทำดัชนี ให้เราถือว่าฟิลด์ที่ใช้แสดงเนื้อหาของเอกสารจะมีคีย์เป็น "เนื้อหา" และค่าอาจมีบางส่วนหรือทั้งหมดของข้อความหรือเนื้อหาที่เป็นตัวเลขของเอกสาร Lucene สามารถจัดทำดัชนีเฉพาะเนื้อหาที่เป็นข้อความหรือตัวเลขเท่านั้น |
กระบวนการค้นหาเป็นอีกหนึ่งฟังก์ชันหลักที่ให้บริการโดย Lucene การไหลของมันคล้ายกับกระบวนการสร้างดัชนี การค้นหาพื้นฐานของ Lucene สามารถทำได้โดยใช้คลาสต่อไปนี้ซึ่งสามารถเรียกได้ว่าเป็นคลาสพื้นฐานสำหรับการดำเนินการที่เกี่ยวข้องกับการค้นหาทั้งหมด
กำลังค้นหาคลาส
ต่อไปนี้เป็นรายการคลาสที่ใช้กันทั่วไปในระหว่างกระบวนการค้นหา
ส. | ชั้นเรียนและคำอธิบาย |
---|---|
1 | IndexSearcher คลาสนี้ทำหน้าที่เป็นส่วนประกอบหลักที่อ่าน / ค้นหาดัชนีที่สร้างขึ้นหลังจากกระบวนการสร้างดัชนี ใช้อินสแตนซ์ไดเร็กทอรีที่ชี้ไปยังตำแหน่งที่มีดัชนี |
2 | ระยะเวลา คลาสนี้เป็นหน่วยที่ต่ำที่สุดในการค้นหา คล้ายกับฟิลด์ในกระบวนการสร้างดัชนี |
3 | แบบสอบถาม Query เป็นคลาสนามธรรมและมีวิธียูทิลิตี้ต่างๆและเป็นพาเรนต์ของการสืบค้นทุกประเภทที่ Lucene ใช้ในระหว่างกระบวนการค้นหา |
4 | TermQuery TermQuery เป็นออบเจ็กต์แบบสอบถามที่ใช้บ่อยที่สุดและเป็นรากฐานของการสืบค้นที่ซับซ้อนจำนวนมากที่ Lucene สามารถใช้ประโยชน์ได้ |
5 | TopDocs TopDocs ชี้ไปที่ผลการค้นหา N อันดับแรกซึ่งตรงกับเกณฑ์การค้นหา เป็นที่เก็บพอยน์เตอร์อย่างง่ายเพื่อชี้ไปที่เอกสารซึ่งเป็นผลลัพธ์ของผลการค้นหา |
กระบวนการจัดทำดัชนีเป็นหนึ่งในฟังก์ชันหลักที่ให้บริการโดย Lucene แผนภาพต่อไปนี้แสดงกระบวนการสร้างดัชนีและการใช้คลาส IndexWriter เป็นองค์ประกอบหลักที่สำคัญที่สุดของกระบวนการจัดทำดัชนี

เราได้เพิ่มเอกสาร (s)มีสนาม (s)เพื่อ IndexWriter ซึ่งวิเคราะห์เอกสาร (s) โดยใช้การวิเคราะห์แล้วสร้าง / เปิด / แก้ไขดัชนีตามความจำเป็นและ / ร้านปรับปรุงพวกเขาในสารบบ IndexWriterใช้เพื่ออัปเดตหรือสร้างดัชนี ไม่ได้ใช้เพื่ออ่านดัชนี
ตอนนี้เราจะแสดงให้คุณเห็นทีละขั้นตอนเพื่อเริ่มต้นทำความเข้าใจกระบวนการสร้างดัชนีโดยใช้ตัวอย่างพื้นฐาน
สร้างเอกสาร
สร้างวิธีการรับเอกสารลูซีนจากไฟล์ข้อความ
สร้างฟิลด์ประเภทต่างๆซึ่งเป็นคู่ค่าคีย์ที่มีคีย์เป็นชื่อและค่าเป็นเนื้อหาที่จะจัดทำดัชนี
ตั้งค่าฟิลด์ที่จะวิเคราะห์หรือไม่ ในกรณีของเราจะต้องวิเคราะห์เฉพาะเนื้อหาเนื่องจากสามารถมีข้อมูลเช่น a, am, are, และอื่น ๆ ซึ่งไม่จำเป็นในการดำเนินการค้นหา
เพิ่มเขตข้อมูลที่สร้างขึ้นใหม่ในออบเจ็กต์เอกสารและส่งกลับไปยังเมธอดผู้โทร
private Document getDocument(File file) throws IOException {
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS,
new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME,
file.getName(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH,
file.getCanonicalPath(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
สร้าง IndexWriter
คลาส IndexWriter ทำหน้าที่เป็นส่วนประกอบหลักที่สร้าง / อัพเดตดัชนีในระหว่างกระบวนการสร้างดัชนี ทำตามขั้นตอนเหล่านี้เพื่อสร้าง IndexWriter -
Step 1 - สร้างวัตถุของ IndexWriter
Step 2 - สร้างไดเรกทอรี Lucene ซึ่งควรชี้ไปยังตำแหน่งที่จะจัดเก็บดัชนี
Step 3 - เริ่มต้นอ็อบเจ็กต์ IndexWriter ที่สร้างด้วยไดเร็กทอรีดัชนีตัววิเคราะห์มาตรฐานที่มีข้อมูลเวอร์ชันและพารามิเตอร์อื่น ๆ ที่จำเป็น / เป็นทางเลือก
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException {
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
เริ่มกระบวนการจัดทำดัชนี
โปรแกรมต่อไปนี้แสดงวิธีเริ่มกระบวนการสร้างดัชนี -
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
ตัวอย่างการใช้งาน
ในการทดสอบกระบวนการจัดทำดัชนีเราจำเป็นต้องสร้างการทดสอบแอปพลิเคชัน Lucene
ขั้นตอน | คำอธิบาย |
---|---|
1 | สร้างโครงการที่มีชื่อLuceneFirstApplicationภายใต้แพคเกจcom.tutorialspoint.luceneตามที่อธิบายไว้ในLucene - บทที่ใช้ครั้งแรก คุณยังสามารถใช้โปรเจ็กต์ที่สร้างขึ้นในบทLucene - First Applicationสำหรับบทนี้เพื่อทำความเข้าใจกระบวนการสร้างดัชนี |
2 | สร้างLuceneConstants.java, TextFileFilter.javaและIndexer.javaตามที่อธิบายไว้ในLucene - การใช้งานครั้งแรกในบท เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง |
3 | สร้างLuceneTester.javaตามที่ระบุไว้ด้านล่าง |
4 | ทำความสะอาดและสร้างแอปพลิเคชันเพื่อให้แน่ใจว่าตรรกะทางธุรกิจทำงานได้ตามข้อกำหนด |
LuceneConstants.java
คลาสนี้ใช้เพื่อระบุค่าคงที่ต่างๆที่จะใช้กับแอปพลิเคชันตัวอย่าง
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
TextFileFilter.java
คลาสนี้ใช้เป็นไฟล์ .txt ตัวกรองไฟล์
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
public class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}
Indexer.java
คลาสนี้ใช้เพื่อจัดทำดัชนีข้อมูลดิบเพื่อให้เราสามารถค้นหาได้โดยใช้ไลบรารี Lucene
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Indexer {
private IndexWriter writer;
public Indexer(String indexDirectoryPath) throws IOException {
//this directory will contain the indexes
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
//create the indexer
writer = new IndexWriter(indexDirectory,
new StandardAnalyzer(Version.LUCENE_36),true,
IndexWriter.MaxFieldLength.UNLIMITED);
}
public void close() throws CorruptIndexException, IOException {
writer.close();
}
private Document getDocument(File file) throws IOException {
Document document = new Document();
//index file contents
Field contentField = new Field(LuceneConstants.CONTENTS,
new FileReader(file));
//index file name
Field fileNameField = new Field(LuceneConstants.FILE_NAME,
file.getName(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
//index file path
Field filePathField = new Field(LuceneConstants.FILE_PATH,
file.getCanonicalPath(),
Field.Store.YES,Field.Index.NOT_ANALYZED);
document.add(contentField);
document.add(fileNameField);
document.add(filePathField);
return document;
}
private void indexFile(File file) throws IOException {
System.out.println("Indexing "+file.getCanonicalPath());
Document document = getDocument(file);
writer.addDocument(document);
}
public int createIndex(String dataDirPath, FileFilter filter)
throws IOException {
//get all files in the data directory
File[] files = new File(dataDirPath).listFiles();
for (File file : files) {
if(!file.isDirectory()
&& !file.isHidden()
&& file.exists()
&& file.canRead()
&& filter.accept(file)
){
indexFile(file);
}
}
return writer.numDocs();
}
}
LuceneTester.java
คลาสนี้ใช้เพื่อทดสอบความสามารถในการสร้างดัชนีของไลบรารี Lucene
package com.tutorialspoint.lucene;
import java.io.IOException;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Indexer indexer;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.createIndex();
} catch (IOException e) {
e.printStackTrace();
}
}
private void createIndex() throws IOException {
indexer = new Indexer(indexDir);
int numIndexed;
long startTime = System.currentTimeMillis();
numIndexed = indexer.createIndex(dataDir, new TextFileFilter());
long endTime = System.currentTimeMillis();
indexer.close();
System.out.println(numIndexed+" File indexed, time taken: "
+(endTime-startTime)+" ms");
}
}
การสร้างไดเรกทอรีข้อมูลและดัชนี
เราใช้ไฟล์ข้อความ 10 ไฟล์จาก record1.txt ถึง record10.txt ที่มีชื่อและรายละเอียดอื่น ๆ ของนักเรียนและใส่ไว้ในไดเร็กทอรี E:\Lucene\Data. ข้อมูลการทดสอบ ควรสร้างพา ธ ไดเร็กทอรีดัชนีเป็นE:\Lucene\Index. หลังจากรันโปรแกรมนี้คุณจะเห็นรายการไฟล์ดัชนีที่สร้างขึ้นในโฟลเดอร์นั้น
เรียกใช้โปรแกรม
เมื่อคุณสร้างซอร์สเสร็จแล้วข้อมูลดิบไดเร็กทอรีข้อมูลและไดเร็กทอรีดัชนีคุณสามารถดำเนินการต่อได้โดยการคอมไพล์และรันโปรแกรมของคุณ ในการดำเนินการนี้ให้แท็บไฟล์ LuceneTester.java ทำงานอยู่และใช้ไฟล์Run ตัวเลือกที่มีอยู่ใน Eclipse IDE หรือใช้ Ctrl + F11 เพื่อรวบรวมและเรียกใช้ไฟล์ LuceneTesterใบสมัคร หากแอปพลิเคชันของคุณทำงานสำเร็จแอปพลิเคชันจะพิมพ์ข้อความต่อไปนี้ในคอนโซลของ Eclipse IDE -
Indexing E:\Lucene\Data\record1.txt
Indexing E:\Lucene\Data\record10.txt
Indexing E:\Lucene\Data\record2.txt
Indexing E:\Lucene\Data\record3.txt
Indexing E:\Lucene\Data\record4.txt
Indexing E:\Lucene\Data\record5.txt
Indexing E:\Lucene\Data\record6.txt
Indexing E:\Lucene\Data\record7.txt
Indexing E:\Lucene\Data\record8.txt
Indexing E:\Lucene\Data\record9.txt
10 File indexed, time taken: 109 ms
เมื่อคุณรันโปรแกรมสำเร็จคุณจะมีเนื้อหาต่อไปนี้ในไฟล์ index directory −

ในบทนี้เราจะพูดถึงการดำเนินการหลักสี่ประการของการจัดทำดัชนี การดำเนินการเหล่านี้มีประโยชน์ในหลาย ๆ ครั้งและใช้ตลอดทั้งแอปพลิเคชันการค้นหาซอฟต์แวร์
การดำเนินการจัดทำดัชนี
ต่อไปนี้เป็นรายการของการดำเนินการที่ใช้กันทั่วไปในระหว่างกระบวนการสร้างดัชนี
ส. | การทำงานและคำอธิบาย |
---|---|
1 | เพิ่มเอกสาร การดำเนินการนี้ใช้ในขั้นตอนเริ่มต้นของกระบวนการสร้างดัชนีเพื่อสร้างดัชนีบนเนื้อหาที่มีอยู่ใหม่ |
2 | อัปเดตเอกสาร การดำเนินการนี้ใช้เพื่ออัปเดตดัชนีเพื่อแสดงถึงการเปลี่ยนแปลงในเนื้อหาที่อัปเดต มันคล้ายกับการสร้างดัชนีขึ้นมาใหม่ |
3 | ลบเอกสาร การดำเนินการนี้ใช้เพื่ออัปเดตดัชนีเพื่อไม่รวมเอกสารที่ไม่จำเป็นต้องจัดทำดัชนี / ค้นหา |
4 | ตัวเลือกฟิลด์ ตัวเลือกฟิลด์ระบุวิธีการหรือควบคุมวิธีที่เนื้อหาของฟิลด์จะถูกทำให้ค้นหาได้ |
กระบวนการค้นหาเป็นหนึ่งในฟังก์ชันหลักที่ให้บริการโดย Lucene แผนภาพต่อไปนี้แสดงกระบวนการและการใช้งาน IndexSearcher เป็นหนึ่งในองค์ประกอบหลักของกระบวนการค้นหา

ครั้งแรกที่เราสร้างไดเรกทอรี (s)ที่มีการจัดทำดัชนีและจากนั้นผ่านไปIndexSearcherซึ่งเปิดไดเรกทอรีที่ใช้IndexReader จากนั้นเราสร้างQueryด้วยคำและทำการค้นหาโดยใช้IndexSearcherโดยส่งQueryไปยังผู้ค้นหา IndexSearcherส่งคืนอ็อบเจ็กต์TopDocsซึ่งมีรายละเอียดการค้นหาพร้อมด้วย ID เอกสารของDocumentซึ่งเป็นผลลัพธ์ของการดำเนินการค้นหา
ตอนนี้เราจะแสดงวิธีการที่ชาญฉลาดและช่วยให้คุณเข้าใจกระบวนการจัดทำดัชนีโดยใช้ตัวอย่างพื้นฐาน
สร้าง QueryParser
คลาส QueryParser จะแยกวิเคราะห์ข้อมูลที่ผู้ใช้ป้อนลงในแบบสอบถามรูปแบบที่เข้าใจได้ของ Lucene ทำตามขั้นตอนเหล่านี้เพื่อสร้าง QueryParser -
Step 1 - สร้างวัตถุของ QueryParser
Step 2 - เริ่มต้นอ็อบเจ็กต์ QueryParser ที่สร้างด้วยตัววิเคราะห์มาตรฐานที่มีข้อมูลเวอร์ชันและชื่อดัชนีที่จะเรียกใช้แบบสอบถามนี้
QueryParser queryParser;
public Searcher(String indexDirectoryPath) throws IOException {
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
สร้าง IndexSearcher
คลาส IndexSearcher ทำหน้าที่เป็นส่วนประกอบหลักซึ่งดัชนีผู้ค้นหาสร้างขึ้นระหว่างกระบวนการสร้างดัชนี ทำตามขั้นตอนเหล่านี้เพื่อสร้าง IndexSearcher -
Step 1 - สร้างวัตถุของ IndexSearcher
Step 2 - สร้างไดเรกทอรี Lucene ซึ่งควรชี้ไปยังตำแหน่งที่จะจัดเก็บดัชนี
Step 3 - เริ่มต้นอ็อบเจ็กต์ IndexSearcher ที่สร้างด้วยไดเร็กทอรีดัชนี
IndexSearcher indexSearcher;
public Searcher(String indexDirectoryPath) throws IOException {
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
}
ทำการค้นหา
ทำตามขั้นตอนเหล่านี้เพื่อทำการค้นหา -
Step 1 - สร้างวัตถุแบบสอบถามโดยการแยกวิเคราะห์นิพจน์การค้นหาผ่าน QueryParser
Step 2 - ทำการค้นหาโดยเรียกใช้เมธอด IndexSearcher.search ()
Query query;
public TopDocs search( String searchQuery) throws IOException, ParseException {
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
รับเอกสาร
โปรแกรมต่อไปนี้แสดงวิธีรับเอกสาร
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
ปิด IndexSearcher
โปรแกรมต่อไปนี้แสดงวิธีปิด IndexSearcher
public void close() throws IOException {
indexSearcher.close();
}
ตัวอย่างการใช้งาน
ให้เราสร้างแอปพลิเคชันทดสอบ Lucene เพื่อทดสอบกระบวนการค้นหา
ขั้นตอน | คำอธิบาย |
---|---|
1 | สร้างโครงการที่มีชื่อLuceneFirstApplicationภายใต้แพคเกจcom.tutorialspoint.luceneตามที่อธิบายไว้ในLucene - การใช้งานครั้งแรกในบท คุณยังสามารถใช้โปรเจ็กต์ที่สร้างขึ้นในLucene - First Application chapter สำหรับบทนี้เพื่อทำความเข้าใจกระบวนการค้นหา |
2 | สร้างLuceneConstants.java, TextFileFilter.javaและSearcher.javaตามที่อธิบายไว้ในLucene - การใช้งานครั้งแรกในบท เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง |
3 | สร้างLuceneTester.javaตามที่ระบุไว้ด้านล่าง |
4 | ทำความสะอาดและสร้างแอปพลิเคชันเพื่อให้แน่ใจว่าตรรกะทางธุรกิจทำงานได้ตามข้อกำหนด |
LuceneConstants.java
คลาสนี้ใช้เพื่อระบุค่าคงที่ต่างๆที่จะใช้กับแอปพลิเคชันตัวอย่าง
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
TextFileFilter.java
คลาสนี้ใช้เป็นไฟล์ .txt ตัวกรองไฟล์
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.FileFilter;
public class TextFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.getName().toLowerCase().endsWith(".txt");
}
}
Searcher.java
คลาสนี้ใช้เพื่ออ่านดัชนีที่สร้างขึ้นจากข้อมูลดิบและค้นหาข้อมูลโดยใช้ไลบรารี Lucene
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Searcher {
IndexSearcher indexSearcher;
QueryParser queryParser;
Query query;
public Searcher(String indexDirectoryPath) throws IOException {
Directory indexDirectory =
FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
public TopDocs search( String searchQuery)
throws IOException, ParseException {
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
public void close() throws IOException {
indexSearcher.close();
}
}
LuceneTester.java
คลาสนี้ใช้เพื่อทดสอบความสามารถในการค้นหาของไลบรารี Lucene
package com.tutorialspoint.lucene;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Searcher searcher;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.search("Mohan");
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
private void search(String searchQuery) throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
TopDocs hits = searcher.search(searchQuery);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) +" ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
}
การสร้างไดเรกทอรีข้อมูลและดัชนี
เราใช้ไฟล์ข้อความ 10 ไฟล์ชื่อ record1.txt เพื่อ record10.txt ที่มีชื่อและรายละเอียดอื่น ๆ ของนักเรียนและใส่ไว้ในไดเร็กทอรี E: \ Lucene \ Data ข้อมูลการทดสอบ ควรสร้างพา ธ ไดเร็กทอรีดัชนีเป็น E: \ Lucene \ Index หลังจากรันโปรแกรมสร้างดัชนีในบทLucene - Indexing Processคุณสามารถดูรายการไฟล์ดัชนีที่สร้างขึ้นในโฟลเดอร์นั้น
เรียกใช้โปรแกรม
เมื่อคุณสร้างแหล่งที่มาข้อมูลดิบไดเร็กทอรีข้อมูลไดเร็กทอรีดัชนีและดัชนีคุณสามารถดำเนินการต่อได้โดยการคอมไพล์และรันโปรแกรมของคุณ หากต้องการทำสิ่งนี้ให้เก็บไว้LuceneTester.Java แท็บไฟล์แอ็คทีฟและใช้อ็อพชัน Run ที่มีอยู่ใน Eclipse IDE หรือ use Ctrl + F11 เพื่อรวบรวมและเรียกใช้ไฟล์ LuceneTesterapplication. หากแอปพลิเคชันของคุณทำงานสำเร็จแอปพลิเคชันจะพิมพ์ข้อความต่อไปนี้ในคอนโซลของ Eclipse IDE -
1 documents found. Time :29 ms
File: E:\Lucene\Data\record4.txt
เราได้เห็นในบทที่แล้ว Lucene - Search OperationLucene ใช้ IndexSearcher เพื่อทำการค้นหาและใช้วัตถุ Query ที่สร้างโดย QueryParser เป็นอินพุต ในบทนี้เราจะพูดถึงออบเจ็กต์ Query ประเภทต่างๆและวิธีต่างๆในการสร้างโดยใช้โปรแกรม การสร้างออบเจ็กต์ Query ประเภทต่างๆให้การควบคุมประเภทของการค้นหาที่จะทำการค้นหา
พิจารณากรณีของการค้นหาขั้นสูงซึ่งมีให้โดยแอปพลิเคชันจำนวนมากซึ่งผู้ใช้จะได้รับตัวเลือกมากมายเพื่อ จำกัด ผลการค้นหา ด้วยการเขียนโปรแกรม Query เราสามารถบรรลุสิ่งเดียวกันได้อย่างง่ายดาย
ต่อไปนี้เป็นรายการประเภทคำค้นหาที่เราจะพูดถึงในช่วงเวลาที่กำหนด
ส. | ชั้นเรียนและคำอธิบาย |
---|---|
1 | TermQuery คลาสนี้ทำหน้าที่เป็นส่วนประกอบหลักซึ่งสร้าง / อัพเดตดัชนีในระหว่างกระบวนการสร้างดัชนี |
2 | TermRangeQuery TermRangeQuery ถูกใช้เมื่อต้องการค้นหาช่วงของข้อความที่เป็นข้อความ |
3 | PrefixQuery PrefixQuery ใช้เพื่อจับคู่เอกสารที่ดัชนีเริ่มต้นด้วยสตริงที่ระบุ |
4 | BooleanQuery BooleanQuery ใช้เพื่อค้นหาเอกสารซึ่งเป็นผลมาจากการสืบค้นหลายรายการโดยใช้ AND, OR หรือ NOT ตัวดำเนินการ |
5 | PhraseQuery การสืบค้นแบบวลีใช้เพื่อค้นหาเอกสารที่มีลำดับของคำศัพท์เฉพาะ |
6 | WildCardQuery WildcardQuery ใช้เพื่อค้นหาเอกสารโดยใช้สัญลักษณ์แทนเช่น '*' สำหรับลำดับอักขระใด ๆ ? จับคู่อักขระเดี่ยว |
7 | FuzzyQuery FuzzyQuery ใช้เพื่อค้นหาเอกสารโดยใช้การใช้งานแบบฟัซซี่ซึ่งเป็นการค้นหาโดยประมาณตามอัลกอริทึมระยะแก้ไข |
8 | MatchAllDocsQuery MatchAllDocsQuery ตามชื่อที่แนะนำจะตรงกับเอกสารทั้งหมด |
ในบทก่อนหน้าของเราเราได้เห็นว่า Lucene ใช้IndexWriterเพื่อวิเคราะห์เอกสารโดยใช้ตัววิเคราะห์จากนั้นจึงสร้าง / เปิด / แก้ไขดัชนีตามต้องการ ในบทนี้เราจะพูดถึงออบเจ็กต์ตัววิเคราะห์ประเภทต่างๆและอ็อบเจกต์อื่น ๆ ที่เกี่ยวข้องซึ่งใช้ในระหว่างกระบวนการวิเคราะห์ การทำความเข้าใจกระบวนการวิเคราะห์และวิธีการทำงานของเครื่องวิเคราะห์จะช่วยให้คุณมีความเข้าใจอย่างมากว่า Lucene จัดทำดัชนีเอกสารอย่างไร
ต่อไปนี้เป็นรายการวัตถุที่เราจะพูดถึงในช่วงเวลาที่กำหนด
ส. | ชั้นเรียนและคำอธิบาย |
---|---|
1 | โทเค็น โทเค็นแสดงถึงข้อความหรือคำในเอกสารที่มีรายละเอียดที่เกี่ยวข้องเช่นข้อมูลเมตา (ตำแหน่งเริ่มต้นออฟเซ็ตออฟเซ็ตสิ้นสุดประเภทโทเค็นและการเพิ่มตำแหน่ง) |
2 | TokenStream TokenStream เป็นผลลัพธ์ของกระบวนการวิเคราะห์ซึ่งประกอบด้วยชุดของโทเค็น มันเป็นชั้นนามธรรม |
3 | เครื่องวิเคราะห์ นี่คือคลาสพื้นฐานที่เป็นนามธรรมสำหรับตัววิเคราะห์แต่ละประเภท |
4 | ช่องว่าง ตัววิเคราะห์นี้จะแยกข้อความในเอกสารตามช่องว่าง |
5 | SimpleAnalyzer ตัววิเคราะห์นี้จะแยกข้อความในเอกสารโดยใช้อักขระที่ไม่ใช่ตัวอักษรและทำให้ข้อความเป็นตัวพิมพ์เล็ก |
6 | หยุดการวิเคราะห์ ตัววิเคราะห์นี้ทำงานเช่นเดียวกับ SimpleAnalyzer และลบคำทั่วไปเช่น 'a', 'an', 'the', เป็นต้น |
7 | มาตรฐาน นี่คือเครื่องมือวิเคราะห์ที่ซับซ้อนที่สุดและสามารถจัดการชื่อที่อยู่อีเมล ฯลฯ ได้ซึ่งจะลดขนาดโทเค็นแต่ละรายการและลบคำทั่วไปและเครื่องหมายวรรคตอนหากมี |
ในบทนี้เราจะพิจารณาลำดับการจัดเรียงที่ Lucene ให้ผลการค้นหาตามค่าเริ่มต้นหรือสามารถจัดการได้ตามต้องการ
จัดเรียงตามความเกี่ยวข้อง
นี่คือโหมดการเรียงลำดับเริ่มต้นที่ Lucene ใช้ Lucene ให้ผลลัพธ์ตาม Hit ที่เกี่ยวข้องมากที่สุดที่ด้านบน
private void sortUsingRelevance(String searchQuery)
throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
//create a term to search file name
Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
//create the term query object
Query query = new FuzzyQuery(term);
searcher.setDefaultFieldSortScoring(true, false);
//do the search
TopDocs hits = searcher.search(query,Sort.RELEVANCE);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) + "ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.print("Score: "+ scoreDoc.score + " ");
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
จัดเรียงตาม IndexOrder
โหมดการเรียงลำดับนี้ใช้โดย Lucene เอกสารแรกที่จัดทำดัชนีจะปรากฏเป็นอันดับแรกในผลการค้นหา
private void sortUsingIndex(String searchQuery)
throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
//create a term to search file name
Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
//create the term query object
Query query = new FuzzyQuery(term);
searcher.setDefaultFieldSortScoring(true, false);
//do the search
TopDocs hits = searcher.search(query,Sort.INDEXORDER);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) + "ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.print("Score: "+ scoreDoc.score + " ");
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
ตัวอย่างการใช้งาน
ให้เราสร้างแอปพลิเคชันทดสอบ Lucene เพื่อทดสอบกระบวนการคัดแยก
ขั้นตอน | คำอธิบาย |
---|---|
1 | สร้างโครงการที่มีชื่อLuceneFirstApplicationภายใต้แพคเกจcom.tutorialspoint.luceneตามที่อธิบายไว้ในLucene - การใช้งานครั้งแรกในบท คุณยังสามารถใช้โปรเจ็กต์ที่สร้างขึ้นในLucene - First Application chapter สำหรับบทนี้เพื่อทำความเข้าใจกระบวนการค้นหา |
2 | สร้างLuceneConstants.javaและSearcher.javaตามที่อธิบายไว้ในLucene - การใช้งานครั้งแรกในบท เก็บไฟล์ที่เหลือไว้ไม่เปลี่ยนแปลง |
3 | สร้างLuceneTester.javaตามที่ระบุไว้ด้านล่าง |
4 | ทำความสะอาดและสร้างแอปพลิเคชันเพื่อให้แน่ใจว่าตรรกะทางธุรกิจทำงานได้ตามข้อกำหนด |
LuceneConstants.java
คลาสนี้ใช้เพื่อระบุค่าคงที่ต่างๆที่จะใช้กับแอปพลิเคชันตัวอย่าง
package com.tutorialspoint.lucene;
public class LuceneConstants {
public static final String CONTENTS = "contents";
public static final String FILE_NAME = "filename";
public static final String FILE_PATH = "filepath";
public static final int MAX_SEARCH = 10;
}
Searcher.java
คลาสนี้ใช้เพื่ออ่านดัชนีที่สร้างขึ้นจากข้อมูลดิบและค้นหาข้อมูลโดยใช้ไลบรารี Lucene
package com.tutorialspoint.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
public class Searcher {
IndexSearcher indexSearcher;
QueryParser queryParser;
Query query;
public Searcher(String indexDirectoryPath) throws IOException {
Directory indexDirectory
= FSDirectory.open(new File(indexDirectoryPath));
indexSearcher = new IndexSearcher(indexDirectory);
queryParser = new QueryParser(Version.LUCENE_36,
LuceneConstants.CONTENTS,
new StandardAnalyzer(Version.LUCENE_36));
}
public TopDocs search( String searchQuery)
throws IOException, ParseException {
query = queryParser.parse(searchQuery);
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public TopDocs search(Query query)
throws IOException, ParseException {
return indexSearcher.search(query, LuceneConstants.MAX_SEARCH);
}
public TopDocs search(Query query,Sort sort)
throws IOException, ParseException {
return indexSearcher.search(query,
LuceneConstants.MAX_SEARCH,sort);
}
public void setDefaultFieldSortScoring(boolean doTrackScores,
boolean doMaxScores) {
indexSearcher.setDefaultFieldSortScoring(
doTrackScores,doMaxScores);
}
public Document getDocument(ScoreDoc scoreDoc)
throws CorruptIndexException, IOException {
return indexSearcher.doc(scoreDoc.doc);
}
public void close() throws IOException {
indexSearcher.close();
}
}
LuceneTester.java
คลาสนี้ใช้เพื่อทดสอบความสามารถในการค้นหาของไลบรารี Lucene
package com.tutorialspoint.lucene;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.search.FuzzyQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.Sort;
import org.apache.lucene.search.TopDocs;
public class LuceneTester {
String indexDir = "E:\\Lucene\\Index";
String dataDir = "E:\\Lucene\\Data";
Indexer indexer;
Searcher searcher;
public static void main(String[] args) {
LuceneTester tester;
try {
tester = new LuceneTester();
tester.sortUsingRelevance("cord3.txt");
tester.sortUsingIndex("cord3.txt");
} catch (IOException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
}
private void sortUsingRelevance(String searchQuery)
throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
//create a term to search file name
Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
//create the term query object
Query query = new FuzzyQuery(term);
searcher.setDefaultFieldSortScoring(true, false);
//do the search
TopDocs hits = searcher.search(query,Sort.RELEVANCE);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) + "ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.print("Score: "+ scoreDoc.score + " ");
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
private void sortUsingIndex(String searchQuery)
throws IOException, ParseException {
searcher = new Searcher(indexDir);
long startTime = System.currentTimeMillis();
//create a term to search file name
Term term = new Term(LuceneConstants.FILE_NAME, searchQuery);
//create the term query object
Query query = new FuzzyQuery(term);
searcher.setDefaultFieldSortScoring(true, false);
//do the search
TopDocs hits = searcher.search(query,Sort.INDEXORDER);
long endTime = System.currentTimeMillis();
System.out.println(hits.totalHits +
" documents found. Time :" + (endTime - startTime) + "ms");
for(ScoreDoc scoreDoc : hits.scoreDocs) {
Document doc = searcher.getDocument(scoreDoc);
System.out.print("Score: "+ scoreDoc.score + " ");
System.out.println("File: "+ doc.get(LuceneConstants.FILE_PATH));
}
searcher.close();
}
}
การสร้างไดเรกทอรีข้อมูลและดัชนี
เราใช้ไฟล์ข้อความ 10 ไฟล์จาก record1.txt ถึง record10.txt ที่มีชื่อและรายละเอียดอื่น ๆ ของนักเรียนและใส่ไว้ในไดเร็กทอรี E:\Lucene\Data. ข้อมูลการทดสอบ ควรสร้างพา ธ ไดเร็กทอรีดัชนีเป็น E: \ Lucene \ Index หลังจากรันโปรแกรมสร้างดัชนีในบทLucene - Indexing Processคุณสามารถดูรายการไฟล์ดัชนีที่สร้างขึ้นในโฟลเดอร์นั้น
เรียกใช้โปรแกรม
เมื่อคุณสร้างซอร์สเสร็จแล้วข้อมูลดิบไดเร็กทอรีข้อมูลไดเร็กทอรีดัชนีและดัชนีคุณสามารถคอมไพล์และรันโปรแกรมของคุณได้ ในการดำเนินการนี้ให้เก็บไฟล์LuceneTester.Java แท็บไฟล์แอ็คทีฟและใช้อ็อพชัน Run ที่มีอยู่ใน Eclipse IDE หรือ use Ctrl + F11 เพื่อรวบรวมและเรียกใช้ไฟล์ LuceneTesterใบสมัคร หากแอปพลิเคชันของคุณทำงานสำเร็จแอปพลิเคชันจะพิมพ์ข้อความต่อไปนี้ในคอนโซลของ Eclipse IDE -
10 documents found. Time :31ms
Score: 1.3179655 File: E:\Lucene\Data\record3.txt
Score: 0.790779 File: E:\Lucene\Data\record1.txt
Score: 0.790779 File: E:\Lucene\Data\record2.txt
Score: 0.790779 File: E:\Lucene\Data\record4.txt
Score: 0.790779 File: E:\Lucene\Data\record5.txt
Score: 0.790779 File: E:\Lucene\Data\record6.txt
Score: 0.790779 File: E:\Lucene\Data\record7.txt
Score: 0.790779 File: E:\Lucene\Data\record8.txt
Score: 0.790779 File: E:\Lucene\Data\record9.txt
Score: 0.2635932 File: E:\Lucene\Data\record10.txt
10 documents found. Time :0ms
Score: 0.790779 File: E:\Lucene\Data\record1.txt
Score: 0.2635932 File: E:\Lucene\Data\record10.txt
Score: 0.790779 File: E:\Lucene\Data\record2.txt
Score: 1.3179655 File: E:\Lucene\Data\record3.txt
Score: 0.790779 File: E:\Lucene\Data\record4.txt
Score: 0.790779 File: E:\Lucene\Data\record5.txt
Score: 0.790779 File: E:\Lucene\Data\record6.txt
Score: 0.790779 File: E:\Lucene\Data\record7.txt
Score: 0.790779 File: E:\Lucene\Data\record8.txt
Score: 0.790779 File: E:\Lucene\Data\record9.txt