2011-10-31 9 views
6

Mam tabelę bazy danych pełną adresów z odpowiedzi geokodowanych w Mapach Google. Google skraca wszystkie kierunki (Zachód -> W, Wschód -> E itp.).Wyszukiwanie za pomocą Fuzzy Street przy użyciu pełnego tekstu MySQL (lub sfinksa?)

Więc jeśli wprowadzę adres taki jak "100 West Pender Street", to sformatowany adres zwracany przez Google Maps to "100 W Pender St", który wstawiam do mojego stołu.

Teraz, gdy użytkownik przyjdzie i wyszukiwania dla tego adresu, wszystkie następujące powinien pasować:

Pender ulica zachód Pender ulica 100 Pender 100 w Pender 100 West Pender

i oni mniej więcej. "w" w tabeli jest jednak ignorowane, ponieważ spada poniżej minimalnej długości słowa. adresy wchodzące na wschodni programiści otrzymują równą wagę w wynikach wyszukiwania ("E" jest również ignorowane).

Jaki jest najlepszy sposób, aby sobie z tym poradzić?

Podejrzewam, że ustawienie minimalnej długości słowa na 1 jest "złe".

Mogę wyszukać i zastąpić znane skróty (N, E, S, W, St, Ave, Dr, itp.) W adresach google i zastąpić ich rozszerzeniami - ale są pewne nazwy ulic tam, gdzie jest to nieważne (niektóre miasta mają jednoliterowe nazwy ulic: J Street, itp.)

Również adresy takie jak "123 160 St" nie można w ogóle wyszukać, ponieważ numer ulicy (123) i nazwa ulicy (160) obaj mieszczą się poniżej minimalnej długości słowa.

Czy MySQL FullText jest właściwym rozwiązaniem? Czy Sphinx oferuje coś lepszego?

Czy istnieje inne rozwiązanie, którego jeszcze nie rozważałem? Pamiętaj, że zapytanie użytkownika zostanie dopasowane nie tylko do adresu nieruchomości, ale także do innych kolumn tekstowych, takich jak nazwa i opis właściwości.

+0

Możesz zmniejszyć długość pełnotekstowego tekstu mysql za pomocą 'ft_min_word_length', ale obniżenie go do 2 lub 1 zwiększy ilość" szumów ". Uważaj też na skróty. W moim mieście jest "West Crescent", ponieważ było to imię jakiejś osoby, a nie kierunek. –

+0

Dlaczego nie utworzyć nowego pola z kierunkiem (N, E, W, S), a następnie szukać z ** field = 'S' ** lub jeśli wyszukiwania wielokrotne używają pola IN ("S", "N") –

+0

Marc - Martwię się o ten hałas, szczególnie jeśli muszę ustawić go na 1, aby uchwycić N, E, S, W. David - adresy, które wracają z geokodera, nie mają kierunku jako osobne pole, więc Musiałbym przetworzyć go z pełnego pola tekstowego, co może być problematyczne dla ulic o nazwach "N" lub "E" itp. – emh

Odpowiedz

0

To naprawdę niewiarygodnie trudny problem - jeśli jesteś sam. Pracuję w branży weryfikacji adresów w firmie o nazwie SmartyStreets, w której nasze produkty wykonują zadanie, które opisujesz. Jest to skomplikowana sekwencja operacji, które dopasowują wyszukiwania adresów do prawidłowych, nawet dostarczalnych, punktów końcowych. Akredytacja wykonywania dokładnych, poprawnych i kompletnych wyszukiwań adresów nosi nazwę CASS Certification.

Różnica między wynikami Google a wynikami certyfikowanymi przez CASS polega na tym, że algorytmy Google są "najlepsze z możliwych". To jest to, co Google jest dobre w ... niestety, to dotyczy również adresów, które nie są całkowicie poprawne. (Patrz: http://answers.smartystreets.com/questions/269/why-did-the-address-fail-validation-it-looks-good-to-me)

Wyszukiwanie rozmyte za pomocą MySQL da wyniki, a twój kod może zawierać algorytmy, ale nie ma gwarancji dokładności ani ważności, ani w tym przypadku nawet żadnej wartości.

Nie sądzę, że chcesz, aby użytkownicy otrzymali błędne adresy w odpowiedzi na ich zapytanie. Sprawia, że ​​twoja usługa wydaje się być poniżej podparcia, a użytkownicy nie osiągną oczekiwanej wartości (prawda?) ... Proponuję znaleźć dostawcę oprogramowania CASS. Możesz na przykład "zweryfikować adres" Google - najlepszym, internetowym rozwiązaniem, które mogę polecić jest SmartyStreets "LiveAddress API.

Powiązane problemy