Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][Sphinx] Wyszukiwanie po miejscowościach
Forum PHP.pl > Forum > Bazy danych > MySQL
Walian
Jak byście zrobili wyszukiwanie po miejscowościach mając do dyspozycji MySQL + Sphinx?
Chodzi mi tutaj głównie o wydajność. Wiele serwisów umożliwia filtrowanie dajmy na to - ogłoszeń, aukcji itp. Poprzez wybranie miejscowości z listy rozwijalnej lub wpisanie jej nazwy. Często jest też opcja auto-uzupełniania. Wydaje mi się, że nie ma sensu z góry zapisywać do bazy listy większości miejscowości dostępnych w Polsce, szczególnie, że w pracy tworzymy serwis, którego docelowym targetem w późniejszej fazie będą również inne kraje. Sphinx wyszukuje już po innych kryteriach (również po kolumnach tekstowych), pozostaje dodanie wyszukiwania po województwach, powiatach i miejscowościach. Jak to zrobić wydajnie? I co najważniejsze - jak o wszystko połączyć z mapą, która będzie napisana we Flashu? Możecie podać jakieś przykłady rozwiązań?
Crozin
Przede wszystkim powinieneś wyszukiwać po jakimś ID miejscowości, a nie jej nazwie - to znacznie uprości wszelkie operacje typu wyszukiwanie, filtrowanie, znajdowanie ogłoszeń w promieniu X kilometrów od danej miejscowości itp. itd. Sam proces wyszukiwania jest już wtedy banalnie prosty.

Tworzenie lokalnej bazy danych to wymóg, którego raczej nie przeskoczysz. Nie mniej jednak nie musisz na samym początku posiadać bazy danych absolutnie wszystkich miejscowości. Niezbędne minimum na start to wszystkie miejscowości o statusie gminnym. W Polsce jest chyba o ile się nie mylę niespełna 500. Jadnak nie można zapominać o mieszkańcach mniejszych miejscowości dlatego też w przypadku gdy podana miejscowość nie może zostać odnaleziona w lokalnej bazie danych możesz wykorzystać chociażby Google'a, który udostępnia API do wyszukiwania miejscowości. W momencie gdy Google zwróci jakieś wyniki robisz sobie jego lokalną kopię.
Walian
Oczywiście będę przechowywał zarowno id, parent_id jak i samą nazwę bo to podstawa. Google też brałem pod uwagę. Ale co jeśli będziemy mieć mnóstwo rekordów (500 tyś - 1 mln) i do tego całą masę miejscowości itd. ? Wyszukiwanie może trochę potrwać przypuszczam. No i co z duplikatami miejscowości - wiele się powtarza... Na razie jest pomysł, żeby sprawdzać je po kodach pocztowych.
Crozin
Cytat
Ale co jeśli będziemy mieć mnóstwo rekordów (500 tyś - 1 mln) i do tego całą masę miejscowości itd. ?
Nie jestem pewien podawanych liczb, ale w Polsce mamy chyba raptem 60 000 zarejestrowanych miejscowości. Także ten milion osiągnąłbyś pewnie dopiero po utworzeniu bazy całej Europy. Wyszukanie ID na podstawie nazwy nie powinno stanowić problemu, a w docelowym wyszukiwaniu danych warunek porównujący ID oferty będzie prawdopodobnie jednym z bardziej odciążających.
Cytat
Wyszukiwanie może trochę potrwać przypuszczam.
Oczywiście, że przeszukanie sporej bazy danych trwa. Dlatego w pewnym momencie konieczne stanie się nie optymalizowanie algorytmu, a dokupywanie kolejnych maszyn. Na pewnym etapie optymalizacja przestaje być opłacalna.
Cytat
No i co z duplikatami miejscowości - wiele się powtarza...
O ile nazwy miejscowości w obrębie kraju rzeczywiście mogą się powtarzać o tyle w obrębie gminy są już unikalne. Dlatego, jeżeli ktoś wpisze miejscowość "abc" i system wyszuka przykładowo 6 miejscowości o takiej nazwie wyświetlasz pole w którym można wybrać o którą konkretnie chodzi. Podajesz po prostu pełną "ścieżkę" do miejscowości na zasadzie: woj. małopolskie, pow. nowosądecki, gm. Muszyna, Szczawnik.
Walian
Miałem na myśli olbrzymią liczbę rekordów typu oferty, aukcje, artykuły i tym podobne.
Cytat
Wyszukanie ID na podstawie nazwy nie powinno stanowić problemu, a w docelowym wyszukiwaniu danych warunek porównujący ID oferty będzie prawdopodobnie jednym z bardziej odciążających.

I chyba tak zrobię, zwłaszcza, że Sphinx woli Id niż dane tekstowe.
Cytat
Oczywiście, że przeszukanie sporej bazy danych trwa. Dlatego w pewnym momencie konieczne stanie się nie optymalizowanie algorytmu, a dokupywanie kolejnych maszyn. Na pewnym etapie optymalizacja przestaje być opłacalna.

Prawda, ale ja właśnie staram się to zrobić najwydajniej jak się da, żeby konieczność użycia kolejnej maszyny pojawiła się jak najpóźniej. A właśnie - jak się rozkłada obciążenie bazy danych na kilka serwerów? Zna ktoś ciekawe źródła w sieci opisujące to zagadnienie? Zawsze mnie to ciekawiło, a niestety nie miałem jeszcze przyjemności pracować w firmie posiadającej na tyle rozbudowany serwis by mieć kilka maszyn smile.gif
uupah5
Cytat(Walian @ 11.04.2011, 15:03:48 ) *
Prawda, ale ja właśnie staram się to zrobić najwydajniej jak się da, żeby konieczność użycia kolejnej maszyny pojawiła się jak najpóźniej. A właśnie - jak się rozkłada obciążenie bazy danych na kilka serwerów? Zna ktoś ciekawe źródła w sieci opisujące to zagadnienie? Zawsze mnie to ciekawiło, a niestety nie miałem jeszcze przyjemności pracować w firmie posiadającej na tyle rozbudowany serwis by mieć kilka maszyn smile.gif

słownik poczty polskiej to 34k nazw miejscowości. żadna ilość, nawet jakbyś miał to przeszukiwać w pliku tekstowym.
mam wrażenie, że zaczynasz szukać "obejść" i "hacków" na zwiększenie wydajności zanim jeszcze pojawił się jakikolwiek problem z tym związany.
IMHO: zrób to po "bożemu" a rozwiązywaniem problemów z wydajnością zajmij się, jak się faktycznie pojawią.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.