Pracuję na stronie, która sprzedaje, powiedzmy, rzeczy i oferuje "wyszukiwanie dostawców". W tym wyszukiwaniu wpisujesz swoje miasto, kod pocztowy, region i odległość (w km lub milach), a następnie witryna podaje listę dostawców.Wyszukiwanie Levenshtein
Aby to zrobić, mam bazę danych z dostawcami. W formularzu, aby zapisać tych dostawców, podajesz ich pełny adres, a po kliknięciu przycisku Zapisz tworzona jest prośba o mapy google w celu uzyskania ich szerokości i długości geograficznej.
Kiedy ktoś wykonuje wyszukiwanie, patrzę na stół, na którym przechowuję wszystkie wyszukiwane hasła i ich wartości lat/lng. Ta tabela wygląda
+--------+-------+------+
| term | lat | lng |
+--------+-------+------+
Więc pierwsze zapytanie jest czymś bardzo prostym
select lat, lng from my_search_table where term = "the term"
Jeśli znajdę rezultatu, szukaj Następnie z ładnym metody dla wszystkich sprzedawców w zakresie użytkownik chce i wydrukuj wynik na mapie.
Jeśli nie znajdę wyniku, szukam z funkcją levenshtein, ponieważ ludzie piszący bruxelle lub bruxelle zamiast bruxelles są czymś bardzo powszechnym i nie chcę ciągle prosić o mapy google (I również mam kolumnę "ile czasu przeszukano" w moim stoliku, aby uzyskać pewne statystyki)
Tak więc proszę o moje_search_time bez klauzuli where i przechodzę przez wszystkie wyniki, aby uzyskać najmniejszą odległość od levensthein. Jeśli najmniejszy wynik jest większy niż 2, żądam współrzędnych z mapy google.
Oto mój problem. W przypadku niektórych krajów (mamy kilka witryn na całym świecie), my_search_table ma 15-20k + wpisów ... a php nie (naprawdę) lubi zapętlać się na takich danych (co doskonale rozumiem), a moja prośba wchodzi w php timeout . Mogłabym zwiększyć ten limit czasu, ale problem będzie taki sam w ciągu kilku miesięcy.
Próbowałem więc funkcji MySQL z levensthein (znalezionej na stackoverflow btw), ale jest również bardzo powolna.
Moje pytanie brzmi: "czy istnieje sposób na szybkie przeprowadzenie wyszukiwania nawet na bardzo dużych zestawach danych?"
Chociaż nie mogę pomóc, +1 dla dobrze sformatowanej odpowiedzi. – christopher