İçerikler :

Analyzer Basit Bir İçerik İndexleme ve Arama Örneği Basit Bir İçerik İndexleme ve Birden Fazla Al.. Directory Document Field FSDirectory IndexReader IndexSearcher IndexWriter IndexWriterConfig Lucene Lucene, Lucene Core ve Solr Farkı Lucene Core Luke MultiFieldQueryParser Query QueryParser ScoreDoc Solr StandardAnalyzer StringField TextField TextField ile StringField Karıştırılmamalıdır TopDocs

Bu Sayfayı Paylaş:

Kavram

Lucene

Tanım: Apache kurumununa ait, açık kaynak kodlu, text tabanlı arama (search) projesi. Lucene Core , Lucene projesinin arama ile ilgili ana projesinin adıdır ve Lucene ifadesi genellikle bu projeyi ifade etmektedir. Lucene, Lucene Core , Solr ve PyLucene projelerini de içerimektedir

Kavram

Lucene Core

Tanım: Java tabanlı, indexleme ve arama kütüphanesi. Genellikle Lucene ifadesi ile Lucene Core projesi kastedilmektedir.

Kavram

Solr

Tanım: Lucene projesi içinde, Lucene Core framework'ünü kullanan, arama ve indexleme için kullanılan metin bazlı search (arama) sunucusu. Solr, cache desteği olan, web arayüzü ile yönetilebilen, dağıtık olarak çalışabilen bir ürün veya sunucudur.

İpucu

Lucene, Lucene Core ve Solr Farkı

Lucene ana projenin adıdır. Lucene Core ise Lucene projenin, indexleme ve arama kütüphanesi-framework'üdür. Solr ise Lucene Core kütüphanesini-framework'ünü kullanan , web arayüzünde de yönetilebilen bir ürün-sunucudur.

Kavram

Directory

Tanım: Lucene'de, kullanılan bir klasörü belirten abstract ana sınıf. Bu sınıftan FSDirectory gibi sınıflar türemiştir.

Kavram

FSDirectory

Tanım: Lucene'de , index dosyalarının saklandığı klasör için kullanılan abstract ana sınıf. MMapDirectory, NIOFSDirectory, SimpleFSDirectory şeklinde üç farklı implement eden sınıf bulunmaktadır. open() methodu ile sisteme uygun en uygun FSDirectory implemenatation'u bulunmaktadır.

Kavram

Analyzer

Tanım: Lucene'de, bir dökümanı index'lenecek birimlerini tespit etmek, çözümlemek için kullanılan sınıfların türediği ana abstract sınıf.

Kavram

StandardAnalyzer

Tanım: Lucene'de, bir dökümanı index'lenecek birimlerini tespit etmek için kullanılan, StopwordAnalyzerBase sınıfından türeyen bir Analyzer sınıfı.

Kavram

IndexWriter

Tanım: Lucene'de, indexleme yapmak için kullanılan ana sınıf

Kavram

IndexWriterConfig

Tanım: Lucene'de , IndexWriter sınıfına konfigürasyon bilgisini eklemek için kullanılan sınıf

Kavram

Document

Tanım: Lucene'de , indexlenen ve aranabilen temel veri birimi ve bu birimi temsil eden ana sınıf. Bir Document birden fazla veri içeren Field'lerden oluşmaktadır

Kavram

Field

Tanım: Lucene'de, Document içinde veri saklayan birim ve bu birim için kullanılan ana sınıf. Bir Document birden fazla farklı veri tiplerinde (sayı, karakter, tarih vb..) Field içerebilmektedir. IntField, LongField, FloatField, DoubleField, BinaryDocValuesField, NumericDocValuesField, SortedDocValuesField, StringField, TextField, StoredField şeklinde alt sınıfları bulunmaktadır.

Kavram

TextField

Tanım: Lucene'de içerisinde metin içeren veri tipi ve bu tip için kullanılan sınıf

Kavram

StringField

Tanım: Lucene'de token'lerine ayrılmayan tek bir String'den oluşan veri tipi ve bu tip için kullanılan sınıf

İpucu

TextField ile StringField Karıştırılmamalıdır

Lucene'de token'lerine ayrılıp index'lenmesi gereken alanlar için TextField kullanılır. StringField ise bir string'in bir bütün olarak kabul edilmesini, token'lere ayrılmaması gerektiğini belirtir. Örneğin bir adres alanı TextField olarak verilmelidir. Örneğin ülke isimlerinin verildiği bir alan için StringField kullanılabilir.

Kavram

IndexReader

Tanım: Lucene'de IndexWriter ile oluşturulmuş index dosyalarını okumak için kullanılan ana sınıf

Kavram

IndexSearcher

Tanım: Lucene'de , IndexReader için arama işlemlerini gerçekleştiren ana sınıf

Kavram

QueryParser

Tanım: Lucene'de , arama yapmak için verilen sorgu ifadesini (query) işleyen ve değerlendiren ana sınıf

Kavram

Query

Tanım: Lucene'de , arama yapmak için kullanılan abstract ana sınıf

Kavram

TopDocs

Tanım: Lucene'de , IndexSearcher.search() method ile dönen arama sonucu tutan ana sınıf. Bu sınıftan scoreDocs değişkeni ile arama sonucu bulunan Document nesneleri için bilgi alınabilir

Kavram

ScoreDoc

Tanım: Lucene'de , arama sonucu dönen Document bilgisini tutan ana sınıf. ScoreDoc içindeki document id ile IndexSearcher sınıfından Document nesnesi elde edilebilirmektedir.

Örnek

Basit Bir İçerik İndexleme ve Arama Örneği

Aşağıdaki uygulama iki Document oluşturup index'lemekte ve arama yaparak sonucu ekrana basmaktadır :
import java.io.IOException;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.tr.TurkishAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.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;

public class Test {

	public static void main(String[] args) 
			throws IOException, ParseException {
		
		Directory dir = FSDirectory.open(Paths.get("/Index"));
		
		Analyzer analyzer = new TurkishAnalyzer();
		
		IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
		iwc.setOpenMode(OpenMode.CREATE);
		
		IndexWriter writer = new IndexWriter(dir, iwc);
		
		Document d1=new Document();
		d1.add(new LongField("id",1,Store.YES));
		d1.add(new TextField("content","Ali eve dün geldi",Store.YES));
		
		Document d2=new Document();
		d2.add(new LongField("id",2,Store.YES));
		d2.add(new TextField("content","Kaya dün evden döndü",Store.YES));
		
		writer.addDocument(d1);
		writer.addDocument(d2);
		
		System.out.println(writer.numDocs() + " document is indexed");
		
		writer.close();		
		
		IndexReader reader = DirectoryReader.open(dir);
		IndexSearcher indexSearcher = new IndexSearcher(reader);

		QueryParser parser=new QueryParser("content",analyzer);
		Query query=parser.parse("Ev");
		
		TopDocs topDocs= indexSearcher.search(query, 100); 

		System.out.println(topDocs.totalHits + " adet sonuc bulundu");
		
		ScoreDoc[] scoreDocs=topDocs.scoreDocs;
	
		for (ScoreDoc scoreDoc : scoreDocs) {
			Document doc = indexSearcher.doc(scoreDoc.doc);
			System.out.println("id:"+doc.get("id")+" content:"+doc.get("content"));
		}
	}
}
Test uygulamasında "Ali eve dün geldi" ve "Kaya dün evden döndü" şeklinde iki içerik index'lenmektedir. Sonra bu indexlenmiş verilerin bulunduğu klasör kullanılarak arama yapılmaktadır. "Ev" ifadesi arandığında iki içerikte sonuçta alınacaktır. Ekranda aşağıdaki gibi açıklamalar görünecektir:


2 document is indexed
2 adet sonuc bulundu
id:1 content:Ali eve dün geldi
id:2 content:Kaya dün evden döndü

Bu örneğin çalışması için lucene-core, lucene-queryparser, lucene-analyzers-common kütüphaneleri gerekmektedir. Maven kullanılan bir proje aşağıdaki gibi ekleyebilir : 

<dependencies>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>5.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>5.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>5.4.1</version>
</dependency>
</dependencies>





Kavram

MultiFieldQueryParser

Tanım: Lucene'de birden fazla alan için arama yapmak için kullanılan sınıf.

Örnek

Basit Bir İçerik İndexleme ve Birden Fazla Alan İçin Arama Örneği

Aşağıdaki uygulama iki Document oluşturup index'lemekte ve iki alan içinde arama yaparak sonucu ekrana basmaktadır :
import java.io.IOException;
import java.nio.file.Paths;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.tr.TurkishAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
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;

public class TestMultipleField {

	public static void main(String[] args) 
			throws IOException, ParseException {
		
		Directory dir = FSDirectory.open(Paths.get("/Index"));
		
		Analyzer analyzer = new TurkishAnalyzer();
		
		IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
		iwc.setOpenMode(OpenMode.CREATE);
		
		IndexWriter writer = new IndexWriter(dir, iwc);
		
		Document d1=new Document();
		d1.add(new LongField("id",1,Store.YES));
		d1.add(new TextField("content","Ali eve dün geldi",Store.YES));
		d1.add(new TextField("info","Veli ve Ahmet'de dün geldi",Store.YES));

		
		Document d2=new Document();
		d2.add(new LongField("id",2,Store.YES));
		d2.add(new TextField("content","Kaya dün evden döndü",Store.YES));
		d2.add(new TextField("info","Mustafa ve Ali'de dün evden döndü",Store.YES));

		writer.addDocument(d1);
		writer.addDocument(d2);
		
		System.out.println(writer.numDocs() + " document is indexed");
		
		writer.close();		
		
		IndexReader reader = DirectoryReader.open(dir);
		IndexSearcher indexSearcher = new IndexSearcher(reader);
		
		MultiFieldQueryParser parser=new MultiFieldQueryParser(new String[] { "content", "info" },
				analyzer);
		Query query = parser.parse("Kaya");
		
		TopDocs topDocs= indexSearcher.search(query, 100); 

		System.out.println(topDocs.totalHits + " adet sonuc bulundu");
		
		ScoreDoc[] scoreDocs=topDocs.scoreDocs;
	
		for (ScoreDoc scoreDoc : scoreDocs) {
			Document doc = indexSearcher.doc(scoreDoc.doc);
			System.out.println("id:"+doc.get("id")+" content:"+doc.get("content"));
		}
	}
}
Tek bir alanda arama yapmak için aşağıdaki gibi yapmak gerekir :
QueryParser parser=new QueryParser("content",analyzer);
Query query=parser.parse("Ev");
Birden fazla aramak için ise aşağıdaki gibi kod yazılır
MultiFieldQueryParser parser=new MultiFieldQueryParser(new String[] { "content", "info" },analyzer);
Query query = parser.parse("Kaya");
Bu örneğin çalışması için lucene-core, lucene-queryparser, lucene-analyzers-common kütüphaneleri gerekmektedir. Maven kullanılan bir proje aşağıdaki gibi ekleyebilir :
<dependencies>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>5.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-queryparser</artifactId>
<version>5.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-analyzers-common</artifactId>
<version>5.4.1</version>
</dependency>
</dependencies>

Kavram

Luke

Tanım: Lucene, Solr, Elasticsearch ile indexlenen bir klasör içindeki verileri görmenizi, arama yapmanızı ve incelemenizi sağlayan , grafik arayüzü (GUI) uygulaması.



Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir