2009-02-02 23 views
5

Arama işlevselliğini (hem veritabanı içeriği hem de yüklenen belgeler için) sorunsuz bir şekilde kullanmak için Lucene.net kullanıyorum. Artık 5000'den fazla belgeyi (çoğunlukla PDF'ler) indekslediğim ve sorgulamanın biraz yavaşladığı bir sitem var.Caching Lucene.net arama sonuçları

Hızlandırmanın en iyi yolunun bir çeşit önbelleğe almayı uygulamak olduğu varsayılmaktadır. Nereden başlayacağımı gösteren herhangi bir işaretçi/örnek verebilir mi? Önbelleğe alma dışında başka önerileriniz varsa (örneğin, birden çok dizin kullanmalı mıyım?) Bunları da duymak istiyorum.

Düzenleme: Yavaş sorgulama sorumlu

Salak kullanıcı hatası. Görüntülediğim "sayfa" yerine, tüm sonuçların bir kez oluşturulduğu vurguları oluşturuyordum. Hata.

cevap

5

Burada büyük bir varsayım yapacağım ve indeksleri sorgulamak için aramalar arasında dizin aramanıza asılamayacağınızı varsayalım.

Eğer bu doğruysa, dizin sorgulayıcılarını dizininize tüm sorgular için kesinlikle paylaşmalısınız. Endeks büyüdükçe (ve bunun bir faktör haline gelmesi için gerçekten çok büyük olması gerekmiyor), endeks araştırmacısının yeniden yapılandırılması giderek daha fazla bir yük haline gelecektir. Bunu doğru bir şekilde yapmak için, sorgu ayrıştırıcı sınıfına erişimi eşitlemeniz gerekir (iş parçacığı güvenli değil).

BTW, Java dokümanlar (Ben bulunduğum gibi) .net sürümü için geçerlidir. senin sorunla ilgili daha fazla bilgi için

buraya bakın: http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

+0

Bağlantı güzel, teşekkürler – Nick

+0

Hiçbir probs. Web sitenizde her şey yolunda mı? –

1

Lucene, dizin alma işlemini hızlı bir şekilde yapmak için kendi dahili "önbellekleme" mekanizmasını kullanır. Bununla birlikte, önbelleğe alma işleminizin burada olduğunu düşünmüyorum.

5000-indeksli bir belge boyut olarak önemsizdir, ancak bu büyük ölçüde endeksinizi, indekslemenizi/depolamanızı, sorgulama şeklini (operasyonel), belge boyutunu, vb. Nasıl oluşturduğunuza bağlıdır.

Lütfen dizininizle ilgili olabildiğince fazla bilgi içeren boşlukları doldurunuz. ,

RAMDirectory idx = new RAMDirectory(); 

// Make an writer to create the index 
IndexWriter writer = 
    new IndexWriter(idx, new StandardAnalyzer(), true); 

bu sizin için çalışıyorsa ama çok fazla koç kullanıyor:

Lucene.Net.Store.RAMDirectory 

Sen gibi kullanabilirsiniz:

1

Birincisi, Lucene kendisini bir bellek dizinleri sürümünü destekler bir sarıcı yazın ve bunu bir Arayüz veya web servis olarak görün. Veya, nesnelerin önbellekten ne zaman ayrıldığını kontrol etmek için sorgulamak istediğiniz şeyi önbelleğe almak isterseniz, Lucene'nin anahtar kelimelere göre en yaygın sonuçları önbelleğe alan bir sarmalayıcı yazabilirsiniz.

Önceden tercih edilenleri tercih ederim. RAMDirectory kullanarak Lucene mağazasında dolaşan bir web hizmeti veya hizmet projesi oluşturun. Bu şekilde, endeks çok büyükse ve neredeyse anlık sonuçlara sahipse, web servisini bir sürü ram ile başka bir sunucuya yükleyebilirsiniz.

1

sizin endeksleri optimize emin olun.

Ayrıca, bu önbelleği uygulamak için hızlı/kolay/etkili bir yoldur: HttpRuntime.Cache.Add (...);

ASP.Net önbelleğini herhangi bir proje/kitaplık türünden kullanabilirsiniz.

İlgili konular