2011-10-31 32 views
6

Tôi có một bảng cơ sở dữ liệu đầy đủ các địa chỉ từ các phản hồi mã địa lý của Google Maps. Google viết tắt tất cả các hướng (Tây -> W, Đông -> E, v.v.).Tìm kiếm địa chỉ Fuzzy Street Sử dụng MySQL Fulltext (hoặc sphinx?)

Vì vậy, nếu tôi nhập địa chỉ như "100 West Pender Street" thì địa chỉ được định dạng do Google Maps trả về là "100 W Pender St" mà tôi chèn vào bảng của mình.

Bây giờ nếu người dùng đến cùng và tìm kiếm địa chỉ đó, tất cả những điều sau đây phải phù hợp:

pender đường tây pender đường 100 pender 100 w pender 100 pender tây

và họ nhiều hơn hoặc ít hơn. "w" trong bảng được bỏ qua tuy nhiên vì nó nằm dưới độ dài từ tối thiểu. địa chỉ rơi vào bút chì phía đông được đưa ra trọng số bằng nhau trong kết quả tìm kiếm ("E" cũng bị bỏ qua).

Cách tốt nhất để xử lý việc này là gì?

Tôi nghi ngờ đặt độ dài từ tối thiểu thành 1 là "điều xấu".

Tôi có thể thực hiện tìm kiếm và thay thế các chữ viết tắt đã biết (N, E, S, W, St, Ave, Dr, v.v.) trong các địa chỉ google và thay thế chúng bằng các mở rộng của chúng - nhưng có một số tên đường phố trong trường hợp này không hợp lệ (một số thành phố có tên đường phố bằng chữ cái duy nhất: Đường J, v.v ...)

Cũng giống như "123 160 St" không thể tìm kiếm được vì số phố (123) và tên phố (160) đều giảm dưới độ dài từ tối thiểu.

MySQL FullText có phải là phương pháp phù hợp cho điều này không? Nhân sư có cung cấp điều gì đó tốt hơn không?

Hoặc có giải pháp nào khác mà tôi chưa xem xét? Hãy nhớ rằng truy vấn tìm kiếm của người dùng sẽ được đối sánh không chỉ đối với địa chỉ của thuộc tính mà còn đối với các cột văn bản khác như tên và mô tả thuộc tính.

+0

Bạn có thể giảm độ dài tối thiểu toàn văn của mysql bằng 'ft_min_word_length', nhưng hạ thấp xuống 2 hoặc 1 sẽ làm tăng lượng kết quả" nhiễu ". Ngoài ra, hãy cẩn thận với các chữ viết tắt. Trong thành phố của tôi có một "Lưỡi liềm phía Tây", vì đó là tên của một người nào đó, không phải là một hướng. –

+0

Tại sao không tạo trường mới theo hướng (N, E, W, S) và sau đó tìm kiếm với ** field = 'S' ** hoặc nếu bội số tìm kiếm trường sử dụng IN ('S', 'N') –

+0

Marc - Tôi lo lắng về tiếng ồn, đặc biệt là nếu tôi phải đặt nó thành 1 để nắm bắt N, E, S, W. David - các địa chỉ quay trở lại từ trình mã hóa địa lý không có hướng như một trường riêng biệt Tôi sẽ phải phân tích nó ra khỏi trường văn bản đầy đủ có thể có vấn đề đối với các đường phố thực sự được đặt tên là "N" hoặc "E", v.v. – emh

Trả lời

0

Đây thực sự là một vấn đề vô cùng khó khăn - nếu bạn đang ở một mình. Tôi làm việc trong ngành xác minh địa chỉ tại một công ty có tên là SmartyStreets, nơi các sản phẩm của chúng tôi thực hiện nhiệm vụ bạn mô tả. Đó là một chuỗi các hoạt động phức tạp phù hợp với các tìm kiếm địa chỉ hợp lệ, thậm chí có thể phân phối, các điểm cuối. Việc công nhận việc thực hiện tra cứu địa chỉ chính xác, chính xác và hoàn toàn, được gọi là Chứng nhận CASS.

Sự khác biệt giữa kết quả của Google và kết quả được chứng nhận bởi CASS là thuật toán của Google được "đoán đúng". Đây là những gì Google giỏi ... thật không may, điều đó cũng phù hợp với những địa chỉ không hoàn toàn hợp lệ. (Xem: http://answers.smartystreets.com/questions/269/why-did-the-address-fail-validation-it-looks-good-to-me)

tra cứu mờ với MySQL sẽ mang lại kết quả và mã của bạn có thể có các thuật toán để giúp, nhưng không đảm bảo tính chính xác hoặc hợp lệ hoặc trong trường hợp đó, thậm chí có giá trị.

Tôi không nghĩ rằng bạn sẽ muốn người dùng của mình nhận được địa chỉ sai để trả lại truy vấn của họ. Nó làm cho dịch vụ của bạn xuất hiện dưới mệnh giá và người dùng sẽ không nhận được giá trị mà họ mong đợi (phải không?) ... Tôi khuyên bạn nên tìm một nhà cung cấp phần mềm CASS. Ví dụ: bạn có thể "xác minh địa chỉ" của Google - giải pháp dựa trên web tốt nhất mà tôi có thể đề xuất là Smart2Stocking 'LiveAddress API'.

Các vấn đề liên quan