Non mi preoccuperei troppo di come Craigslist (o qualsiasi sito di grandi dimensioni) lo fa, perché i loro pazzi requisiti di rendimento dettano strongmente decisioni architettoniche.
Risolvere questo in un modo semplice comporterebbe una query come questa:
# pseudo query
SELECT fields
FROM ads
WHERE ad.title MATCHES "search keywords"
AND ad.location IS IN PROXIMITY to "search location"
Ora, sia la ricerca per parole chiave che la ricerca per distanza possono essere compiti complessi in se stessi. In genere, il filtraggio per distanza può essere eseguito molto più rapidamente rispetto al filtraggio in base alle parole, quindi è meglio toglierlo per primo.
Questo può essere fatto con una matematica relativamente facile se si dispone di coordinate della posizione di ricerca, nonché per ogni voce nel database. Implementeresti qualcosa del genere: link . Ci sono anche opzioni geospaziali più appropriate se puoi accedervi.
Il filtraggio per parola chiave di solito inizia con qualcosa di banale come: WHERE title LIKE '%search%' OR body LIKE '%search'
, ma è follemente lento e non ha la capacità di ordinare per rilevanza.
Successivamente, si passa a una sorta di ricerca a tutto campo - con MySQL, MyISAM fornisce il metodo MATCH x AGAINST y, che ti dà anche rilevanza.
Oltre a questo, le persone di solito si spostano su una sorta di programma di ricerca dedicato. Sphinx, Lucene ed Elastic Search vengono in mente.
Guardando indietro a Craigslist, in realtà usano Sphinx Search e hanno una infrastruttura complessa probabilmente non ti sarà molto d'aiuto. L'ultima volta che ho controllato, sono il più grande utente di Sphinx, quindi i loro risultati sono abbastanza accademici per altri utenti di grandi dimensioni.