2013-07-22 16 views
5

Hostuję bazę danych mongodb dla usługi obsługującej wyszukiwanie pełnotekstowe w kolekcji z 6,8 milionami rekordów.Wyszukiwanie indeksu tekstu MongoDB powolne dla popularnych słów w dużej tabeli

Indeks tekstowy zawiera dziesięć pól o różnych masach.

index specification

Większość wyszukiwania zajmuje mniej niż sekundę. Niektóre wyszukiwania trwają od dwóch do trzech sekund. Jednak niektóre wyszukiwania trwają od 15 do 60 sekund! 15-60 sekundowe przypadki wyszukiwania są niedopuszczalne w mojej aplikacji. Muszę znaleźć sposób na przyspieszenie tych.

Wyszukiwanie trwa od 15 do 60 sekund, gdy słowa, które są bardzo popularne w indeksie, są używane w zapytaniu.

Wygląda na to, że funkcja wyszukiwania tekstowego nie obsługuje leniwych parametrów. Moją pierwszą myślą było umieszczenie w pamięci podręcznej listy 50 najpopularniejszych słów w moim indeksie tekstowym, a następnie poproszenie mongodb o ocenę tych ostatnich (leniwych) i nad przefiltrowanymi wynikami zwróconymi przez mniej powszechne parametry. Mam nadzieję, że ludzie wciąż są ze mną. Załóżmy na przykład, że mam zapytanie "produkty czekoladowe", gdzie produkty są powszechne, a czekolada jest rzadka. Chciałbym móc poprosić mongodbę najpierw o ocenę "czekolady", a następnie odfiltrować te wyniki terminem "produkty". Czy ktoś wie, jak to osiągnąć?

Mogę osiągnąć powyższy scenariusz, pomijając najczęściej używane słowa (np. "Produkty") z zapytania db, a następnie ponownie stosując wspólny filtr termin po stronie aplikacji po otrzymaniu rekordów znalezionych przez db. Zaleca się, aby wszystkie logiki zapytań miały miejsce w bazie danych, ale są otwarte na przetwarzanie po stronie aplikacji dla uzyskania prędkości.

W tym projekcie wciąż występują dziury. Jeśli użytkownik szuka tylko wspólnych haseł, nie mam innego wyjścia, jak trafić w bazę danych ze wszystkimi terminami. Od wstępnego odczytania ustalam, że nie jest zalecane (lub nieobsługiwane) posiadanie wielu indeksów tekstowych (o różnych nazwach) w tej samej kolekcji. Moim planem jest stworzenie dwóch identycznych tabel, każda z moimi rekordami 6.8M, z różnymi indeksami - jednym dla zwykłych słów i jednym dla nieprzeciętnych słów. To wydaje się kludgy i clunky, ale jestem gotów zrobić to dla zwiększenia prędkości.

Czy ktoś ma wgląd i/lub porady, jak przyspieszyć ten system. Chciałbym, aby przetwarzanie danych odbywało się w bazie danych, tak szybko, jak to możliwe. Jestem pewien, że mój mały rekordowy stół 6.8M nie jest największy, jaki widział mongotb. Dzięki!

+0

To jest teraz 2018 (5 lat później), a mongodb wciąż ma dokładnie ten sam numer :( – Nico

+1

z tego powodu w połączeniu ze znacznym trafieniem wydajnościowym Mongo przez wdrożenie tego, dzięki czemu ustaliliśmy, że używanie Mongo w taki sposób nie było "Podstawowym przeznaczeniem" wspieranym "lub" zamierzonym ", zdecydowaliśmy całkowicie zrezygnować z mongo, przepraszam za zimną wodę – kmehta

Odpowiedz

4

Cóż, obejrzałem te problemy z wydajnością, umożliwiając przeszukiwanie pełnego tekstu w MongoDB w celu wyszukiwania w formacie opartym na OR. Moje wyniki są priorytetowe dzięki dokładnemu dopasowaniu wag do indeksowanych pól i po prostu kolejności według rang. Dostaję więcej wyników niż pożądane, ale to nie jest wielki problem, ponieważ moje ważone wyniki, które pojawiają się na górze, najprawdopodobniej zostaną skonsumowane, zanim mój użytkownik uzyska mniej trafne wyniki na dole.

Jeśli ktokolwiek walczy z wydajnością wyszukiwania tekstu MongoDB przy użyciu tylko wyszukiwania AND, po prostu przełącz się z powrotem na OR i kontroluj wyniki za pomocą odważników. Wykonuje skoki lepiej.

HTH

+3

Dokładnie, jeśli korzystasz z wyszukiwanych terminów w cudzysłowach (co moim zdaniem ma na myśli format AND), tekst MongoDB search najpierw użyje indeksu tekstowego nad słowami wynikającymi, a następnie sprawdzi każdy dokument, aby upewnić się, że (a) oba słowa są obecne, oraz (b) nieodwzorowana wersja słów jest identyczna z cytowanymi terminami, które przekazałeś. znacznie mniej wydajne niż druga opcja (nie cytując warunków), w której używany jest indeks tekstowy i nie ma drugiego przejścia przez każdy dokument. zadbaj o ranking wyników, przy czym oba słowa obecne powyżej dają tylko jeden. – Amalia

0

Jest to dokładnie taki sam problem jak $ $ w porównaniu wszystko. $ all używa tylko indeksu dla pierwszego słowa kluczowego w tablicy. Wierzę, że widzisz tutaj ten sam problem, powód, dla którego OR a.k.a. IN pracuje dla ciebie.