2015-02-27 18 views
36

Günlerden beri Google'da arama yapıyorum ve birçok şeyi denedim ancak kullanıcı koleksiyonumda tam metin araması yapamıyorum. Ben vb ElMongo, firavunfaresi-tam metin, Mongoosastic gibi Gelincik birçok eklentileri çalıştıMongoDB ve Mongoose'da tam metin araması yapmanın en iyi yolu

Ben ElasticSearch çalıştı ama sorgulamak ve sayfalandırmamayı oldukça imkansızdı

... ... herkes gerçekten kötü belgelenmiş ve ben edilir Tam metin araması yapmanın nasıl olduğunu bilmiyorum. Ben tüm koleksiyonu aramak içindir gerekenleri ben hello world yazarsanız

user = { 
    name: String, 
    email: String, 
    profile: { 
    something: String, 
    somethingElse: String 
    } 
} 

Ben basit bir POST ile bir sayfaya bir arama girişini sahip eşleştirme alanları:

Yani, benim toplama normal koleksiyon arama sorgumun kelimeleri ve sonuçları al.

sayfa falan ...

Bunu başarmak için en iyi çözüm nedir başına 10 öğeleri gibi bir sayfalama işlemek için seçenekler olması da gerçekten güzel olacak? MongoDB 2.6 kullanıyorum * Mongoose, NodeJS ve ExpressJS ile.

Teşekkürler.

cevap

65

text index, Mongoose şema tanımınıza find sorgunuzu kullanarak, metin dizinindeki tüm alanları aramak için $text işlecini kullanabilirsiniz.

var schema = new Schema({ 
    name: String, 
    email: String, 
    profile: { 
    something: String, 
    somethingElse: String 
    } 
}); 
schema.index({name: 'text', 'profile.something': 'text'}); 

Yoksa endeksindeki tüm dize alanları dahil etmek istiyorsanız, '$**' joker kullanmak:

schema.index({'$**': 'text'}); 

metin diyelim ki, üzerinde arama, name ve profile.something desteklemek için bir dizin oluşturmak için

Bu, sayfalanmış bir metin araması sorgusu yapmanızı sağlar:

MyModel.find({$text: {$search: searchString}}) 
     .skip(20) 
     .limit(10) 
     .exec(function(err, docs) { ... }); 

Ayrıntılar için MongoDB Text Indexes belgelerini eksiksiz olarak okuyun.

+0

Cevabınız için teşekkür ederiz. MongoDB performansını bunu düşürmez mi? Bir soru daha: Endekslenecek alanları da seçebilir miyim? –

+1

@AyeyeBrazo İndeksi alanların nasıl seçileceğini göstermek için anser'ı güncelledim. Ekler ve güncellemeler ve ek depolama gereksinimleri sırasında herhangi bir dizin eklenir ve böylece her zaman dikkate alınmalıdır. Uzun aramanızdan sonra – JohnnyHK

+1

cevabınız kral! –

-9

Arama sorgusu için Elasticsearch eklentisini kullanabilirsiniz. Elasticsearch'te, belirli bir metni ve dizeyi gerçek zamanlı olarak belirtilen zaman süresiyle aramak için kendi özel arama sorgunuzu oluşturabilirsiniz.

Ancak bundan önce, MongoDB'de bulunan json belgelerinizi indekslemeniz gerekir. Elasticsearch server.then ile MongoDB'yi, Elasticsearch'in nehir fonksiyonlarını kullanarak, verilerinizin Elasticsearch sunucusunda indekslemesini yapmanız gerekiyor. Ardından, arama için özel sorgularınızı yapabilirsiniz.

İlgili konular