Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pola membandingkan dengan mysql antara dua kolom tabel

Dua pertanyaan - apakah deskripsi standar (deskripsi tidak berubah) atau dimasukkan oleh pengguna? Jika standar, tambahkan kolom yang merupakan bilangan bulat dan lakukan perbandingan pada kolom ini.

Jika dimasukkan oleh pengguna, pekerjaan Anda lebih rumit karena Anda mencari sesuatu yang pencariannya lebih kabur. Saya menggunakan algoritme pencarian bi-gram untuk menentukan peringkat kesamaan antara dua string, tetapi ini tidak dapat dilakukan secara langsung di mySQL.

Sebagai pengganti pencarian fuzzy, Anda dapat menggunakan LIKE, tetapi efisiensinya terbatas untuk melakukan pemindaian tabel jika Anda akhirnya meletakkan '%' di awal istilah pencarian. Selain itu, ini berarti Anda bisa mendapatkan kecocokan pada bagian substring yang Anda pilih, artinya Anda harus mengetahui substring sebelumnya.

Saya akan senang untuk menjelaskan lebih lanjut setelah saya tahu apa yang Anda coba lakukan.

EDIT1:Ok, dengan elaborasi Anda, Anda perlu melakukan pencarian gaya fuzzy seperti yang saya sebutkan. Saya menggunakan metode bi-gram, yang melibatkan pengambilan setiap entri yang dibuat oleh pengguna dan membaginya menjadi potongan 2 atau 3 karakter. Saya kemudian menyimpan masing-masing potongan ini di tabel lain dengan setiap entri dikunci kembali ke deskripsi sebenarnya.

Contoh:

Description1:"Lari cepat ke depan"Description2:"Lari pendek ke depan"

Jika Anda memecah masing-masing menjadi 2 potongan karakter - 'A ', ' f', 'fa', 'as','st'.....

Kemudian Anda dapat membandingkan jumlah 2 potongan char yang cocok dengan kedua string dan mendapatkan "skor" yang akan berkonotasi akurasi atau kesamaan di antara keduanya.

Karena saya tidak tahu bahasa pengembangan apa yang Anda gunakan, saya akan mengabaikan implementasinya, tetapi ini adalah sesuatu yang perlu dilakukan tidak secara eksplisit di mySQL.

Atau alternatif malas adalah menggunakan layanan pencarian cloud seperti Amazon yang akan menyediakan pencarian berdasarkan istilah yang Anda berikan ... tidak yakin apakah mereka memungkinkan Anda untuk terus menambahkan deskripsi baru untuk dipertimbangkan, dan tergantung pada aplikasi Anda, itu bisa sedikit mahal (IMHO).

R

Untuk pos SO lainnya tentang implementasi bigram - lihat SO bigram / pencarian fuzzy

--- Pembaruan per elaborasi penanya---

Pertama, saya berasumsi Anda membaca teori pada tautan yang saya berikan..kedua, saya akan mencoba menjadikannya sebagai DB agnostik mungkin, karena tidak memerlukan mySQL (meskipun saya menggunakannya, dan berfungsi lebih dari baik)

Ok, jadi metode bigram berfungsi dengan baik dalam membuat/membandingkan array dalam memori hanya jika kecocokan yang mungkin relatif kecil, jika tidak, ia akan mengalami kinerja pemindaian tabel seperti tabel mysql tanpa indeks dengan cukup cepat. Jadi, Anda akan menggunakan kekuatan database untuk membantu melakukan pengindeksan untuk Anda.

Yang Anda butuhkan adalah satu tabel untuk menampung pengguna yang memasukkan "istilah" atau teks yang ingin Anda bandingkan. Bentuk paling sederhana adalah tabel dengan dua kolom, satu adalah integer auto-increment unik yang akan diindeks, kita akan memanggil hd_id di bawah ini, yang kedua adalah varchar(255) jika stringnya cukup pendek, atau TEXT jika bisa dapatkan panjang - Anda dapat memberi nama ini apa pun yang Anda inginkan.

Kemudian, Anda harus membuat tabel lain yang memiliki setidaknya TIGA kolom - satu untuk kolom referensi kembali ke kolom tambahan otomatis tabel lainnya (kami akan menyebutnya hd_id di bawah), yang kedua adalah varchar() dari katakanlah 5 karakter paling banyak (ini akan menampung potongan bigram Anda) yang akan kami sebut "bigram" di bawah, dan yang ketiga adalah kolom peningkatan otomatis yang disebut b_id di bawah. Tabel ini akan menampung semua bigram untuk setiap entri pengguna dan mengikat kembali ke entri keseluruhan. Anda ingin mengindeks kolom varchar dengan sendirinya (atau urutan pertama dalam indeks gabungan).

Sekarang, setiap kali pengguna memasukkan istilah yang ingin Anda cari, Anda harus memasukkan istilah itu di tabel pertama, lalu membedah istilah itu ke dalam bigram dan memasukkan setiap potongan ke tabel kedua menggunakan referensi kembali ke keseluruhan istilah di tabel pertama untuk menyelesaikan hubungan. Dengan cara ini, Anda melakukan pembedahan di PHP, tetapi membiarkan mySQL atau database apa pun melakukan pengoptimalan indeks untuk Anda. Mungkin membantu dalam fase bigram untuk menyimpan jumlah bigram yang dibuat pada tabel 1 untuk fase perhitungan. Di bawah ini adalah beberapa kode dalam PHP untuk memberi Anda gambaran tentang cara membuat 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;
}    

Jangan khawatir tentang spasi dalam string - mereka sebenarnya sangat membantu jika Anda memikirkan pencarian fuzzy.

Jadi Anda mendapatkan bigram, memasukkannya ke dalam tabel, ditautkan ke keseluruhan teks di tabel 1 melalui dan kolom yang diindeks...sekarang apa?

Sekarang setiap kali Anda mencari istilah seperti "Istilah favorit saya untuk dicari" - Anda dapat menggunakan fungsi php untuk mengubahnya menjadi array bigram. Anda kemudian menggunakan ini untuk membuat bagian IN (..) dari pernyataan SQL pada tabel bigram Anda (2). Di bawah ini contohnya:

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

Saya telah meninggalkan $sqlstr sebagai referensi string PHP - Anda dapat membuat ini sendiri sebagai daftar yang dipisahkan koma dari fungsi bigram menggunakan implode atau apa pun pada larik yang dikembalikan dari get_bigrams atau membuat parameter jika Anda suka juga.

Jika dilakukan dengan benar, kueri di atas mengembalikan istilah pencarian fuzzy yang paling cocok, tergantung pada panjang bigram yang Anda pilih. Panjang yang Anda pilih memiliki kemanjuran relatif berdasarkan panjang yang Anda harapkan dari keseluruhan string pencarian.

Terakhir - kueri di atas, hanya memberikan peringkat kecocokan yang tidak jelas. Anda dapat bermain-main dengan dan meningkatkan dengan membandingkan tidak hanya kecocokan, tetapi kecocokan vs. jumlah bigram keseluruhan yang akan membantu menghilangkan bias string pencarian panjang dibandingkan dengan string pendek. Saya telah berhenti di sini karena pada saat ini menjadi lebih spesifik untuk aplikasi.

Semoga membantu!

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. Apakah ini fungsi sanitasi input yang aman/kuat?

  2. Peringatan:formulir di halaman ini memiliki lebih dari 1000 bidang PHP MySql

  3. Membangun Kode MySQL secara dinamis untuk membuat pemicu

  4. Pipa Rusak JDBC Intermiten dan Kegagalan Tautan

  5. Cara Mengganti Nama Database di MySQL