Açık Kaynak Arama Teknolojileri: Lucene, Solr ve Nutch

Transkript

Açık Kaynak Arama Teknolojileri: Lucene, Solr ve Nutch
Açık Kaynak Arama Teknolojileri:
Lucene, Solr ve Nutch
Gönenç Ercan
Mantis Yazılım Ltd.
Arama Motorları Nasıl Çalışır?
Sorgu yapılınca
İnternet’teki bütün
sayfaları tek tek açıp
kelimeler geçiyor mu
diye bakıyor.
Bu yanlış açıklama
sonrası herkes
salonu terk
etmediyse….
Cevaplar Kitabın Arkasında!!!
Arama motorunun temel
çalışma prensibi, en eski bilgi
teknolojilerinden biri:
Ders kitaplarının sonundaki dizin
kısımları
A
Ada ---- 23, 32, 43, 56
Araba --- 2, 10, 23
Kelime
B
Baraka --- 3, 56
Belde --- 5, 20, 34
Geçtiği
sayfalar
Dizin Yapısı
Bir doküman
örneği serbest
metin
İkinci
dokümanın
cümlesi
Üçüncü
doküman
gene serbest
metin
Bir
1
cümle
2
doküman
1, 2, 3
gene
3
serbest
2, 3
metin
2, 3
ikinci
2
¤  Dokümanlar dizinlenmek için kelimelerine ayrıştırılır.
¤  Kelimelerin hangi dokümanda geçtiği kaydedilir.
¤  Sorgu eğer ‘cümle’ kelimesi ise, 2. doküman cevap olarak
döndürülür.
¤  VEYA = Birleşim, VE = Kesişim.
Ekstra bilgiler
¤  Tırnak ile arama, deyim olarak. ‘Türkiye Cumhuriyeti’.
¤  Kelime bazlı çalışan sistemler. Bir torba dolusu kelime.
¤  Bütün sorgulanabilecek deyimler mi bilinmeli?
¤  Çoklu kombinasyonlar mı tutulmalı.
¤  Her kelimenin pozisyonu mu tutulmalı.
¤  Sonuçlar ile birlikte hızlıca özet gösterilmesi, aranan kelimelerin
özette işaretlenebilmesi.
¤  Metnin özeti veya hepsi saklanmalı.
¤  Kelimeye göre doküman listesi ve dokümanlara özel bilgiler.
Lucene Kütüphanesi
¤  Kelime Dizini
¤  Dokümanlar ile ilgili bilgiler.
¤  Dosyalarda en iyi ve hızlı şekilde saklanmasını sağlayan
kütüphane.
¤  Doug Cutting tarafından geliştirildi. (Anneannesinin göbek adı)
Lucene Temel Bileşenler
¤  Dizinleme: Dosya İşlemleri, yazma ve okuma.
¤  Analyzers: Dizinlenecek dokümanların kelime torbasına dönüştürülmesi.
(Küçük/Büyük harf. Hangi kelimeler? ‘Kitap’ ve ‘kitaplar’).
¤  Sorgu İşleme: Sorgu Dili, sorguya benzerlik hesaplama.
Dizinleme Dosya İşlemleri
¤  Dizinin nasıl saklanacağından Directory soyut sınıfı sorumlu.
¤  Hafızada ve veritabanında saklanabiliyor, ama genel kullanım
dosya kullanmak.
¤  MMapDirectory; Hafızaya haritalanmış dosyalar.
¤  NIOFSDirectory; Java NIO ile yazılmış Directory
gerçekleştirmesi .
¤  İşletim sistemine göre tavsiye edilen değişiyor. Onun için seçimi
Lucene’e bırakmalı:
FSDirectory.open(new File("/home/gonenc/luceneIndex"));
¤  102GB/saat, Lucene 4.0’da 270 GB/saat olması bekleniyor.
Analyzers- Metinlerin Kelime Kümesine
Çevirilmesi
¤  Bir karakter akımı(Stream) dosyanın kelimelere çevirilmesi için
Lucene Analyzer sınıfını kullanır. Karakter akımı kelime akımına
çevirilmiş olur.
¤  Farklı ihtiyaçlar için paket ile birlikte gelen StandardAnalyzer
veya Snowball gibi gerçekleştirmeler var.
¤  Analyzer sınıfı aslında, metnin nasıl işleneceğinin konfigürasyonu
yapılan bir kod.
¤  Mevcut sınıfları genişleterek farklı yöntemler geliştirmek
mümkün.
¤  Örnek:
¤  Zemberek kullanarak Türkçe kelimelerin eklerinin atılması
sağlanabilir.
¤  Apache UIMA ile çok daha karmaşık analizler yapılabilir. (Lucas)
Sorgu Dili
¤  + ve –
¤  AND, OR, NOT
¤  *, ?
¤  kelime~ (Lucene 3.x’de çok yavaş. Lucene 4.x ile çok
hızlanacak)
¤  "jakarta apache"~10
¤  [20020101 TO 20030101]
¤  jakarta^4 apache
Sorguya Benzerlik Hesaplama,
Sıralama
¤  Genel mantık: Aranan kelimeler, dokümanda hangi yüzde ile
geçiyor.
¤  Bir kelime aranıyor, doküman 1’de 100 kelimenin 10 tanesi o kelime,
doküman 2’de 10000 kelimenin 20 tanesi o kelime. Doküman 1
daha ilişkili.
¤  2 kelime aranıyor, 1. kelime 1000 dokümanda geçiyor, 2. kelime 10
dokümanda geçiyor. 2. kelimenin sıralamada daha fazla etkisi
olsun!
¤  Bu iki kurala uygun benzerlik yöntemi Vektör Uzay Modeli ve
tf*idf.
¤  Lucene 4.0’da daha fazla opsiyon olacak, testlerde yeni
yöntemlerin sıralamaları daha iyi gibi görünüyor.
Alanlar (Fields)
¤  Lucene doküman, ve dokümanın içinde alanlar tutuyor.
¤  Bu sayede örneğin bir kitapevi için aşağıdaki gibi alanlar
yaratılabilir:
¤  Başlık
¤  Özet
¤  Arka Kapak
¤  Yazar
¤  Arama Başlık’da geçsin ama özet içinde geçmesin.
¤  Herhangi birinde geçsin.
¤  baslik:sorgu^2 özet:sorgu^0.01
Kod Örneği
Analyzer analyzer = new PorterStemAnalyzer(new String[0]);
Directory directory = FSDirectory.open(new File(”FolderPath"));
IndexWriter indexWriter = new IndexWriter(directory, new
IndexWriterConfig(Version.LUCENE_33, analyzer));
Document document = new Document();
Field titleField = new Field("title", "", Store.YES, Index.ANALYZED);
document.add(titleField);
titleField.setValue("Dizinlenecek metin");
indexWriter.addDocument(document);
indexWriter.commit();
indexWriter.close();
Lucene’in kullanımı
¤  Bir çok ürün arama çözümü için Lucene kütüphanesini
kullanıyor.
¤  IBM OmniFind
¤  Eclipse
¤  Alfresco
¤  Atlassian JIRA ve Confluence
¤  Linkedin ve MySpace
¤  Özellikle uygulamaların içine gömülü arama çözümü olarak çok
uygun.
Kurumsal Arama
Birden fazla
uygulama tek
arama
motorunu
sorgulasın
Birden fazla
kaynak tek bir
arama motoru
aracılığıyla
dizinlensin.
Okuyucu Yorumları
& Süreli Yayınlar
Sunucuları
Ortak Alışveriş
Siteleri
Kurumsal Arama
Motoru
Yayınevi
Sayfası
Kitaplar Veri
Tabanı
Kurumsal Arama İhtiyaçlar
¤  Birden çok kaynağın tek bir yere dizinlenebilmesi
¤  Çözüm: dizinleme yapılacak veriler arama sunucusuna aktarılır.
Lucene ile orada dizinlenir.
¤  Çözüm: Dizinleme yapılacak sunucu, istemcilerin kullanabileceği
RPC metodu sunar.
¤  Birden çok sunucu ve uygulama ortak arama motoruna sorgu
atabilsin.
¤  Çözüm: Web Servis, REST servisi gibi standart bir yöntem ile arama
uygulamalara açılsın.
¤  Farklı ara katman Teknolojiler ve Lucene ile bunları yapmak
mümkün. Fakat pahalı olabilecek bir geliştirme süreci.
SolR – Kurumsal Arama
Rest Güncelle
Veri Kaynağı
Rest Sunu
¤  Lucene dizinleme altyapısının üstüne daha gelişmiş ve esnek
katmanlar sağlanması: SolR
¤  Http protokolü üstünden veri kaynakları dizini değiştirebiliyor.
¤  Http protokolü üstünden sunum yapan uygulamalar arama
yapabilir.
SolR Şema Konfigürasyonu
<schema name="kitapEvi" version="0.1">
<types>
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt” />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType> …
<fields>
<field name="content" type="text_general" stored="true" indexed="true"/>….
¤  Kod ile yapılan alan tanımları daha düzeli ve rahat takip
edilebilir şekilde xml dosyasında tanımlanıyor.
¤  Veri tipleri eklenebiliyor, böylelikle her alan için tekrar
tanımlanan özellikler sadece bir kere eklenebiliyor.
SolR Altyapısı
¤  SolR’da Arama Bileşenleri SearchComponent interface soyut
sınıfını gerçekleştirir.
¤  Arama Bileşenleri arka arkaya çalışarak, arama sonuçlarını
zenginleştirirler.
¤  Örneğin: Arama sonucunda sorguya göre öneri getirme. Did
you mean ___?
¤  SearchHandler interface soyut sınıfı, aramayı esas yapan ve
bileşenleri çalıştıran REST servisi.
¤  UpdateHandler, yeni bir doküman eklenirken kullanılan REST
Servisi.
SolR SearchHandler tanımı
<requestHandler name="search" class="solr.SearchHandler" default="true">
<lst name="defaults">
<int name="rows">10</int>
</lst>
<lst name="appends">
<str name="fq">inStock:true</str>
</lst>
<lst name="invariants"> <str name="facet.field">cat</str> </lst>
<arr name="components"> <str>nameOfCustomComponent1</str> </arr>
</requestHandler>
¤  solrConfig.xml ile yapılabilir.
¤  Parametreler tanımlanır. (değiştirilebilir (default), eklenenler,
değiştirilemeyenler)
¤  Kullanılan birleşenler
SolR SearchHandler
http://localhost:8080/solr/search?q=deneme&rows=100
¤  Sorgu ile birlikte default değerler değiştirilebilir.
¤  Örneğin: Sorgu olarak ‘deneme’ ve gösterilen kayıt sayısı olarak
100 yapılabilir.
¤  Sayfada gösterilen kayıt sayısını değiştirilemez yapmak için rows
tanımını invariants’a aktarmak gerekir.
Writer Tanımları
JSON
Velocity
XML
CSV
Solr Dizini
Java Binary
¤  Request Handler sonuçları parametrelere göre her bileşen için
hazırlar
¤  Writer kısmı farklı çıktılar verebilecek şekilde, sonuçları sunar.
¤  http://localhost:8080/solr/search?q=deneme&rows=100&wt=xml
Arama Birleşenleri (Search
Components)
¤  Benzer sayfaları getir. (sayfanın vektörüne en yakın diğer
sayfaları getir)
¤  Highlight (özet göster, özetin içindeki arama kelimelerini
renklendir)
¤  Suggest (Sorgu kelimelerindeki yazım hatalarını düzeltip bunu
mu demek istediniz gibi çıktı vermek)
¤  Gruplama (Aynı alan adından gelen sayfaları gruplayarak
göster)
¤  Harici Alan tutma. (Sürekli değişen bir alana göre sıralamanın
etkilenmesini sağlar. Örneğin: sayfanın kullanıcıların sayfayı
ziyaret sırasına göre sonuçlarda öne çıkarma. )
Ek Alanlar ile Navigasyon
• 
• 
• 
• 
• 
• 
Facet özelliği sonuçların alanlara göre keşfedilmesini sağlar.
Sorgunun geçtiği dokümanların tarih aralıklarına göre gösterimi.
Fiyat Aralığına göre gruplamalar.
Spatial Yakınlığa göre bile gruplama yapılabilir.
Sonuçlarda oluşan her grup için kaç doküman olduğu gösterilir.
Sonuçlarda seçilen grup(lara) göre filtreleme yapar.
İçerik Ekleme
JSON
XML
Solr Dizini
Java Binary
¤  Http tabanlı UpdateHandler kullanılarak yapılır.
¤  Update Handler’a Birleşen Eklenebilir. Örneğin: Parça parça
dosyaların hash’lerini alan Benzer içerik tespit yöntemi
Performans için Önbellek
kelime1
Kelime1 kelime2
¤  Her sorgu dizin içerisinde her kelime için, kelimenin geçtiği
dokümanları bulur.
¤  Bu işlem dizin büyüdükçe zaman almaya başlar.
¤  Arama motorlarında performansın en kritik etkenlerinden birisi
Önbellekdir.
¤  Önbellek kelime listelerini hafızada saklar. Aynı kelime ile bir
sorgu geldiğinde direkt hafızadan cevap verir.
Yönetim Araçları (1)
¤  Metin işleme araçlarının test edilmesine yarar.
¤  Şemada tanımlı kurallar sonuçu, bu metin nasıl işlenecek sorusunu cevaplar.
Yönetim Araçları (2)
¤  SolR’in çalışmasını ve kaynak yönetimini gösterir.
¤  Her alan için ayrı ayrı istatistik verir
¤  Alan içerisinde en çok kullanılan kelime
¤  Alan için toplam kullanılan disk alanı
¤  Önbellek kullanımı
Tek SolR birden fazla dizin!
¤  Bazen tek bir dizin yeterli olmayabilir.
¤  Bir kullanılan genel dizin gerçek veriyi tutarken, diğer dizin yedek olur
ve development işlemleri onun üstünde yapılır.
¤  Kurum birden fazla bağımsız dizinlemeye ihtiyaç duyabilir. Örnek:
Kitaplar ve Müzik CD’leri farklı dizinlerde farklı alanlar ile kullanılabilir.
¤  Core desteği
¤  SolR birden fazla dizini Core adıyla kullanır.
¤  Yeni Core yaratılabilir.
¤  Silinebilir.
¤  Yerleri değiştirilebilir.
¤  Core sadece disk alanını fazla kullanır, sorgu işlemede alanlar ile
tek dizin kullanmaya göre daha iyi performans verir.
Yatay Ölçeklenebilirlik
Dikey
Ölçeklenme
Yatay
Ölçeklenme
¤  Tek güçlü sunucu mu? Dikey. Sonunda bir sınır var. Dar boğaz Hard Disk’e
yazma.
¤  Yatay Ölçeklendirme, birden fazla SolR çalışıyor:
Doküman sayısı çok ise, dokümanlar farklı SolR sunucularına gönderilir. Sorgular
bütün sunuculara gider
¤  Kullanıcı sayısı çok ise, dizin sunucularda kopyalanır (replication). Kullanıcılara
farklı sunucular servis yapar.
¤  Çok doküman, çok kullanıcı: İkisinin kombinasyonu.
¤ 
SolR Güvenliği
¤  Tamamiyle açık bir sistem olduğu için güvenlik açıkları
bulunmakta. (cross-scripting)
¤  Arada bir sunucu ve Http protokolü olduğu için, standart Java
Servlet Container veya güvenlik yöntemleri kullanılabilir.
¤  Https ile çift taraflı sertifika kullanımı (sorgulama ve/veya
güncelleme için)
¤  Http ile kullanıcı adı şifre ile giriş yapma
¤  … Tamamen kendi geliştireceğiniz bir güvenlik protokolü
SolR’in içini Doldurmak
¤  SolRJ kullanarak herhangi bir Java uygulamasından herhangi
bir veriyi sunucuya aktarabiliriz.
¤  Veritabanı
¤  Windows Share
¤  …
¤  Bir Http Formu ile direkt olarak sayfalar dizinlenebilir hale
getirilebilir (sadece bir Html dosyası yeterli)
¤  Http protokolü üstünden XML ile herhangi bir programlama dili
bilgi aktarabilir.
¤  Bir Web örümceği Kullanmak:
¤  Heritrix’in SolR eklentileri var.
¤  Nutch 1.2’den itibaren dizinlemeyi SolR’a yapıyor.
Nutch (Web Arama Motoru)
¤  Hadoop Mimarisi;
¤  Doug Cutting, Google Big Data makalesinden sonra aklında Nutch
olarak projeyi başlattı. Hadoop: Oğlunun oyuncak fili.
¤  Yahoo destekliyor.
¤  Bir çok projede kullanılıyor.
¤  Sayfaları dolaşıp onları çekebilecek bir yazılım.
¤  Web Örümceği Hadoop ile bulut mimarisinde çalışabiliyor. Bir
düzine masa üstü bilgisayar ve iyi bir network bağlantısı ile
internetteki sayfaları çekebilme.
Web Yapısı
¤  Başlangıç Adresleri ¤  İşlenmiş Adresler Başlangıç
Başlangıç Adresleri
Adresleri
İşlenmiş
İşlenmiş Adresler
Sayfalar
Ufuk
Bilinmiyor
Ufukta
Terör ile ilgili
¤  Ufukta ¤  Ufukta (Hatalı çekim, Tekrar Çekilecek) ¤  Bilinmiyor ¤  Kapsam Dışı (Filtreler) ¤  Domain Name Filtresi ¤  Adres saErı RegEx filtresi Kapsam Dışı
Nutch Özellikler
¤  Karşı sunuculara saldırı olmayacak sınırlarda kurallara uygun
istek gönderme. (robots.txt)
¤  Birden fazla Thread ile çok hızlı sayfa çekebilme. (Tek bilgisayar
ve 10 Mbit hat ile günde 1 milyondan fazla sayfa çekilebilir)
¤  Sayfa çekme sıralarının ayarlanabilir olması (PageRank benzeri
bir algoritma ile)
¤  Sayfaların işlenmesinde Parser eklentileri ile sitenin özelliklerine
göre bilgi çıkarma eklenebilir. (Örnek: Gazete haberlerinde tarih
hep aynı yerde bulunuyor ise, yayın tarihi çıkartılabilir)
¤  Sayfa bağlantı analizleri, Sıralamalarda daha çok bağlantı alan
sayfalar öne çıksın veya bu sayfaya bağlantı veren sayfalar
hangileri?
Nutch Esneklikler
¤  Sayfa çekme sırasının belirlenebilmesi. (ScoringFilter)
¤  Dizinleme sırasında ek alanlar. (IndexingFilter)
¤  Sayfanın değişiklik için tekrar çekilme zamanı. (Scheduler)
Nutch Trunk ve Nutch 2.0
¤  Nutch projesi bir süre önce SVN’de branch açtı.
¤  Nutch 2.0 projesi, arka planda düz Hadoop dosyaları yerine veri
tabanı kullanıyor.
¤  Gua katmanı ile Cassandra, Hbase, MySQL gibi farklı
veritabanları kullanılabilecek.
¤  Avantajlar:
¤  Esneklik (Yönelimli bir Crawler yazmak daha kolay)
¤  Güvenilirlik (Her sayfa çekildiğinde veri tabanına kayıt atıyor). Web
örümceği işini bitirmeden dursa da bilgi kaybı olmuyor.
¤  Veri Yönetimi (Database teknolojileri paralelde geliştikçe, onları
kullanmak mümkün.)
¤  Dezavantaj: Stabil bir çıktısı yok!
Teşekkürler…