Buduję witrynę Django i szukam wyszukiwarki.
Kilku kandydatów:
Lucene / Lucene with Compass / Solr
Sfinks
Wbudowane wyszukiwanie pełnotekstowe Postgresql
Wbudowane wyszukiwanie pełnotekstowe MySQl
Kryteria wyboru:
- trafność i ranking wyników
- szybkość wyszukiwania i indeksowania
- łatwość użycia i łatwość integracji z Django
- wymagania dotyczące zasobów - witryna będzie hostowana na VPS , więc idealnie byłoby, gdyby wyszukiwarka nie wymagała dużo pamięci RAM i procesora
- skalowalność
- dodatkowe funkcje, takie jak „miałeś na myśli?”, powiązane wyszukiwania itp
Każdy, kto miał doświadczenie z powyższymi wyszukiwarkami lub innymi silnikami niewymienionymi na liście - chciałbym usłyszeć twoje opinie.
EDYCJA: Jeśli chodzi o potrzeby indeksowania, ponieważ użytkownicy ciągle wprowadzają dane do witryny, dane te muszą być indeksowane w sposób ciągły. Nie musi to być czas rzeczywisty, ale idealnie nowe dane pojawiałyby się w indeksie z opóźnieniem nie dłuższym niż 15-30 minut
mysql
postgresql
full-text-search
lucene
sphinx
Kontynuacja
źródło
źródło
Tsearch
nie obsługuje wyszukiwania wyrażeń. Jest jednak na liście DO ZROBIENIA sai.msu.su/~megera/wiki/FTS_Todo .Odpowiedzi:
Miło widzieć, że ktoś wtrącił się o Lucene - bo nie mam o tym pojęcia.
Z drugiej strony, Sfinks, wiem całkiem dobrze, więc zobaczmy, czy mogę pomóc.
Nie mam pojęcia, jak ma to zastosowanie do twojej sytuacji, ale Evan Weaver porównał kilka typowych opcji wyszukiwania w Railsach (Sphinx, Ferret (port Lucene dla Ruby) i Solr), przeprowadzając kilka testów porównawczych. To może być przydatne.
Nie zgłębiłem głębi wyszukiwania pełnotekstowego MySQL, ale wiem, że nie konkuruje on pod względem szybkości ani funkcji z Sphinx, Lucene lub Solr.
źródło
Nie znam Sfinksa, ale jeśli chodzi o wyszukiwanie pełnotekstowe bazy danych Lucene, myślę, że wydajność Lucene jest niezrównana. Powinieneś być w stanie wykonać prawie każde wyszukiwanie w mniej niż 10 ms, bez względu na to, ile rekordów musisz przeszukać, pod warunkiem, że poprawnie skonfigurowałeś indeks Lucene.
Nadchodzi jednak największa przeszkoda: osobiście uważam, że włączenie Lucene do twojego projektu nie jest łatwe . Oczywiście, nie jest to zbyt trudne do skonfigurowania, aby można było przeprowadzić podstawowe wyszukiwanie, ale jeśli chcesz uzyskać jak najwięcej z optymalnej wydajności, na pewno potrzebujesz dobrej książki o Lucene.
Jeśli chodzi o wymagania dotyczące procesora i pamięci RAM, wyszukiwanie w Lucene nie wymaga zbyt wiele pracy od procesora, chociaż indeksowanie danych jest, chociaż nie robisz tego zbyt często (może raz lub dwa razy dziennie), więc to nie jest duża przeszkoda.
Nie odpowiada na wszystkie twoje pytania, ale w skrócie, jeśli masz dużo danych do przeszukania i chcesz świetnej wydajności, to uważam, że Lucene jest zdecydowanie najlepszą drogą. Jeśli nie będziesz mieć tyle danych do przeszukiwania, równie dobrze możesz przeszukać bazę danych w trybie pełnotekstowym. Konfigurowanie wyszukiwania pełnotekstowego MySQL jest zdecydowanie łatwiejsze w mojej książce.
źródło
Dziwi mnie, że nie ma więcej informacji o Solr. Solr jest dość podobny do Sfinksa, ale ma bardziej zaawansowane funkcje (AFAIK, ponieważ nie użyłem Sfinksa - tylko o nim poczytam).
Odpowiedź pod linkiem poniżej zawiera szczegółowe informacje na temat Sfinksa, które dotyczą również Solr. Porównanie wyszukiwarki pełnotekstowej - Lucene, Sphinx, Postgresql, MySQL?
Solr zapewnia również następujące dodatkowe funkcje:
BTW, jest mnóstwo innych funkcji; wymieniłem jednak tylko te funkcje, których faktycznie używałem w produkcji. BTW, po wyjęciu z pudełka, MySQL obsługuje numery 1, 3 i 11 (ograniczone) z powyższej listy. W przypadku funkcji, których szukasz, relacyjna baza danych nie zamierza tego wyciąć. Wyeliminowałbym je od razu.
Kolejną korzyścią jest to, że Solr (cóż, właściwie Lucene) jest bazą danych dokumentów (np. NoSQL), więc wiele korzyści z dowolnej innej bazy danych dokumentów można zrealizować za pomocą Solr. Innymi słowy, możesz go użyć do czegoś więcej niż tylko wyszukiwania (tj. Wydajności). Bądź kreatywny dzięki temu :)
źródło
Apache Solr
Oprócz odpowiedzi na pytania OP, pozwólcie, że przedstawię Apache Solr wgląd od prostego wprowadzenia do szczegółowej instalacji i implementacji .
Solr nie powinien być używany do rozwiązywania problemów w czasie rzeczywistym. W przypadku wyszukiwarek Solr jest właściwie grą i działa bezbłędnie .
Solr działa dobrze w aplikacjach internetowych o dużym ruchu ( czytam gdzieś, że to nie nadaje się do tego, ale tworzę kopię zapasową tego oświadczenia ). Wykorzystuje pamięć RAM, a nie procesor.
The Doładowania pomaga oceniającym wyniki pojawiają się na górze. Powiedzmy, starasz się szukać nazwy john w dziedzinie FirstName i Nazwisko i chcesz dać trafności do firstname dziedzinie, to trzeba zwiększyć górę firstname pola, jak pokazano.
Jak widać, pole imienia zostaje wzmocnione z wynikiem 2.
Więcej na temat SolrRelevancy
Prędkość jest niewiarygodnie duża i nie ma na to kompromisów. Powód, dla którego przeprowadziłem się do Solr .
Jeśli chodzi o szybkość indeksowania, Solr może również obsługiwać JOINS z tabel bazy danych. Wyższy i złożony JOIN wpływa na szybkość indeksowania. Jednak ogromna konfiguracja pamięci RAM z łatwością poradzi sobie z tą sytuacją.
Im wyższa pamięć RAM, tym większa jest szybkość indeksowania Solr.
Nigdy nie próbowałem zintegrować Solr i Django , jednak możesz to zrobić za pomocą Haystacka . Znalazłem interesujący artykuł na ten sam temat i oto github .
Solr rozmnaża się na RAM, więc jeśli RAM jest wysoki, nie musisz się martwić o Solr .
Wykorzystanie pamięci RAM przez Solr gwałtownie spada po pełnym indeksowaniu, jeśli masz jakieś miliardy rekordów, możesz mądrze wykorzystać import Delta w celu rozwiązania tej sytuacji. Jak wyjaśniono, Solr jest rozwiązaniem zbliżonym do czasu rzeczywistego .
Solr jest wysoce skalowalny. Spójrz na SolrCloud . Niektóre kluczowe cechy tego.
W powyższym scenariuszu można użyć SpellCheckComponent, który jest zapakowany w Solr . Istnieje wiele innych funkcji, SnowballPorterFilterFactory pomaga odzyskać rekordy, które mówią, że jeśli wpiszesz, książki zamiast książki , zostaną wyświetlone wyniki związane z książką .
Ta odpowiedź dotyczy głównie Apache Solr i MySQL . Django jest poza zakresem.
Zakładając, że jesteś w środowisku LINUX, możesz przejść do tego artykułu dalej. (moja była wersją Ubuntu 14.04)
Pierwsze kroki
Pobierz Apache Solr od tutaj . To byłaby wersja 4.8.1 . Możesz pobrać nowe wersje, znalazłem to stabilne.
Po pobraniu archiwum rozpakuj go do wybranego folderu. Powiedz…
Downloads
lub cokolwiek… Tak to będzie wyglądaćDownloads/solr-4.8.1/
Po wyświetleniu monitu .. Przejdź do katalogu
shankar@shankar-lenovo: cd Downloads/solr-4.8.1
Więc teraz jesteś tutaj ..
shankar@shankar-lenovo: ~/Downloads/solr-4.8.1$
Uruchom serwer aplikacji Jetty
Jetty jest dostępny w folderze przykładów
solr-4.8.1
katalogu, więc przejdź do niego i uruchom serwer Jetty Application Server.shankar@shankar-lenovo:~/Downloads/solr-4.8.1/example$ java -jar start.jar
Teraz nie zamykaj terminala, zminimalizuj go i pozwól mu pozostać na boku.
Aby sprawdzić, czy Apache Solr działa poprawnie, odwiedź ten adres URL w przeglądarce. http: // localhost: 8983 / solr
Uruchamianie pomostu na niestandardowym porcie
Działa domyślnie na porcie 8983. Możesz zmienić port tutaj lub bezpośrednio w
jetty.xml
pliku.java -Djetty.port=9091 -jar start.jar
Pobierz JConnector
Ten plik JAR działa jako pomost między MySQL a JDBC. Pobierz tutaj wersję niezależną od platformy
Po pobraniu rozpakuj folder, skopiuj go
mysql-connector-java-5.1.31-bin.jar
i wklej do katalogu lib .shankar@shankar-lenovo:~/Downloads/solr-4.8.1/contrib/dataimporthandler/lib
Tworzenie tabeli MySQL do połączenia z Apache Solr
Aby użyć Solr , musisz mieć tabele i dane do wyszukiwania. W tym celu użyjemy MySQL do utworzenia tabeli i wypchnięcia losowych nazw, a następnie będziemy mogli użyć Solr do połączenia się z MySQL i zindeksowania tej tabeli i jej wpisów.
1. Struktura tabeli
2. Wypełnij powyższą tabelę
Wchodzenie do rdzenia i dodawanie dyrektyw lib
1. Nawiguj do
2.Modyfikowanie pliku solrconfig.xml
Dodaj te dwie dyrektywy do tego pliku ..
Teraz dodaj DIH (moduł obsługi importu danych)
3. Utwórz plik db-data-config.xml
Jeśli plik istnieje, zignoruj go, dodaj te wiersze do tego pliku. Jak widać w pierwszym wierszu, musisz podać poświadczenia bazy danych MySQL . Nazwa bazy danych, nazwa użytkownika i hasło.
4. Zmodyfikuj plik schema.xml
Dodaj to do pliku schema.xml, jak pokazano ..
Indeksowanie
To jest prawdziwa okazja. Aby skorzystać z zapytań Solr, musisz wykonać indeksowanie danych z MySQL do Solr inorder.
Krok 1: Przejdź do panelu administracyjnego Solr
W przeglądarce kliknij adres URL http: // localhost: 8983 / solr . Ekran otwiera się w ten sposób.
Jak wskazuje znacznik, przejdź do Inorder Logging, aby sprawdzić, czy którakolwiek z powyższych konfiguracji nie doprowadziła do błędów.
Krok 2: Sprawdź swoje dzienniki
Ok, więc teraz jesteś tutaj. Jak możesz, jest wiele żółtych wiadomości (OSTRZEŻENIA). Upewnij się, że nie masz komunikatów o błędach oznaczonych na czerwono. Wcześniej w naszej konfiguracji dodaliśmy wybrane zapytanie w naszym pliku db-data-config.xml , powiedzmy, że jeśli wystąpiłyby jakieś błędy w zapytaniu, pojawiłoby się tutaj.
W porządku, bez błędów. Jesteśmy gotowi do wyjścia. Wybierzmy Collection1 z listy, jak pokazano, i wybierz Import danych
Krok 3: DIH (moduł obsługi importu danych)
Za pomocą DIH połączysz się z MySQL z Solr poprzez plik konfiguracyjny db-data-config.xml z interfejsu Solr i pobierzesz 10 rekordów z bazy danych, która zostanie zindeksowana do Solr .
Aby to zrobić, wybierz pełny import i zaznacz opcje Wyczyść i zatwierdź . Teraz kliknij Wykonaj jak pokazano.
Możesz też użyć bezpośredniego zapytania pełnego importu, takiego jak ten ..
Po kliknął ty Execute , Solr zaczyna indeksu rekordy, jeśli są jakieś błędy, to znaczy indeksowania powiodło i trzeba wrócić do rejestrowania sekcji, aby zobaczyć, co poszło źle.
Zakładając, że nie ma żadnych błędów w tej konfiguracji i jeśli indeksowanie zakończy się pomyślnie. Otrzymasz to powiadomienie.
Krok 4: Uruchamianie zapytań Solr
Wygląda na to, że wszystko poszło dobrze, teraz można użyć zapytań Solr do zapytania o indeksowane dane. Kliknij zapytanie po lewej stronie, a następnie naciśnij przycisk Wykonaj u dołu.
Zobaczysz indeksowane rekordy, jak pokazano.
Odpowiednie zapytanie Solr dla listy wszystkich rekordów to
Cóż, jest tam wszystkie 10 indeksowanych rekordów. Powiedzmy, że potrzebujemy tylko nazw zaczynających się od Ja , w tym przypadku musisz kierować na nazwę kolumny
solr_name
, dlatego zapytanie jest takie.W ten sposób piszesz zapytania Solr . Aby przeczytać więcej na ten temat, sprawdź ten piękny artykuł .
źródło
Patrzę teraz na wyszukiwanie pełnotekstowe PostgreSQL i ma ono wszystkie właściwe cechy nowoczesnej wyszukiwarki, naprawdę dobry rozszerzony charakter i wielojęzyczne wsparcie, miłą ścisłą integrację z polami tekstowymi w bazie danych.
Ale nie ma przyjaznych dla użytkownika operatorów wyszukiwania, takich jak + lub AND (używa & |!) I nie jestem zachwycony tym, jak działa na ich stronie dokumentacji. Chociaż zawiera pogrubione terminy dopasowania we fragmentach wyników, domyślny algorytm, dla którego warunki dopasowania nie są świetne. Ponadto, jeśli chcesz zaindeksować rtf, PDF, MS Office, musisz znaleźć i zintegrować konwerter formatu plików.
OTOH, jest znacznie lepszy niż wyszukiwanie tekstowe MySQL, które nawet nie indeksuje słów składających się z trzech lub mniej liter. Jest to domyślna wyszukiwarka MediaWiki i naprawdę uważam, że nie jest dobra dla użytkowników końcowych: http://www.searchtools.com/analysis/mediawiki-search/
We wszystkich przypadkach, które widziałem, Lucene / Solr i Sphinx są naprawdę świetne . Są solidnym kodem i ewoluowały ze znaczną poprawą użyteczności, więc wszystkie narzędzia służą do wyszukiwania, które zaspokoi prawie wszystkich.
dla SHAILI - SOLR zawiera bibliotekę kodów wyszukiwania Lucene i ma komponenty, które mogą być przyjemną, samodzielną wyszukiwarką.
źródło
Tsearch
. Ale Tsearch nie obsługuje wyszukiwania fraz. Nadal znajduje się na ich liście DO ZROBIENIA sai.msu.su/~megera/wiki/FTS_Todo .Tylko dwa centy za to bardzo stare pytanie. Polecam rzucić okiem na ElasticSearch .
Zalety w porównaniu z innymi silnikami FTS (wyszukiwanie pełnotekstowe) to:
Używamy tej wyszukiwarki w naszym projekcie i jesteśmy z niej bardzo zadowoleni.
źródło
SearchTools-Avi powiedział „Wyszukiwanie tekstowe MySQL, które nawet nie indeksuje słów składających się z trzech lub mniej liter”.
FYI, Min. Długość słowa MySQL pełnego tekstu jest regulowana od co najmniej MySQL 5.0. Google „mysql minimalna długość pełnego tekstu” dla prostych instrukcji.
To powiedziawszy, pełny tekst MySQL ma ograniczenia: po pierwsze, aktualizowanie jest powolne, gdy osiągniesz około miliona rekordów, ...
źródło
Dodałbym mnoGoSearch do listy. Niezwykle wydajne i elastyczne rozwiązanie, które działa jako Google: indeksator pobiera dane z wielu witryn, możesz użyć podstawowych kryteriów lub wymyślić własne haki, aby uzyskać maksymalną jakość wyszukiwania. Może również pobierać dane bezpośrednio z bazy danych.
Rozwiązanie nie jest dziś tak znane, ale spełnia maksymalne potrzeby. Możesz go skompilować i zainstalować lub na samodzielnym serwerze, a nawet na głównym serwerze, nie wymaga tak dużo zasobów jak Solr, ponieważ jest napisany w C i działa doskonale nawet na małych serwerach.
Na początku musisz go samodzielnie skompilować, więc wymaga pewnej wiedzy. Zrobiłem mały skrypt dla Debiana, który mógłby pomóc. Wszelkie zmiany są mile widziane.
Gdy używasz frameworka Django, możesz użyć lub klienta PHP w środku lub znaleźć rozwiązanie w Pythonie, widziałem kilka artykułów .
I oczywiście mnoGoSearch jest open source, GNU GPL.
źródło