Lucene nasıl çalışır


90

Lucene aramanın nasıl bu kadar hızlı çalıştığını öğrenmek istiyorum. Web'de herhangi bir yararlı belge bulamıyorum. Okuyacak bir şeyiniz varsa (lucene kaynak kodu dışında), bana bildirin.

Dizin ile mysql5 metin aramasını kullanan bir metin arama sorgusu benim durumumda yaklaşık 18 dakika sürer. Aynı sorgu için bir lucene araması bir saniyeden az sürer.


2
Bu sorunun topluluk wikisine dönüştürülmesini talep edebilir miyim? Lucene artık bir platform gibi geliyor.
asyncwait

Yanıtlar:


75

Lucene, ters çevrilmiş bir tam metin dizindir. Bu, tüm belgeleri aldığı, kelimelere ayırdığı ve ardından her kelime için bir dizin oluşturduğu anlamına gelir . İndeks tam bir dizgi eşleşmesi olduğundan, sırasız olduğundan, son derece hızlı olabilir. Varsayımsal olarak, bir varcharalandaki SQL sırasız indeksi de aynı derecede hızlı olabilir ve aslında büyük veritabanlarının bu durumda basit bir dizgi eşitliği sorgusunu çok hızlı bir şekilde yapabileceğini bulacağınızı düşünüyorum.

Lucene, işlem gerçekleştirme için optimizasyon yapmak zorunda değildir. Bir belge eklediğinizde, sorguların onu anında görmesini sağlamasına gerek yoktur . Ve mevcut belgelerdeki güncellemeler için optimize etmesi gerekmez.

Ancak günün sonunda gerçekten bilmek istiyorsanız kaynağı okumanız gerekir. Sonuçta, referans verdiğiniz her iki şey de açık kaynak.


Doğru anladıysam, metin arama motorlarını birbirinden ayıran şey, çok kelimeli aramaları nasıl ele aldıkları ve aramaların sonuçlarını gerçek zamanlı olarak birden çok dizine nasıl kattıklarıdır. Bunun için Lucene kaynağına danışmayı önermem. Metin arama teorisi hakkında biraz okumak muhtemelen daha iyi olurdu, @ alienCoder'in cevabı bana yardımcı oldu.
Chris Dutrow

1
@bmargulies, Eğer indeksleme "kelime başına" ise, o zaman stackoverflow kullanıcı araması stackoverflow.com/users neden alt dize eşleşmelerine izin veriyor?
Pacerier

2
Burası tüm kitap cevaplarının yeri değil. Orada temel kavramla ilgili çok sayıda detay var.
bmargulies

Ne demek "her kelime için bir dizin" ... "abc" yazmaya başlarsam, belgede "abc" yi nasıl bulacak?
Alexander Mills

1
Sözcükten belgeye bir dizin (B ağacı) belgedeki sözcüklere göre belgeleri arayabilir çünkü böyle bir dizinin tablosu (sözcük, belge) dizinin sözcük sütununda olduğu yerdir. Şöyle bir sorgu düşünün: "İçlerinde 'polis', 'suç', 'istatistik'" kelimeleri olan belgeleri bulun. Sözcük dizinini arayarak, bu sözcüklerden birinin bulunduğu O (N) belgelerini almak için üç günlük (N) araması yapabilirsiniz. Ardından, üç sözcüğün tümünü içeren belgeleri içeren bir küme oluşturmak için iki O (N) döngüsü yapabilirsiniz. Bu teorik olarak bir O (N) işlemi olmasına rağmen, çoğu belge üç kelimeye birden sahip değildir, bu nedenle O (n) burada n <N.
Calicoder

34

Lucene büyük bir endeks yaratır. Dizin, kelime kimliğini, kelimenin bulunduğu doküman sayısını ve kelimenin bu dokümanlardaki konumunu içerir. Yani tek bir kelime sorgusu verdiğinizde, sadece indeksi (O (1) zaman karmaşıklığı) arar. Daha sonra sonuç farklı algoritmalar kullanılarak sıralanır. Çok kelimeli sorgu için, kelimelerin bulunduğu dosya kümesinin kesişimini almanız yeterlidir. Bu yüzden Lucene çok çok hızlı.

Daha fazla bilgi için Google geliştiricilerinin hazırladığı bu makaleyi okuyun - http://infolab.stanford.edu/~backrub/google.html


8
O kağıda göz gezdirmek oldukça yardımcı oldu. Özellikle "4.5 Arama" aradığım cevaba sahipti. Spesifik olarak, tek tek kelimeler için bir O (1) karma arama kullanılıyormuş gibi ses çıkarır, ancak daha sonra sonuçları 40.000 belge sınırı ile birleştirmek için bir O (n) taraması kullanılır. Bu çalışmayı bölmek için harita azaltma algoritmasının kullanıldığını varsayıyorum, böylece kullanıcı anlık sonuçlar elde ediyor.
Chris Dutrow

Popüler bir algoritma, güvercin sıralama algoritmasıdır. Bununla ilgili pek bir şey bilmememe rağmen.
alienCoder

3
Bu makale eğlenceli: "Bu makalede, Google'a bir prototip sunuyoruz ...". Sanırım Google her zaman bir mega şirket değildi.
Buttons840

Lucene bilmiyorum ama bir soru var: Her aramada sıralama mı oluyor? Yoksa belgeleri önceden sıralanmış halde mi tutuyor? Belgeleri sıralamaya göre önceden tutuyorsa, birden çok sözcük sorgusunu nasıl sürdürüyor?
Vikas Prasad

Bağlantı şimdi koptu. @alienCoder
CEGRD

20

Tek kelimeyle: indeksleme.

Lucene, belgenizin çok daha hızlı arama yapmasına izin veren bir dizin oluşturur.

Liste O (N) veri yapısı ile karma tablo O (1) veri yapısı arasındaki aynı farktır. Listenin, istediğinizi bulmak için tüm koleksiyon boyunca gezinmesi gerekir. Karma tablo, istenen öğenin tam olarak nerede olduğunu bulmasını ve basitçe getirmesini sağlayan bir dizine sahiptir.

Güncelleme:

"Lucene dizin aramaları mysql dizin aramalarından çok daha hızlı" derken ne demek istediğinizden emin değilim.

Benim tahminim, bir belgeyi aramak için "belge GİBİ '% ifade%'" olarak MySQL kullanıyorsunuz. Bu doğruysa, MySQL her satırda O (N) olacak bir tablo taraması yapmak zorundadır.

Lucene, belgeyi jetonlara ayırır, bunları sizin yönünüzde n-gram olarak gruplandırır ve bunların her biri için dizinleri hesaplar. Dizine alınmış Lucene belgesinde bir kelime bulmak O (1).


10
Evet, indeksleme kısmını anlıyorum, ancak yine, lucene indeks aramaları mysql indeks aramalarından çok daha hızlı. Bu nasıl oluyor
Midhat

9

Lucene, Terim frekansı ve Ters belge frekansı ile çalışır . Belge ile her kelimeyi eşleyen bir dizin oluşturur ve belgedeki ters dizinden başka bir şey olmayan sıklık sayısıdır.

Örnek :

Dosya 1: Rasgele Erişim Belleği ana bellektir.

Dosya 2: Sabit diskler ikincil bellektir.

Lucene bir ters indeks oluşturur.

Dosya 1:

Terim: Rastgele

Frekans: 1

Pozisyon: 0

Terim: Bellek

Frekans: 2

Pozisyon: 3

Pozisyon: 6

Böylece aranan içeriği hızlı bir şekilde arayabilir ve alabilir. Arama sorgusu için çok fazla eşleşme olduğunda, sonucu ağırlığa göre verir. 4 kelimeyi tek tek aradığı "Ana Bellek" arama sorgusunu düşünün ve sonuç şöyle olacaktır:

Ana

Dosya 1: Frekans - 1

Hafıza

Dosya 1: Frekans - 2

Dosya 2: Frekans - 1

Sonuç, Dosya1 ve ardından Dosya2 olur . 'Ve', 'veya' gibi en yaygın sözcüklerin ağırlıklarına kapılmamak için ',' ters belge sıklığını dikkate alır (yani 'belge seti arasında en popüler olan sözcüğün ağırlığını azaltır).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.