2013-06-03 26 views
31

Uygulamamın tam metin işlevselliğini sağlamak için kullandığım "anahtarlar" dizisinde bir dizin var.MongoDB Metin Araması VE birden fazla arama kelimesi

2.4.3 sürümü ile "text" dizin türünü kullanmak istiyorum. Ben dizi "tuşları" bir "metin" indeks türü sigortalı ve SUPER hızlı (eski anahtar kelimeler tam metin yönteminden daha hızlı) çalışmak gibi görünüyor.

Sorun şu ki, benim uygulama alanım kapsayıcı (AND) olduğunu varsayar. Varsayılan olarak, metin arama OR'larım parametrelerim.

Herkes, kapsamlı bir metin araması yürütmenin bir yolunu biliyor mu? Örneğin

:

db.supplies.runCommand("text", {search:"printer ink"}) 

yerine yazıcı veya mürekkep içeren tüm sonuçların, yazıcı ve mürekkep hem sonuç gerekir.

+5

Bu kelimeyi kelimesiyle öldürmeyen bir çözümü gerçekten takdir ediyorum. – Mitja

+2

Kelime kaynaklı çözüm bulabilir misiniz? – Zhomart

cevap

49

deneyin verin: Ayrıca

db.supplies.runCommand("text", {search:"\"printer\" \"ink\""}) 

, burada docs bir alıntı:

arama dizesi ifadeler içeriyorsa, arama arama AND ile, diğer şartları yerine getirir dize; Örneğin. "\" parıldamasını ara pırıltı \ "küçük yıldız" "pırıltı pırıltı" ve ("küçük" veya "yıldız") arar.

Yardım budur.

+2

sizi. KAYA. Bayım. Teşekkür ederim. – kmehta

+8

Not: Bu, metin dizininin, çöp kutusuna neden olan sözcük gibi harika özelliklerini fırlattığını unutmayın. Eğer metnim 'ise: Bunlar bazı test girişleri burada ,' {$ search: 'entry "}' ile ancak {$ search: "\" entry \ ""} 'ile değil. – Mitja

+0

@Mitja Kelime kökeni kaybetmeden bunu yapmanın herhangi bir yolu var mı? – Rohmer

2

Sen çift tırnak içinde her kelimeyi sarabilirsiniz: Kullanıcı bu işe yaramaz bir alıntı dize girmesi halinde bir dezavantajı vardır

let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' '); 
match.$text = { $search: keywords, $caseSensitive: false }; 

. İlk önce alıntılanan dizeleri ayrıştırmanız gerekir.

İlgili konular