Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mẫu so sánh với mysql giữa hai cột bảng

Hai câu hỏi - là tiêu chuẩn mô tả (mô tả không thay đổi) hay do người dùng nhập? Nếu chúng chuẩn, hãy thêm một cột là số nguyên và thực hiện so sánh trên cột này.

Nếu nó được nhập bởi người dùng, công việc của bạn sẽ phức tạp hơn vì bạn đang tìm kiếm thứ gì đó khó tìm kiếm hơn. Tôi đã sử dụng thuật toán tìm kiếm bi-gram để xếp hạng mức độ giống nhau giữa hai chuỗi, nhưng điều này không thể được thực hiện trực tiếp trong mySQL.

Thay vì tìm kiếm mờ, bạn có thể sử dụng LIKE, nhưng hiệu quả của nó chỉ giới hạn ở việc quét bảng nếu bạn kết thúc việc đặt '%' ở đầu cụm từ tìm kiếm. Ngoài ra, nó ngụ ý rằng bạn có thể nhận được một kết quả phù hợp trên phần chuỗi con mà bạn chọn, có nghĩa là bạn cần biết trước chuỗi con.

Tôi rất vui được giải thích thêm khi tôi biết bạn đang cố gắng làm gì.

EDIT1:Được rồi, với sự công phu của bạn, bạn sẽ cần thực hiện tìm kiếm kiểu mờ như tôi đã đề cập. Tôi sử dụng phương pháp bi-gram, bao gồm việc lấy từng mục nhập do người dùng tạo và chia nó thành các phần gồm 2 hoặc 3 ký tự. Sau đó, tôi lưu trữ từng phần này trong một bảng khác với mỗi mục nhập được khóa trở lại mô tả thực tế.

Ví dụ:

Mô tả1:"Chạy nhanh về phía trước" Mô tả 2:"Chạy về phía trước"

Nếu bạn chia mỗi khối thành 2 khối ký tự - 'A', 'f', 'fa', 'as', 'st' .....

Sau đó, bạn có thể so sánh số lượng của 2 khối ký tự phù hợp với cả hai chuỗi và nhận được "điểm số" sẽ thể hiện độ chính xác hoặc độ giống nhau giữa hai ký tự.

Vì tôi không biết bạn đang sử dụng ngôn ngữ phát triển nào, nên tôi sẽ bỏ qua việc triển khai, nhưng đây là điều cần được thực hiện không rõ ràng trong mySQL.

Hoặc giải pháp thay thế lười biếng sẽ là sử dụng một dịch vụ tìm kiếm đám mây như Amazon có, dịch vụ này sẽ cung cấp tìm kiếm dựa trên các cụm từ bạn đưa ra ... nhưng không chắc liệu họ có cho phép bạn liên tục thêm các mô tả mới để xem xét hay không và tùy thuộc vào ứng dụng của bạn. có thể hơi tốn kém (IMHO).

R

Đối với bài đăng SO khác về triển khai bigram - hãy xem SO bigram / tìm kiếm mờ

--- Cập nhật mỗi lần xây dựng câu hỏi ---

Đầu tiên, tôi giả sử bạn đọc lý thuyết trên các liên kết mà tôi đã cung cấp..thứ hai, tôi sẽ cố gắng giữ nó ở dạng DB bất khả tri nhất có thể, vì nó không cần mySQL (mặc dù tôi sử dụng nó và nó hoạt động nhiều hơn tốt)

Ok, vì vậy phương pháp bigram hoạt động tốt trong việc tạo / so sánh các mảng trong bộ nhớ chỉ khi các kết quả phù hợp có thể tương đối nhỏ, nếu không thì nó sẽ có hiệu suất quét bảng giống như bảng mysql không có chỉ mục khá nhanh. Vì vậy, bạn sẽ sử dụng các điểm mạnh của cơ sở dữ liệu để giúp lập chỉ mục cho bạn.

Những gì bạn cần là một bảng để chứa "điều khoản" hoặc văn bản người dùng đã nhập mà bạn đang muốn so sánh. Dạng đơn giản nhất là bảng có hai cột, một là số nguyên tăng tự động duy nhất sẽ được lập chỉ mục, chúng tôi sẽ gọi hd_id bên dưới, thứ hai là varchar (255) nếu các chuỗi khá ngắn hoặc TEXT nếu chúng có thể lâu dài - bạn có thể đặt tên này bất cứ điều gì bạn muốn.

Sau đó, bạn sẽ cần tạo một bảng khác có ít nhất BA cột - một cho cột tham chiếu quay trở lại cột tăng tự động của bảng kia (chúng tôi sẽ gọi đây là hd_id bên dưới), bảng thứ hai sẽ là varchar () of tối đa là 5 ký tự (điều này sẽ chứa các khối bigram của bạn) mà chúng tôi sẽ gọi là "bigram" bên dưới và cột thứ ba là cột tự động tăng dần có tên b_id bên dưới. Bảng này sẽ chứa tất cả các biểu đồ cho từng mục nhập của người dùng và gắn lại với mục nhập tổng thể. Bạn sẽ muốn lập chỉ mục cột varchar của chính nó (hoặc đầu tiên theo thứ tự trong một chỉ mục kết hợp).

Bây giờ, mỗi khi người dùng nhập một cụm từ bạn muốn tìm kiếm, bạn cần nhập cụm từ đó vào bảng đầu tiên, sau đó phân tích cụm từ đó thành bigram và nhập từng đoạn vào bảng thứ hai bằng cách sử dụng tham chiếu quay lại cụm từ tổng thể trong bảng đầu tiên để hoàn thành mối quan hệ. Bằng cách này, bạn đang mổ xẻ trong PHP, nhưng hãy để mySQL hoặc bất kỳ cơ sở dữ liệu nào thực hiện việc tối ưu hóa chỉ mục cho bạn. Nó có thể giúp trong giai đoạn bigram để lưu trữ số lượng bigram được thực hiện trong bảng 1 cho giai đoạn tính toán. Dưới đây là một số mã trong PHP để cung cấp cho bạn ý tưởng về cách tạo bigram:

// split the string into len-character segments and store seperately in array slots
function get_bigrams($theString,$len)   
{
   $s=strtolower($theString);
   $v=array();
   $slength=strlen($s)-($len-1);     // we stop short of $len-1 so we don't make short chunks as we run out of characters

   for($m=0;$m<$slength;$m++)
   {
      $v[]=substr($s,$m,$len);
   }
   return $v;
}    

Đừng lo lắng về khoảng trắng trong chuỗi - chúng thực sự hữu ích nếu bạn nghĩ về tìm kiếm mờ.

Vì vậy, bạn nhận được bigrams, nhập chúng vào một bảng, liên kết với văn bản tổng thể trong bảng 1 thông qua và cột được lập chỉ mục ... bây giờ thì sao?

Giờ đây, bất cứ khi nào bạn tìm kiếm một cụm từ, chẳng hạn như "Cụm từ yêu thích của tôi để tìm kiếm" - bạn có thể sử dụng hàm php để biến nó thành một mảng bigram. Sau đó, bạn sử dụng nó để tạo phần IN (..) của câu lệnh SQL trên bảng bigram (2) của bạn. Dưới đây là một ví dụ:

select count(b_id) as matches,a.hd_id,description, from table2 a
inner join table1 b on (a.hd_id=b.hd_id)
where bigram in (" . $sqlstr . ")
group by hd_id order by matches desc limit X

Tôi đã để $ sqlstr dưới dạng tham chiếu chuỗi PHP - bạn có thể tự xây dựng nó dưới dạng danh sách được phân tách bằng dấu phẩy từ hàm bigram bằng cách sử dụng implode hoặc bất kỳ thứ gì trên mảng được trả về từ get_bigrams hoặc tham số hóa nếu bạn muốn.

Nếu được thực hiện đúng, truy vấn ở trên trả về các cụm từ tìm kiếm mờ phù hợp nhất tùy thuộc vào độ dài của bigram bạn đã chọn. Độ dài bạn chọn có hiệu quả tương đối dựa trên độ dài dự kiến ​​của bạn trong tổng thể các chuỗi tìm kiếm.

Cuối cùng - truy vấn ở trên, chỉ đưa ra xếp hạng đối sánh mờ. Bạn có thể thử và cải thiện bằng cách so sánh không chỉ các kết quả phù hợp mà còn so sánh với tổng số bigram tổng thể, điều này sẽ giúp khử sai lệch các chuỗi tìm kiếm dài so với các chuỗi ngắn. Tôi đã dừng lại ở đây vì tại thời điểm này, nó trở nên cụ thể hơn cho ứng dụng.

Hy vọng điều này sẽ hữu ích!

R




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao MySQL định dạng lại hoàn toàn văn bản truy vấn XEM?

  2. java.sql.SQLException:Không có cơ sở dữ liệu nào được chọn

  3. Có thể có một tham số mặc định cho một thủ tục được lưu trữ mysql không?

  4. Làm cách nào để hiển thị lược đồ của một bảng trong cơ sở dữ liệu MySQL?

  5. DB gì cho cơ sở dữ liệu lớn?