2008-11-19 24 views
5

Mamy hostowaną aplikację, która zarządza stronami treści. Każda strona może zawierać wiele niestandardowych pól oraz kilka standardowych pól (znacznik czasu, nazwa użytkownika, adres e-mail użytkownika itp.).Efektywne filtrowanie/wyszukiwanie

Z potencjalnie setkami różnych witryn korzystających z systemu - jaki jest skuteczny sposób obsługi filtrowania/wyszukiwania? Obraz widoku siatki, który chcesz zawęzić. Możesz filtrować określone pola (identyfikator użytkownika, datę) lub wprowadzić wyszukiwanie pełnotekstowe.

Na przykład "wszystkie strony rozpoczęte przez userid 10" byłyby dość szybką kwerendą przeciwko bazie danych MySQL. Ale rzeczy takie jak "wszystkie strony rozpoczęte przez użytkownika, którego identyfikator użytkownika wynosi 10 i pasują [niektóre zapytanie wyszukiwania]" będą ssać w bazie danych, więc jest odpowiedni dla wyszukiwarki takiej jak Lucene.

W zasadzie zastanawiam się, jak inne duże witryny robią tego typu rzeczy. Czy wykorzystują one wyszukiwarkę w 100% do wszystkich rodzajów filtrowania? Czy mieszają zapytania do bazy danych z wyszukiwarką?

Jeśli korzystamy z wyszukiwarki tylko, występuje problem z czasem opóźnienia, jaki zajmuje pojawienie się nowego/zaktualizowanego obiektu w indeksie wyszukiwania. To znaczy, czytałem, że nie jest inteligentnie aktualizować indeks natychmiast, i zamiast tego robić to partiami. Nawet jeśli oznacza to co 5 minut, użytkownicy będą zdezorientowani, gdy ich ostatnio dodana strona nie zostanie natychmiast wyświetlona podczas przeglądania prostej strony (powiedz hasło wyszukiwania "kategoria: 5").

Używamy MySQL i uważnie przyglądamy się Lucene w poszukiwaniu. Czy istnieje inna technologia, o której nie wiem?

Moją myślą jest zaoferowanie prostej strony filtrującej, która używa MySQL do filtrowania podstawowych pól. Następnie zaoferuj oddzielną stronę wyszukiwania pełnotekstowego, która będzie prezentować wyniki podobne do Google. Czy to jedyny sposób?

Odpowiedz

2

Solr lub grassyknoll zarówno dostarczają nieco bardziej abstrakcyjnych interfejsów do Lucene.

Powiedzieli: Tak. Jeśli jesteś przede wszystkim stroną opartą na treści, zapewniającą wyszukiwanie pełnotekstowe nad danymi, istnieje coś w grze poza LIKE. Chociaż indeksy FULLTEXT MySql nie są doskonałe, może to być tymczasowy akceptowalny element zastępczy.

Zakładając, że tworzysz indeks Lucene, łączenie dokumentów Lucene z obiektami relacyjnymi jest całkiem proste, po prostu dodaj przechowywaną właściwość do dokumentu w czasie indeksowania (ta właściwość może być adresem URL, identyfikatorem, identyfikatorem GUID itp.) Następnie, wyszukiwanie staje się System 2 faza: 1) zapytanie Issue do indexies Lucene (wyświetlanie prostych wyniki jak tytuł) 2) uzyskać bardziej szczegółowe informacje na temat obiektu z relacyjnych sklepach przez jej klucz

Od instancji Dokumentów jest stosunkowo drogi w Lucene, chcesz tylko przechowywać pola przeszukiwane w indeksie Lucene, w przeciwieństwie do kompletnych klonów twoich obiektów relacyjnych.

0

Nie odpisz MySQL tak łatwo!

Zaimplementuj za pomocą bazy danych, np. wybierz z "jak" w klauzuli where lub cokolwiek innego.

Utwórz profil, dodaj indeksy, jeśli to konieczne. Rozwiń wersję beta, aby uzyskać rzeczywiste liczby z rzeczywistych wzorców danych użytkownika - nie wszystkie kolumny mogą być równie często zadawane po itp.

Jeśli wydajność nie jest wystarczająca, oznacza to, że bierzesz pod uwagę inne opcje. Możesz rozważyć dostrojenie swojego SQL, bazy danych, maszyny, na której działa baza danych, i wreszcie użycie innego stosu technologii ...

0

W przypadku, gdy chcemy korzystać z MySQL lub PostgreSQL, rozwiązania open source, który działa świetnie z nim jest Sphinx: http://www.sphinxsearch.com/

Mamy ten sam problem i rozważa Sfinks i Lucene jako możliwych rozwiązań.