2008-11-21 12 views
19

Tôi có cơ sở dữ liệu về chuỗi (chiều dài tùy ý) chứa hơn một triệu mục (có thể nhiều hơn).Cách tìm kết quả mờ phù hợp nhất cho chuỗi trong cơ sở dữ liệu chuỗi lớn

Tôi cần so sánh chuỗi do người dùng cung cấp với toàn bộ cơ sở dữ liệu và truy xuất chuỗi giống hệt nếu tồn tại hoặc trả lại kết quả trùng khớp gần nhất (tương đồng 60% hoặc tốt hơn). Thời gian tìm kiếm lý tưởng là dưới một giây.

Ý tưởng của tôi là sử dụng khoảng cách chỉnh sửa để so sánh từng chuỗi db với chuỗi tìm kiếm sau khi thu hẹp các ứng viên từ db dựa trên độ dài của chúng.

Tuy nhiên, vì tôi sẽ cần phải thực hiện thao tác này rất thường xuyên, tôi đang nghĩ về việc xây dựng chỉ mục các chuỗi db để lưu trong bộ nhớ và truy vấn chỉ mục, chứ không phải db trực tiếp.

Bất kỳ ý tưởng nào về cách tiếp cận vấn đề này theo cách khác nhau hoặc cách tạo chỉ mục trong bộ nhớ?

+0

Sử dụng nền tảng gì? – skaffman

Trả lời

0

Vì lượng dữ liệu lớn, khi chèn bản ghi, tôi sẽ tính toán và lưu trữ giá trị của thuật toán ngữ âm trong cột được lập chỉ mục và sau đó hạn chế (mệnh đề WHERE) các truy vấn chọn trong phạm vi trên cột đó.

0

Tính toán hàm băm SOUNDEX (được tích hợp vào nhiều công cụ cơ sở dữ liệu SQL) và lập chỉ mục theo đó.

SOUNDEX là một băm dựa trên âm thanh của các từ, vì vậy lỗi chính tả của cùng một từ có khả năng có cùng một SOUNDEX băm.

Sau đó tìm hàm băm SOUNDEX của chuỗi tìm kiếm và đối sánh trên đó.

+3

Soundex không thể xem qua nhiều lỗi chính tả hoặc các biến thể khác. Nó hoạt động tốt trên tên nhưng không hoạt động trên các chuỗi tùy ý. – reinierpost

+1

Thú vị. Tôi không biết nó tập trung vào tên. Tôi biết NYIIS. (http://en.wikipedia.org/wiki/New_York_State_Identification_and_Intelligence_System) – Oddthinking

5

This paper seems to describe exactly what you want.

Lucene (http://lucene.apache.org/) cũng thực hiện Levenshtein chỉnh sửa khoảng cách.

+7

Liên kết đầu tiên dường như đã biến mất.: -/ –

+1

Tôi đã gửi email cho một liên hệ, để xem chúng tôi có thể theo dõi zarawesome và sửa liên kết này hay không. Rất tiếc, không có email trực tiếp nào được cung cấp, vì vậy .. –

+0

Xin lỗi, vâng, tôi không nhớ bài viết đó là gì. Tôi đề nghị bạn tìm kiếm "khoảng cách chỉnh sửa Levenshtein" và xem điều gì xảy ra. – zaratustra

2

Bạn đã không đề cập đến hệ thống cơ sở dữ liệu của bạn, nhưng đối với PostrgreSQL bạn có thể sử dụng các mô-đun contrib sau: trgm - Trigram matching for PostgreSQL

Các pg_trgm mô-đun contrib cung cấp các chức năng và các lớp học chỉ số để xác định sự giống nhau của văn bản dựa trên kết hợp trigram .

1

Nếu cơ sở dữ liệu của bạn hỗ trợ, bạn nên sử dụng tìm kiếm toàn văn. Nếu không, bạn có thể sử dụng một trình chỉ mục như lucene và các triển khai khác nhau của nó.

0

Giải thích rất rộng về các thuật toán có liên quan nằm trong sách Thuật toán về chuỗi, cây và chuỗi: Khoa học máy tính và sinh học tính toán bởi Dan Gusfield.