Lucene açık kaynak kodlu bir arama motorudur. Fakat bize sadece hizmet sağlar yani biz Lucene api’lerini kullanarak istediğimiz arama fonksiyonunu implement edebiliriz.
Lucene’nin en güzel özelliği ise özelleştirilebilir olmasıdır aynı zamanda çok hızlı aramalar yapabilir.
Lucene’nin şu anki versiyonu 2.3.2 http://www.apache.org/dyn/closer.cgi/lucene/java/ adresinden son sürümü indirebilirsiniz. İndirme işlemini tamamladıktan sonra lucene-core-2.3.2.jar dosyasını classpath içerisine koyunuz.
Şimdi Lucene kullanarak basit bir indexleme ve arama örneği yapalım. Bu örneğimizde, bilgisayarımızda bulunan tüm dosyaları indeksleyip dosya ismine göre arama yapmak. Bunun için FileIndexer isminde bir sınıf yazalım. FileIndexer sınıfında en üst dizinden alt dizine kadar olan tüm dosyalar Lucene ile indeksleniyor. Böylece bulmak istediğimiz dosyayı kolayca ve hızlıca bulabileceğiz.
package net.javaci; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.*; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexWriter; public class FileIndexer { // indekslerin oluşacağı klasör final File INDEX_DIR = new File("index"); public FileIndexer() { // en üst dizinden indekslemeyi başlatacağız File rootDir = new File("/"); try { IndexWriter writer = new IndexWriter(INDEX_DIR, new StandardAnalyzer(), true); System.out.println("indeksleniyor '" + INDEX_DIR + "'..."); // recursive olarak tüm dosyaları indeksliyoruz indexDocs(writer, rootDir); System.out.println("Optimize ediliyor..."); writer.optimize(); writer.close(); System.out.println("Bitti..."); } catch (IOException e) { e.printStackTrace(); } } private Document createDocument(String path, String fileName) { Document document = new Document(); // burada path içerisinde arama yapmayacağımızı sadece // kaydetmesini söylüyoruz. document.add(new Field("path", path, Field.Store.YES, Field.Index.UN_TOKENIZED)); // burada filename içerisinde arama yapacağımızı // indeksleyip kaydetmesini söylüyoruz. document.add(new Field("filename", fileName, Field.Store.YES, Field.Index.TOKENIZED)); return document; } // Recursive method private void indexDocuments(IndexWriter writer, File file) { if (file.isDirectory()) { String[] files = file.list(); if (files != null) { for (int i = 0; i < files.length; i++) { indexDocuments(writer, new File(file, files[i])); } } } else { try { System.out.println("ekleniyor : " + file.getPath() + file.getName()); writer.addDocument(createDocument(file.getPath(), file.getName())); } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } // Main Method public static void main(String[] args) { new FileIndexer(); } }
package net.javaci; import java.io.File; import java.io.IOException; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.Searcher; public class FileSearcher { final File INDEX_DIR = new File("index"); public FileSearcher() { try { // Lucene'nin okuyacağı indeksi gösteriyoruz IndexReader reader = IndexReader.open(INDEX_DIR); Searcher searcher = new IndexSearcher(reader); Analyzer analyzer = new StandardAnalyzer(); // "filename" önceden field olarak atadığımız isim // Bu field içerisinde arama yapacağımızı söylüyoruz // Zaten "filename" fieldi sadece indekslemiştik QueryParser parser = new QueryParser("filename", analyzer); // parse methodu ile arama yapacağımız kelimeyi giriyoruz Query query = parser.parse("java"); Hits hits = searcher.search(query); System.out.println(hits.length() + " tane eşleşen bulundu"); for (int start = 0; start < hits.length(); start++) { Document doc = hits.doc(start); String path = doc.get("path"); String fileName = doc.get("filename"); System.out.println(path + " " + fileName); } } catch (CorruptIndexException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } } // Main Method public static void main(String[] args) { new FileSearcher(); } }

Son Yorumlar