Niat saya untuk membangun repo ini adalah untuk membagikan pengetahuan singkat saya tentang subjek ini: pencarian teks lengkap, atau hanya FTS . Seperti yang akan Anda lihat, saya telah membuat beberapa tes dan penelitian untuk mencapai kesimpulan itu, beberapa tautan di bagian terakhir dapat membantu siapa saja yang ingin memahami apa yang saya baca dan (mengapa tidak?) Bahkan membantu dan memberikan kontribusi untuk repositori ini (PR dihargai).
Repositori ini berisi API Rails 6.x yang menggunakan permata SearchKick untuk menghasilkan rekomendasi yang hebat (dengan FTS) berdasarkan input pengguna. Ini adalah API HTTP kecil sederhana yang memungkinkan Anda membuat posting dengan judul dan bidang tubuh (seperti yang akan Anda lihat nanti) dan membuat pencarian yang mendekati rekomendasi yang benar -benar bagus, tidak hanya perbandingan string Simples. Untuk tujuan itu saya akan mulai menyelidiki jika ada solusi lain untuk pendekatan FTS selain Elasticsearch.
"Googling" sederhana dapat membawa kepada Anda banyak cara untuk melakukan FTS di DBM yang lebih umum seperti MySQL atau PostgreSQL. Hampir selalu lebih baik untuk memilih alternatif yang lebih teruji dan menyebarkan terhadap "baru" - bahkan Elasticsearch bukanlah teknologi muda - tentang keandalan komunitas dan perangkat lunak. Jadi mengapa tidak memilih bullet perak lama antara PostgreSQL dan MySQL?
Ada beberapa cara kita dapat memiliki FT di MySQL: Pencarian Bahasa Alami dan Pencarian Boolean. Pencarian bahasa lebih jelas untuk pemahaman kami karena hanya mencari kata demi kata yang membandingkan kueri dengan bidang yang Anda tentukan. Baris yang memiliki lebih banyak korespondensi dengan string kueri Anda akan mencetak lebih banyak dan diperingkat dengan skor ini. Skor nol berarti tidak ada korespondensi dan baris tidak dikembalikan di MySQL FTS. Periksa contoh ini ( bagian yang dikaburkan yang bisa sensitif ):
SELECT CASE WHEN LENGTH(content) > 140
THEN CONCAT( SUBSTRING (content, 1 , 140 ), ' ... ' )
ELSE content
END AS adapted_content,
MATCH(content) AGAINST ( ' lei ' IN NATURAL LANGUAGE MODE) AS score
FROM posts;Dalam pendekatan Boolean Anda dapat menggunakan beberapa alat lain yang dapat mengubah "skor" untuk setiap kata secara individual. Menggunakan mode bahasa alami Anda dapat menemukan beberapa kecocokan yang baik dan mudah diimplementasikan, terutama jika kami membandingkan dengan mode Boolean. Tetapi ini tidak mencakup kasus penggunaan ketika pengguna mengetik input secara tidak benar. Jadi ia mengharapkan dari pengguna yang sangat akurat dalam menulis - dan ini tidak pernah kebenaran. Kasus yang sama untuk PostgreSQL: Ada beberapa cara yang dapat Anda lakukan, tetapi. Di sini kami memiliki masalah yang dapat kami selesaikan hanya dengan menganalisis string yang lebih dalam . Lihat ketika kita hanya mengubah 'lei' menjadi 'le' (hapus 'i'), itu terjadi pada skor kita:
Untuk menyelesaikan masalah ini, Elasticsearches mengimplementasikannya dengan mesin Java Lucene. Ini membawa kepada kita banyak alat seperti kesalahan penafsiran, batang dan karakter khusus - como acentos na minha língua pátria! - dan lainnya. Semua hal ini bisa sangat rumit untuk dikembangkan oleh kita sendiri, jadi sangat dapat dibenarkan menggunakan Elasticsearch jika Anda mencari alat -alat itu.
$ gem install bundler
$ git clone [email protected]:abmBispo/rails-autocomplete.git
$ cd rails-autocomplete
$ bundle installSangat mudah untuk menjalankan wadah dependensi layanan rel ini - PostgreSQL dan Elasticsearch - alih -alih memasangnya di mesin Anda. Ini dapat membantu Anda menangani proses dan administrasi memori dan penyimpanan dengan lebih baik. Jadi di sini Anda mendapat cuplikan untuk melakukan hal itu:
$ docker run --name postgres-database -e POSTGRES_PASSWORD=postgres -d -p 5432:5432 -v $HOME /docker/volumes/postgres:/var/lib/postgresql/data postgres
$ docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -d -e " discovery.type=single-node " docker.elastic.co/elasticsearch/elasticsearch:7.6.2Jika Anda baru mengenal Docker dan hanya memiliki ini untuk menjalankan gambar, Anda bisa mematikannya dengan hanya mengeksekusi:
$ sudo docker stop $( sudo docker ps -a -q )Dan hidupkan lagi dengan:
$ sudo docker start $( sudo docker ps -a -q -f " status=exited " ) $ bin/rails db:create db:migrate db:seed $ bin/rails sDi sini Anda bisa mendapatkan dokumentasi singkat tentang tukang pos atas pencarian dan pembuatan API.