Lucene - Aplikasi Pertama
Pada bab ini, kita akan mempelajari pemrograman sebenarnya dengan Lucene Framework. Sebelum Anda mulai menulis contoh pertama Anda menggunakan kerangka kerja Lucene, Anda harus memastikan bahwa Anda telah mengatur lingkungan Lucene Anda dengan benar seperti yang dijelaskan dalam tutorial Lucene - Pengaturan Lingkungan . Direkomendasikan agar Anda memiliki pengetahuan kerja tentang Eclipse IDE.
Mari kita lanjutkan dengan menulis Aplikasi Pencarian sederhana yang akan mencetak jumlah hasil pencarian yang ditemukan. Kami juga akan melihat daftar indeks yang dibuat selama proses ini.
Langkah 1 - Buat Proyek Java
Langkah pertama adalah membuat Proyek Java sederhana menggunakan Eclipse IDE. Ikuti opsinyaFile > New -> Project dan akhirnya pilih Java Projectwizard dari daftar wizard. Sekarang beri nama proyek Anda sebagaiLuceneFirstApplication menggunakan jendela wizard sebagai berikut -
Setelah proyek Anda berhasil dibuat, Anda akan memiliki konten berikut di Project Explorer -
Langkah 2 - Tambahkan Perpustakaan yang Diperlukan
Sekarang mari kita tambahkan pustaka kerangka kerja inti Lucene dalam proyek kita. Untuk melakukan ini, klik kanan pada nama proyek AndaLuceneFirstApplication dan kemudian ikuti opsi berikut yang tersedia di menu konteks: Build Path -> Configure Build Path untuk menampilkan jendela Java Build Path sebagai berikut -
Sekarang gunakan Add External JARs tombol tersedia di bawah Libraries tab untuk menambahkan JAR inti berikut dari direktori instalasi Lucene -
- lucene-core-3.6.2
Langkah 3 - Buat File Sumber
Mari kita sekarang membuat file sumber aktual di bawah LuceneFirstApplicationproyek. Pertama kita perlu membuat paket bernamacom.tutorialspoint.lucene. Untuk melakukan ini, klik kanan pada src di bagian penjelajah paket dan ikuti opsi: New -> Package.
Selanjutnya kita akan membuat LuceneTester.java dan kelas java lainnya di bawah com.tutorialspoint.lucene paket.
LuceneConstants.java
Kelas ini digunakan untuk menyediakan berbagai konstanta yang akan digunakan di seluruh aplikasi sampel.
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
Kelas ini digunakan sebagai .txt file Saring.
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
Kelas ini digunakan untuk mengindeks data mentah sehingga kita dapat membuatnya dapat dicari menggunakan pustaka 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
Kelas ini digunakan untuk mencari indeks yang dibuat oleh Pengindeks untuk mencari konten yang diminta.
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
Kelas ini digunakan untuk menguji kemampuan pengindeksan dan pencarian perpustakaan 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";
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();
}
}
Langkah 4 - Pembuatan direktori Data & Indeks
Kami telah menggunakan 10 file teks dari record1.txt ke record10.txt yang berisi nama dan detail siswa lainnya dan meletakkannya di direktori E:\Lucene\Data. Uji Data . Jalur direktori indeks harus dibuat sebagaiE:\Lucene\Index. Setelah menjalankan program ini, Anda dapat melihat daftar file indeks yang dibuat di folder tersebut.
Langkah 5 - Jalankan program
Setelah Anda selesai dengan pembuatan sumber, data mentah, direktori data dan direktori indeks, Anda siap untuk mengompilasi dan menjalankan program Anda. Untuk melakukan ini, pertahankanLuceneTester.Java File tab aktif dan gunakan file Run pilihan yang tersedia di Eclipse IDE atau gunakan Ctrl + F11 untuk mengkompilasi dan menjalankan file LuceneTesteraplikasi. Jika aplikasi berjalan dengan sukses, itu akan mencetak pesan berikut di konsol 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
Setelah Anda menjalankan program dengan sukses, Anda akan memiliki konten berikut di index directory -