2013-06-03 14 views
31

Mam indeks na tablicy "klucze", których używam, aby zapewnić pełną funkcjonalność tekstu do mojej aplikacji.Wyszukiwanie tekstu MongoDB i wiele słów wyszukiwania

Wraz z wersją 2.4.3, chciałbym użyć typu indeksu "tekstowego". Utworzyłem indeks "tekstowy" na tablicy "klucze" i wygląda na to, że działa SUPER szybko (szybciej niż moja stara metoda pełnotekstowa słów kluczowych).

Problem polega na tym, że moja aplikacja zakłada, że ​​pola są włączone (AND). Domyślnie wyszukiwanie tekstu ORs moje parametry.

Czy ktoś wie, w jaki sposób można uruchomić wyszukiwanie tekstu w całości?

Na przykład

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

należy zwrócić wyniki zarówno z drukarki i atramentem, zamiast wszystkich wyników z jednej lub atramentu drukarki.

+5

Naprawdę doceniam rozwiązanie, które nie zabija słowotwórstwa. – Mitja

+2

Czy możesz znaleźć rozwiązanie z słowem? – Zhomart

Odpowiedz

49

Daj spróbować:

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

A oto cytat z docs:

Jeśli ciąg wyszukiwania zawiera frazy, wyszukiwanie przeprowadza iz innych terminów w poszukiwaniu strunowy; na przykład szukaj "\" twinkle twinkle \ "little star" wyszukuje hasło "twinkle twinkle" i ("little" lub "gwiazda").

Nadzieję, że pomaga.

+2

ty. SKAŁA. Pan. Dziękuję Ci. – kmehta

+8

Zauważ, że to rzuca fajne cechy indeksu tekstowego, jak słowo wtrącone do kosza. Jeśli mój tekst to 'To jest kilka fajnych wpisów testowych tutaj' , znajdę go z '{$ search:" wpisem "}' ale nie z '{$ search:" \ "entry \" "}'. – Mitja

+0

@Mitja Jakikolwiek sposób to zrobić bez utraty słowa? – Rohmer

2

Można owinąć każde słowo w cudzysłów:

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

Jest minusem jeśli użytkownik wprowadza cudzysłowie to nie będzie działać. Najpierw musiałbyś przetworzyć cytowane ciągi.

Powiązane problemy