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 B Kelime 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)
+ ve Sorgu Dili 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 Ortak Alışveriş Siteleri 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ı 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 Ufukta Ufukta (Hatalı çekim, Tekrar Çekilecek) Bilinmiyor Kapsam Dışı (Filtreler) Domain Name Filtresi Adres saerı RegEx filtresi Başlangıç Adresleri İşlenmiş Sayfalar Ufuk Başlangıç Adresleri İşlenmiş Adresler Ufukta Bilinmiyor Terör ile ilgili 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