2011-10-31 14 views
6

Ho una tabella di database piena di indirizzi dalle risposte geocode di Google Maps. Google abbrevia tutte le direzioni (West -> W, East -> E, ecc.).Fuzzy Street Address Ricerche che utilizzano MySQL Fulltext (o sphinx?)

Quindi, se inserisco un indirizzo come "100 West Pender Street", l'indirizzo formattato restituito da Google Maps è "100 W Pender St" che inserisco nella mia tabella.

Ora, se un utente arriva e ricerche per tale indirizzo, tutte le seguenti deve corrispondere:

Pender strada Pender West Street 100 Pender 100 w Pender 100 Pender ovest

e più o meno. la "w" nella tabella viene ignorata tuttavia perché scende al di sotto della lunghezza minima della parola. gli indirizzi che cadono sulla penisola est ricevono una uguale ponderazione nei risultati della ricerca (anche la "E" viene ignorata).

Qual è il modo migliore per gestire questo?

Sospetto che impostare la lunghezza minima delle parole su 1 sia una "cosa negativa".

Potrei fare una ricerca e sostituirmi con le abbreviazioni conosciute (N, E, S, W, St, Ave, Dr, ecc.) Negli indirizzi di google e sostituirle con le loro espansioni - ma ci sono alcuni nomi di strade dove questo non è valido (alcune città hanno i nomi delle singole lettere: J Street, ecc ...)

Anche indirizzi come "123 160 St" non sono ricercabili perché il numero civico (123) e il nome della via (160) entrambi cadono sotto la lunghezza minima della parola.

MySQL FullText è l'approccio giusto per questo? La Sfinge offre qualcosa di meglio?

Oppure c'è un'altra soluzione che non ho ancora considerato? Tieni presente che la query di ricerca dell'utente verrà confrontata non solo con l'indirizzo della proprietà ma anche con altre colonne di testo come il nome e la descrizione della proprietà.

+0

È possibile ridurre la lunghezza minima del testo completo di mysql con 'ft_min_word_length', ma abbassandola a 2 o 1 si aumenterà la quantità di risultati di" disturbo ". Inoltre, fai attenzione alle abbreviazioni. Nella mia città c'è un "West Crescent", dato che era il nome di una persona, non una direzione. –

+0

Perché non creare un nuovo campo con la direzione (N, E, W, S) e quindi cercare con ** field = 'S' ** o se le ricerche multiple utilizzano il campo IN ('S', 'N') –

+0

Marc - Sono preoccupato per il rumore, specialmente se devo impostarlo su 1 per catturare N, E, S, W. David - gli indirizzi che tornano dal geocoder non hanno la direzione come campo separato quindi Dovrei analizzarlo dal campo di testo completo che potrebbe essere problematico per le strade che sono effettivamente denominate "N" o "E" ecc. – emh

risposta

0

Questo è in realtà un problema incredibilmente difficile, se sei da solo. Lavoro nel settore della verifica degli indirizzi presso un'azienda chiamata SmartyStreets, dove i nostri prodotti eseguono l'attività che descrivi. È una sequenza complicata di operazioni che abbinano le ricerche di indirizzi a endpoint validi, persino consegnabili. L'accreditamento delle ricerche sull'indirizzo performante in modo accurato, corretto e completo è chiamato certificazione CASS.

La differenza tra i risultati di Google e i risultati certificati CASS è che gli algoritmi di Google sono "best-guess". Questo è ciò che Google è bravo a ... sfortunatamente, questo vale anche per gli indirizzi che non sono perfettamente validi. (Vedi: http://answers.smartystreets.com/questions/269/why-did-the-address-fail-validation-it-looks-good-to-me)

Le ricerche sfocate con MySQL produrranno risultati e il tuo codice può avere algoritmi per aiutare, ma non c'è garanzia di accuratezza o validità, o in quel caso, anche di alcun valore.

Non penso che vorrete che i vostri utenti ottengano indirizzi sbagliati in risposta alla loro richiesta. Rende il tuo servizio appariscente e gli utenti non otterranno il valore che si aspettano (giusto?) ... Ti suggerisco di trovare un fornitore di software CASS. Ad esempio, Google può "verificare l'indirizzo": la soluzione migliore, basata sul Web, che posso consigliare è SmartyStreets LiveAddress API.