Sep 15

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();
  }
 
}

yazan Erol KOCAMAN \\ tags: , , , , ,

Mar 14
Properties properties = new Properties();
 try {
   properties.load(new FileInputStream("s.properties"));
 } catch (IOException e) {
 }
 
 System.out.println(properties.getProperty("a"));
 
 
 properties.setProperty("a", "yeni deger");
 
 try {
   properties.store(new FileOutputStream("s.properties"), null);
 } catch (IOException e) {
 }

Yukarıdaki örnekte s.properties dosyası oluşturun ve içerisine a=5 gibi bir değer yazın. Bu programı çalıştırdığınız zaman bu değer okunur ekrana basılır ve yeni değer ile dosya kaydedilir. Dikkat edilmesi gereken konu bu dosyadaki karakterler Unicode olmalıdır.

yazan Erol KOCAMAN \\ tags: , , , ,