Lucene - İlk Uygulama
Bu bölümde, Lucene Framework ile gerçek programlamayı öğreneceğiz. Lucene çerçevesini kullanarak ilk örneğinizi yazmaya başlamadan önce, Lucene - Ortam Kurulumu öğreticisinde açıklandığı gibi Lucene ortamınızı doğru şekilde kurduğunuzdan emin olmalısınız . Eclipse IDE'nin çalışma bilgisine sahip olmanız önerilir.
Şimdi, bulunan arama sonuçlarının sayısını yazdıracak basit bir Arama Uygulaması yazarak devam edelim. Bu işlem sırasında oluşturulan dizinlerin listesini de göreceğiz.
Adım 1 - Java Projesi Oluşturun
İlk adım, Eclipse IDE'yi kullanarak basit bir Java Projesi oluşturmaktır. Seçeneği takip edinFile > New -> Project ve son olarak seçin Java Projectsihirbaz listesinden sihirbaz. Şimdi projenizi şu şekilde adlandırın:LuceneFirstApplication sihirbaz penceresini aşağıdaki gibi kullanarak -
Projeniz başarıyla oluşturulduktan sonra, aşağıdaki içeriğe sahip olacaksınız: Project Explorer -
Adım 2 - Gerekli Kitaplıkları Ekleyin
Şimdi projemize Lucene çekirdek Çerçeve kitaplığını ekleyelim. Bunu yapmak için proje adınıza sağ tıklayınLuceneFirstApplication ve ardından bağlam menüsünde bulunan aşağıdaki seçeneği izleyin: Build Path -> Configure Build Path Java Derleme Yolu penceresini aşağıdaki gibi görüntülemek için -
Şimdi kullan Add External JARs altında bulunan düğme Libraries Lucene kurulum dizininden aşağıdaki çekirdek JAR'ı eklemek için sekme -
- lucene-core-3.6.2
Adım 3 - Kaynak Dosyaları Oluşturun
Şimdi altında gerçek kaynak dosyaları oluşturalım. LuceneFirstApplicationproje. Önce adında bir paket oluşturmalıyızcom.tutorialspoint.lucene. Bunu yapmak için, paket gezgini bölümünde src'ye sağ tıklayın ve seçeneği izleyin: New -> Package.
Sonra yaratacağız LuceneTester.java ve altındaki diğer java sınıfları com.tutorialspoint.lucene paketi.
LuceneConstants.java
Bu sınıf, örnek uygulamada kullanılacak çeşitli sabitler sağlamak için kullanılır.
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
Bu sınıf bir .txt file filtre.
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
Bu sınıf, ham verileri indekslemek için kullanılır, böylece Lucene kütüphanesini kullanarak aranabilir hale getirebiliriz.
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
Bu sınıf, istenen içeriği aramak için Dizin Oluşturucu tarafından oluşturulan dizinleri aramak için kullanılır.
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
Bu sınıf, lucene kitaplığının indeksleme ve arama yeteneğini test etmek için kullanılır.
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();
}
}
Adım 4 - Veri ve Dizin dizini oluşturma
Kayıt1.txt'den record10.txt'ye kadar öğrencilerin isimlerini ve diğer detaylarını içeren 10 adet metin dosyası kullandık ve dizine koyduk E:\Lucene\Data. Test Verileri . Bir dizin dizin yolu şu şekilde oluşturulmalıdır:E:\Lucene\Index. Bu programı çalıştırdıktan sonra, o klasörde oluşturulan indeks dosyalarının listesini görebilirsiniz.
Adım 5 - Programı çalıştırmak
Kaynak, ham veri, veri dizini ve indeks dizini oluşturmayı tamamladığınızda, programınızı derlemeye ve çalıştırmaya hazırsınız. Bunu yapmak içinLuceneTester.Java dosya sekmesi etkin ve ikisinden birini kullanın Run Eclipse IDE'de mevcut seçenek veya kullanım Ctrl + F11 derlemek ve çalıştırmak için LuceneTesteruygulama. Uygulama başarılı bir şekilde çalışırsa, Eclipse IDE'nin konsolunda aşağıdaki mesajı yazdıracaktır -
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
Programı başarıyla çalıştırdıktan sonra, aşağıdaki içeriğe sahip olacaksınız. index directory -