Porównanie wyszukiwarki pełnotekstowej - Lucene, Sphinx, Postgresql, MySQL?

312

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

Kontynuacja
źródło
26
2 ¢: Wyszukiwanie pełnotekstowe MySQL i transakcje (obecnie) wzajemnie się wykluczają. Indeksy pełnotekstowe MySQL wymagają typu tabeli MyISAM, który nie obsługuje transakcji. (W przeciwieństwie do typu tabeli InnoDB, który obsługuje transakcje, ale nie indeksy pełnotekstowe.)
Carl G
2
Wyszukiwanie pełnotekstowe PostgreSQL, Tsearch nie obsługuje wyszukiwania wyrażeń. Jest jednak na liście DO ZROBIENIA sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam,
1
Każdy, kto patrzy na to dla Django, powinien sprawdzić aplikację stogu siana. haystacksearch.org
Keyo,
24
@ CarlG, tylko dla odniesienia. MySQL 5.6+ ma wsparcie wyszukiwania pełnotekstowego z silnikiem innodb
DhruvPathak

Odpowiedzi:

167

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.

  • Ranking trafności wyników jest domyślny. Możesz ustawić własne sortowanie, jeśli chcesz, i przypisać określonym polom większą wagę.
  • Indeksowanie jest superszybkie, ponieważ komunikuje się bezpośrednio z bazą danych. Każda powolność będzie wynikać ze złożonych zapytań SQL i nieindeksowanych kluczy obcych i innych podobnych problemów. Nigdy nie zauważyłem żadnej spowolnienia w wyszukiwaniu.
  • Jestem facetem od Railsów, więc nie mam pojęcia, jak łatwo można go wdrożyć za pomocą Django. Istnieje jednak interfejs API języka Python, który jest dostarczany ze źródłem Sphinx.
  • Demon usługi wyszukiwania (searchd) ma dość niskie zużycie pamięci - można również ustawić limity ilości pamięci używanej przez proces indeksujący.
  • Skalowalność jest tam, gdzie moja wiedza jest bardziej pobieżna - ale wystarczy skopiować pliki indeksu na wiele komputerów i uruchomić kilka demonów wyszukiwania. Ogólne wrażenie, jakie mam od innych, jest takie, że przy dużym obciążeniu jest cholernie dobre, więc skalowanie go na wielu maszynach nie jest czymś, z czym trzeba sobie poradzić.
  • Nie ma obsługi wyrażeń „miałeś na myśli” itp. - chociaż można to zrobić za pomocą innych narzędzi. Sfinks wyszukuje słowa, chociaż używa słowników, więc „prowadzenie” i „prowadzenie” (na przykład) można by uznać za takie same w wyszukiwaniu.
  • Sphinx nie zezwala jednak na częściowe aktualizacje indeksu danych pól. Powszechnym podejściem jest utrzymywanie indeksu delta ze wszystkimi ostatnimi zmianami i ponowne indeksowanie go po każdej zmianie (a te nowe wyniki pojawiają się w ciągu sekundy lub dwóch). Ze względu na małą ilość danych może to zająć kilka sekund. Nadal będziesz jednak musiał regularnie indeksować główny zestaw danych (choć to, jak regularnie zależy od zmienności danych - codziennie? Co godzinę?). Szybkie prędkości indeksowania sprawiają, że wszystko to jest dość bezbolesne.

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.

poklepać
źródło
Sphinx pozwala aktualizować indywidualne atrybuty elementów w bieżących indeksach, ale nie może usuwać / aktualizować pełnych rekordów.
Xorlev,
sphinx RT umożliwia częściowe aktualizacje / usuwanie. jest na wczesnym etapie, ale już [prawie] działa. sphinxsearch.com/wiki/doku.php?id=rt_tutorial
pQd
4
Oto odpowiedź na Solr, która jest dobrą parą do tej odpowiedzi na Sphinx
New Alexandria
Nic nie może równać się z szybkością Sfinksa, więc jeśli najważniejsza jest prędkość, to Sfinks jest opcją. Niezły post
twigg
Sphinx 2.3.2 Beta ma teraz funkcję „CALL SUGGEST”, której można użyć do wdrożenia „miałeś na myśli?” sphinxsearch.com/docs/devel.html#sphinxql-call-suggest
Vinod K
82

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.

Razzie
źródło
10
W porównaniu do sfinksa, lucence jest zbyt powolna i nieporęczna. Użyłem obu w moim projekcie i ostatecznie trzymałem się sfinksa. Lucence jest w Javie i wymaga o wiele więcej procesora i pamięci RAM niż Sphinx.
Phyo Arkar Lwin
25
Nie mogę się tutaj zgodzić. Lucene jest błyskawiczna, jeśli zbudujesz poprawny indeks. Zasadniczo możesz wykonać zaawansowane zapytanie dotyczące milionów rekordów w ciągu zaledwie kilku milisekund. Musisz tylko wiedzieć, co robisz. A Lucene jest w javie ... twój cel? Jest też port .NET, Lucene.NET btw.
Razzie
15
ale wyraźnie stwierdziłeś, że nie używasz sfinksa, a v3sson użył obu.
user508546
20
jak możesz stwierdzić, że wydajność Lucene nie ma sobie równych w tym samym zdaniu, w którym twierdzisz, że nie użyłeś sfinksa?
user508546
22
Ważne pytania Nigdy nie powiedziałem, że Lucene jest szybszy niż Sphinx, wspomniałem, że Lucene w porównaniu z wyszukiwaniem pełnotekstowym bazy danych nie ma sobie równych. I to jest. Nie ma co do tego pytania. Lucene opiera się na indeksie odwróconym. Teraz nie znam Sfinksa, jak wspomniano wcześniej, ale jeśli używa on również odwróconego indeksu lub podobnej metody indeksowania, możliwe jest, że działają one jednakowo. Stwierdzenie, że Lucene w porównaniu ze Sfinksem byłoby „zbyt powolne i nieporęczne”, nie jest oparte na faktach. Zwłaszcza nie, gdy mówi się tylko, że Lucene jest w „Javie”, co jest po prostu absurdalnym brakiem wydajności.
Razzie
60

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:

  1. Obsługuje replikację
  2. Wiele rdzeni (traktuj je jako osobne bazy danych z własną konfiguracją i własnymi indeksami)
  3. Wyszukiwania logiczne
  4. Podświetlanie słów kluczowych (dość łatwe do zrobienia w kodzie aplikacji, jeśli masz regex-fu; jednak dlaczego nie pozwolić wyspecjalizowanemu narzędziu wykonać lepszą pracę dla Ciebie)
  5. Zaktualizuj indeks za pomocą XML lub pliku rozdzielanego
  6. Komunikuj się z serwerem wyszukiwania przez HTTP (może nawet zwrócić Json, Native PHP / Ruby / Python)
  7. PDF, indeksowanie dokumentów Word
  8. Pola dynamiczne
  9. Aspekty
  10. Pola agregujące
  11. Zatrzymaj słowa, synonimy itp.
  12. Bardziej jak to...
  13. Indeksuj bezpośrednio z bazy danych za pomocą niestandardowych zapytań
  14. Auto-sugestia
  15. Automatyczne buforowanie pamięci podręcznej
  16. Szybkie indeksowanie (w porównaniu do czasów indeksowania wyszukiwania pełnotekstowego MySQL) - Lucene używa binarnego formatu indeksu odwróconego.
  17. Ulepszanie (niestandardowe reguły zwiększające trafność określonego słowa kluczowego lub wyrażenia itp.)
  18. Wyszukiwanie w polu (jeśli użytkownik wyszukiwania zna pole, które chce przeszukać, zawęża wyszukiwanie, wpisując pole, następnie wartość, i TYLKO to pole jest wyszukiwane, a nie wszystko - znacznie lepsze wrażenia użytkownika)

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 :)

Wil Moore III
źródło
Sphinx też o Obsługuje replikację Wiele rdzeni Wyszukiwania logiczne Podświetlanie słów kluczowych Aktualizacja indeksu przez XML - lub plik rozdzielany - PDF, indeksowanie dokumentów Worda (przez xml) Aspekty Zatrzymywanie słów, synonimów itp. Indeksowanie bezpośrednio z bazy danych za pomocą niestandardowych zapytań Automatyczne sugerowanie Szybkie indeksowanie Ulepszanie Wyszukiwanie w polu O polach dynamicznych Pola agregujące Pamięć podręczna Automatyczne podgrzewanie Po prostu nie wiem
Moosh
58

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 .

Proste wprowadzenie


Każdy, kto miał doświadczenie z powyższymi wyszukiwarkami lub innymi silnikami niewymienionymi na liście - chciałbym usłyszeć twoje opinie.

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.

  • trafność i ranking wyników

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.

http://localhost:8983/solr/collection1/select?q=firstname:john^2&lastname:john

Jak widać, pole imienia zostaje wzmocnione z wynikiem 2.

Więcej na temat SolrRelevancy

  • szybkość wyszukiwania i indeksowania

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.

  • łatwość użycia i łatwość integracji z Django

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 .

  • 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

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 .

  • skalowalność

Solr jest wysoce skalowalny. Spójrz na SolrCloud . Niektóre kluczowe cechy tego.

  • Odłamki (lub dzielenie na fragmenty to koncepcja dystrybucji indeksu na wiele komputerów, na przykład, jeśli indeks urósł za duży)
  • Równoważenie obciążenia (jeśli Solrj jest używany z chmurą Solr, automatycznie zajmuje się równoważeniem obciążenia za pomocą mechanizmu Round-Robin)
  • Wyszukiwanie rozproszone
  • Duża dostępność
  • dodatkowe funkcje, takie jak „miałeś na myśli?”, powiązane wyszukiwania itp

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)

Szczegółowa instalacja

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… Downloadslub 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.1katalogu, 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.

(WSKAZÓWKA: Użyj & after start.jar, aby Jetty Server działał w tle)

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.xmlpliku.

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.jari 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

CREATE TABLE test_solr_mysql
 (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(45) NULL,
  created TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id)
 );

2. Wypełnij powyższą tabelę

INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jean');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jack');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jason');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Vego');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Grunt');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jasper');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Fred');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Jenna');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Rebecca');
INSERT INTO `test_solr_mysql` (`name`) VALUES ('Roland');

Wchodzenie do rdzenia i dodawanie dyrektyw lib

1. Nawiguj do

shankar@shankar-lenovo: ~/Downloads/solr-4.8.1/example/solr/collection1/conf

2.Modyfikowanie pliku solrconfig.xml

Dodaj te dwie dyrektywy do tego pliku ..

  <lib dir="../../../contrib/dataimporthandler/lib/" regex=".*\.jar" />
  <lib dir="../../../dist/" regex="solr-dataimporthandler-\d.*\.jar" />

Teraz dodaj DIH (moduł obsługi importu danych)

<requestHandler name="/dataimport" 
  class="org.apache.solr.handler.dataimport.DataImportHandler" >
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
</requestHandler>

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.

<dataConfig>
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost/yourdbname" user="dbuser" password="dbpass"/>
    <document>
   <entity name="test_solr" query="select CONCAT('test_solr-',id) as rid,name from test_solr_mysql WHERE '${dataimporter.request.clean}' != 'false'
      OR `created` > '${dataimporter.last_index_time}'" >
    <field name="id" column="rid" />
    <field name="solr_name" column="name" />
    </entity>
   </document>
</dataConfig>

(WSKAZÓWKA: Możesz mieć dowolną liczbę jednostek, ale uważaj na pole identyfikatora, jeśli są takie same, indeksowanie zostanie pominięte).

4. Zmodyfikuj plik schema.xml

Dodaj to do pliku schema.xml, jak pokazano ..

<uniqueKey>id</uniqueKey>
<field name="solr_name" type="string" indexed="true" stored="true" />

Realizacja

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.

To jest główny panel administracyjny Apache Solr

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.

To jest sekcja rejestrowania twojego silnika Apache Solr

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 ..

http://localhost:8983/solr/collection1/dataimport?command=full-import&commit=true

Moduł obsługi importu danych

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.

Indeksowanie sukcesu

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

http://localhost:8983/solr/collection1/select?q=*:*&wt=json&indent=true

Zindeksowane dane

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.

http://localhost:8983/solr/collection1/select?q=solr_name:Ja*&wt=json&indent=true

Dane JSON zaczynające się od Ja *

W ten sposób piszesz zapytania Solr . Aby przeczytać więcej na ten temat, sprawdź ten piękny artykuł .

Shankar Damodaran
źródło
3
@Downvoter, skomentuj lub edytuj tę odpowiedź, a uzasadnienie opinii negatywnej pomoże również innym.
Shankar Damodaran
4
jest to jeden z najbardziej kompleksowych i dobrze zorganizowanych postów, jakie widziałem na SO. Wspaniała praca.
zdegenerowany
28

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ą.

SearchTools-Avi
źródło
1
Wierzę, że przez wyszukiwanie pełnotekstowe PostgreSQL masz na myśli Tsearch. Ale Tsearch nie obsługuje wyszukiwania fraz. Nadal znajduje się na ich liście DO ZROBIENIA sai.msu.su/~megera/wiki/FTS_Todo .
Gnanam,
1
Właśnie wykonałem kilka testów wyszukiwania pełnotekstowego Postgres 9.0; z rozczarowaniem stwierdził, że tekst w języku francuskim nie jest dopasowany, jeśli użytkownik zapomni dobrze wyregulować wszystkie akcenty. Dopasowywanie form słów jest niejednolite - na przykład w języku angielskim słowo „powiedz” nie pasuje do tekstu zawierającego słowo „powiedział”. Ogólnie dość imponujące, jeśli chodzi o zintegrowaną funkcję we wszystkich testowanych językach (en, fr, ru).
Roman Starkov
9
@romkyns: musisz zainstalować słownik bezcenny, aby je usunąć.
Denis de Bernardy,
2
„OTOH, jest znacznie lepszy niż wyszukiwanie tekstowe MySQL, które nawet nie indeksuje słów składających się z trzech lub mniej liter”. To nie jest wbudowane ograniczenie MySQL - to wszystko, co ustawisz w pliku konfiguracyjnym. Jeśli chcesz zindeksować słowa zawierające jedną literę, po prostu zmień jedną wartość w konfiguracji.
Canuck
1
Niepokojące jest to, że ludzie porównują bazy danych, których jeszcze w pełni nie zbadali. MySQL CAN indeksuje słowa składające się z trzech lub mniej znaków - wystarczy je poprawnie skonfigurować.
TheCarver
22

Tylko dwa centy za to bardzo stare pytanie. Polecam rzucić okiem na ElasticSearch .

Elasticsearch to serwer wyszukiwania oparty na Lucene. Zapewnia rozproszoną, obsługującą wiele podmiotów wyszukiwarkę pełnotekstową z interfejsem RESTful i dokumentacją JSON bez schematu. Elasticsearch jest rozwijany w Javie i jest wydawany jako open source zgodnie z warunkami licencji Apache.

Zalety w porównaniu z innymi silnikami FTS (wyszukiwanie pełnotekstowe) to:

  • Interfejs RESTful
  • Lepsza skalowalność
  • Duża społeczność
  • Zbudowany przez programistów Lucene
  • Obszerna dokumentacja
  • Dostępnych jest wiele bibliotek open source (w tym Django)

Używamy tej wyszukiwarki w naszym projekcie i jesteśmy z niej bardzo zadowoleni.

vooD
źródło
10

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, ...

BJ
źródło
2

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.

Fedir RYKHTIK
źródło