250 bin'den az potansiyel kayıt için hafif doküman indeksleme


10

Son zamanlarda kendimi belge indeksleme motorlarının sınırlamalarında şike buluyorum. Bazı oldukça sağlam arama yeteneklerine ihtiyaç duyan küçük bir web sitesi geliştiriyordum, ancak donanım kısıtlamaları nedeniyle bu ihtiyacı çözmek için bir Lucene-ish çözümü (normalde yaptığım gibi Solr veya Elastik Arama gibi) kullanamadım.

Ve o zaman bile, veritabanı yoğun olan bazı karmaşık veri ve hesaplamaları sunmam gerekiyorken, 250 bin potansiyel kayıttan fazlasını işlememe gerek yoktu. Tüm Solr veya ES örneğini sadece bunun üstesinden gelmek için dağıtmak bir atık gibi görünüyordu.

Bunu düşündükten sonra, oldukça büyük bir sorun gibi görünüyor. Çoğu kişi arama gereksinimlerini yalnızca SQL ile halleder. Verileri için sadece SQL sorguları çalıştırıyorlar ve işte bu. Arama yetenekleri de korkunç oluyor.

  • Bir battaniye tam metin joker karakteri araması yapmak, bazı sistemlerde (özellikle paylaşılan ana bilgisayarlar) acı verici bir şekilde yavaş olabilir ve özellikle karmaşık sorgularınız ve çok sayıda birleşiminiz varsa veritabanınızı zorlayabilir.

  • Kullanıcıdan gelen tek bir istek üzerine birden çok sorgu gerçekleştirirsiniz. Her zamankinden daha karmaşık sorgularla bu sorunu çözebilirsiniz, ancak önceki noktaya bakın.

  • Tam metin motorlarda tipik olarak özellik eksikliği.

Veritabanları bir sunucu olarak dağıtılma ihtiyacı ile aynı soruna sahipti ve sonra SQLite geldi ve aniden tek bir dosyada bulunan bir veritabanını dağıtabiliriz. Google'ım hiçbir şey üretmedi - tam metin dizine ekleme / arama için böyle bir şey olup olmadığını merak ediyorum.

Hafif belge dizine ekleme (örn. Başka bir sorunun cevabında açıklandığı gibi ) veya bu durumlar için SQL kullanmaya devam etmeye karar verirken dikkate alınması gereken faktörler nelerdir ?


5
Lütfen pazar araştırmanızı burada yapmayın. Soru burada konu dışı. Öncelikle SSS'lerini okumalısınız , ancak başlangıçta sorma şansınız daha iyi olabilir .
Oded

9
Whoa - Burada bir şirket ya da başka bir şey kurmak istemiyorum. Bu sadece teknolojinin mevcut kutu dışında bir durumda veya farklı bir çözümde kullanmasını arayan dürüst bir sorudur.
Jarrod Nettles

16
Bu, yazılım geliştirmedeki kavramsal sorunlar hakkında bir sitedir. Lütfen yazılım geliştirmede karşılaştığınız kavramsal sorunları sormayın.
psr

3
Orada iyi bir soru var ... Bence daha net ve spesifik hale getirmek için temizlenmesi gerekiyor.
GrandmasterB

3
SQLite ile ilgili tek şikayetiniz metin endeksleme eksikliği ise, neden sadece SQLite'ın FTS4 genişletme modülünü kullanmıyorsunuz ?
Brian

Yanıtlar:


2

Biliyor musun, redis kullanmayı düşün.

  • Bağlam fikrini kullanın . Belgeler hakkında daha fazla bilgi sahibi olmadan derinlemesine gitmek zor olurdu. Genellikle birçok şeyi belge başlıklarından ayırt edebilirsiniz. Her belgenin profilini oluşturmak, tıpkı web taraması gibi temel ilk adımdır.

  • Bir anahtar kelimeler sözlüğündeki kelimelerin her bir dokümanı sayın. Toplam proje için her kelimenin popülerlik sayısını takip edin. Bir belgedeki veya kümedeki yüksek alaka düzeyini tespit edebiliyorsanız, bu sayı için yineleyiciye daha fazla ağırlık ekleyin.

    Bunun yaptığı ilk şey, tüm setinizdeki her şey dahil bir kelime listesi vermektir. Bu listede BULUNMAYAN herhangi bir şey, 'sonuç yok'un otomatik olarak geri döndürülmesi. Sonuçların popülaritesinin en alt% 5-20'sinden daha düşük sıralamaya (dizinde arama sorgusu çalıştırırken) da sadece sonuç olmadığını söyleyebilirim.

  • Eğer varsa do REDIS gibi bir şey ile gitmek, hatta sadece açıklayıcı dosyaları veya mini db dosyası ve hafızaya ileri her özel belge arkasını ve açıklamak sayfa nesnelerle belgeleri eşleştirmek kendi hafıza yapısını yapmak. Alanlar için rekabet etmelerini sağlayarak veya her aramada büyüyen yaşamak için bir süre vererek, ortak aramaları bellekte tutun.

  • Daha ileriye gitmek için, bir bağlantı / ref / pointer / index / iki veya daha fazla belgeden herhangi birini ve bir anahtar kelime veya kelime öbeği havuzunu gruplayan referans verilerini kaydetmeye başlayın. Temelde pompalanan bir etiket bulutu alırsınız.

  • Dahası, sözlüğünüzdeki bir kelime, benzer meta veri / başlıktaki belgelerde yaygın olarak tam bir dizeyle takip edildiğinde veya alındığında izleyerek ifade algılama yapın. Bu yoğun bir işlemdir ancak verileri oluşturmak için yalnızca bir geçiş gerekir.

  • Verilerinizi ayırmanın ve birbiriyle ilişkili grupları gerçek kullanımda tutmanın ne kadar çok yolu varsa, o kadar iyidir.

  • Bir kullanıcı ilk üçte olmayan bir sonucu her tıkladığında izleyerek doğruluk olasılığını bağlayın. Mükemmel sonuçlar vermeyen kullanıcı aramalarını izleyerek ifade algılamayı geliştirin. Sorgularınızı müşterilerin aramalarına göre olmaya zorlayın.

  • Belge güncellemelerini izlemek zorunda mısınız? Chronjobs / kabuk komut dosyası veya zamanlanmış görevler / toplu komut dosyası yardımcı olabilir. Tabii ki zamanlama ve komut dosyası oluşturma için çeşitli seçenekler vardır.

  • Atık disk, hız kazanmak, karmaşıklığı kaybetmek. Belgelerinizdeki birden çok ağacı ve / veya belgelere bağlantı ağaçlarını kaydedin. Yalnızca ölçütleri karşılanmış ağaçları arayın veya en azından çoğu durumda daha hızlı sonuç almasını tercih edin.

  • Kendi hafif permütasyon motorunuzu yapın veya hızlı karakter algılama kullanan ve normal ifade içermeyen bir motor bulun. Ya da sadece birkaç saat içinde normal ifadeyi kullanarak bir tane yapın, ancak performans farkı burada yeterli aramalar için fark edilir.

  • Çok şey.

Bunlar, sağlam belge indeksleme ve aramanın uygulanması için mümkün olan çözümlerdir. Herşey dahil değil. Ve muhtemelen yedek bir kutu almak, üzerine bir sinir ağı atmak ve bu sinir ağına güzel bir web arayüzü yapmak için birkaç gün geçirmeniz daha iyi olur.

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.