Saya ingat bahwa guru Java pernah mengatakan pertanyaan wawancara tentang Baidu, yang kira -kira berarti "ada 10.000 catatan yang tidak teratur, bagaimana cara dengan cepat menemukan catatan yang Anda inginkan dari mereka." Ini setara dengan mesin pencari sederhana. Baru -baru ini, saya sudah menyadari hal ini dalam pekerjaan yang telah saya selesaikan tahun ini. Hari ini saya akan berbagi dengan Anda lebih lanjut abstrak.
Pertama -tama tulis kode implementasi spesifik, dan tulis ide dan logika implementasi spesifik setelah kode.
Kacang digunakan untuk menyortir selama pencarian
/ ** *@Deskripsi: */ paket cn.lulei.search.engine.model; kelas publik sortbean {private string id; waktu int pribadi; string publik getId () {return id; } public void setId (string id) {this.id = id; } public int gettimes () {return Times; } public void settime (int Times) {this.times = kali; }} Struktur data pencarian yang dibangun dan algoritma pencarian sederhana
/ ** *@Deskripsi: */ paket cn.lulei.search.engine; impor java.util.arraylist; impor java.util.collections; impor java.util.comparator; impor java.util.hashmap; impor java.util.hashset; impor java.util.list; impor cn.lulei.search.engine.model.sortbean; Public Class SerachBase {// Detail menyimpan informasi terperinci dari objek pencarian, di mana kunci adalah pengidentifikasi unik untuk membedakan objek private hashmap <string, objek> detail = hashmap baru <string, objek> (); // Untuk kata kunci yang berpartisipasi dalam pencarian, penyimpanan array jarang yang digunakan di sini juga dapat disimpan menggunakan hashmap. Format definisi adalah sebagai berikut // private static hashMap <integer, hashset <string>> keysearch = hashmap baru <integer, hashset <string>> (); // Nilai kunci dari media hashmap setara dengan subskrip dalam array yang jarang, dan nilainya setara dengan nilai array yang jarang pada posisi ini private final static int maxlength = character.max_value; @SuppressWarnings ("Uncecked") Private HashSet <Rips> [] Keysearch = HashSet baru [MAXLength]; / ***@Deskripsi: Menerapkan mode singleton, menggunakan inisialisasi pada pemegang permintaan untuk memuat*@versi: 1.1.0*/ kelas privat statis lazyloadserachbase {private static final serachbase serachbase = baru serachbase (); } / *** Mode singleton diatur ke fungsi pribadi di sini* / private serachbase () {} / *** @return* @description: dapatkan singleton* / public static serachbase geterachbase () {return lazyloadserachbase.serachbase; } / ** * @param id * @return * @description: Dapatkan detail berdasarkan ID * / objek publik getObject (string id) {return details.get (id); } / ** * @param IDS * @return * @description: Dapatkan detail berdasarkan ID, pisahkan ID dengan "," * / Daftar Publik <Peject> getObjects (ID String) {if (ids == null || "" .Equals (id)) {return null; } Daftar <POMPENT> OBJS = NEW ARRAYLIST <POMPERTIF> (); String [] idArray = ids.split (","); untuk (ID string: idArray) {objs.add (getObject (id)); } mengembalikan objs; } / ** * @param Key * @return * @description: Temukan ID yang sesuai sesuai dengan istilah pencarian, dan gunakan "," untuk membagi antara id * / string publik getIds (tombol string) {if (key == null || "" .Equals (key)) {return null; } // Temukan // IdTimes menyimpan apakah setiap karakter dalam istilah pencarian muncul di ID di ID. IDTimes = hashmap baru <string, integer> idTimes = hashmap baru <string, integer> (); // IDS menyimpan ID karakter dalam istilah pencarian. Hashset <string> ids = hashset baru <string> (); // menemukan untuk (int i = 0; i <key.length (); i ++) {int at = key.charat (i); // Tidak ada karakter yang sesuai dalam istilah pencarian. Kemudian mencocokkan karakter berikutnya if (Keysearch [at] == null) {lanjutkan; } untuk (objek obj: keysearch [at] .toArray ()) {string id = (string) obj; int kali = 1; if (ids.contains (id)) {Times += IDTimes.get (id); idtimes.put (id, kali); } else {ids.add (id); idtimes.put (id, kali); }}} // urutkan dengan daftar array <sristbean> sortbeans = new arraylist <sristbean> (); for (string id: ids) {sortbean sortbean = new sortbean (); sortbeans.add (sortbean); sortbean.setid (id); sortbean.settimes (idTimes.get (id)); } Collections.sort (sortbeans, pembanding baru <sristbean> () {public int compare (sortbean o1, sortbean o2) {return o2.gettimes () - o1.gettimes ();}}); // konstruk return string stringBuffer sb = stringBuffer baru (); untuk (sortbean sortbean: sortbeans) {sb.append (sortbean.getId ()); SB.Append (","); } // Lepaskan sumber daya IDTimes.Clear (); idtimes = null; ids.clear (); id = null; sortbeans.clear (); sortbeans = null; // return return sb.tostring (); } /** * @param id * @param SearchKey * @param obj * @description: Tambahkan riwayat pencarian * /public void add (string id, string SearchKey, objek obj) {// parameter sebagian kosong dan tidak memuat if (id == null || searchkey == null || obj == null) {return; } // simpan detail objek.put (id, obj); // Simpan istilah pencarian AddSearchKey (ID, SearchKey); }/** * @param ID * @param SearchKey * @Description: Tambahkan istilah pencarian ke domain pencarian */void pribadi addSearchKey (ID string, string searchKey) {// Parameter terpisah kosong dan tidak dimuat // Ini adalah metode pribadi, dan penilaian berikut dapat dilakukan, tetapi untuk spesifikasi desain, jika ID == NULUL | NOULGER | NOULGE; } // Berikut ini adalah karakter participle. Di sini Anda juga dapat menggunakan kata participles kata dewasa lainnya untuk (int i = 0; i <SearchKey.length (); i ++) {// Nilai AT setara dengan subskrip array, dan hashset yang terdiri dari ID setara dengan nilai array int at = searchkey.charat (i); if (keysearch [at] == null) {hashset <string> value = hashset baru <string> (); KeySearch [at] = nilai; } Keysearch [at] .add (id); }}} Kasus Uji:
/ ** *@Deskripsi: */ paket cn.lulei.search.engine.test; impor java.util.list; impor cn.lulei.search.engine.serachbase; tes kelas publik {public static void main (string [] args) {// TODO Metode yang dihasilkan secara otomatis Stub serachbase serachbase = serachbase.getserachbase (); serachbase.add ("1", "halo!", "Halo!"); serachbase.add ("2", "Halo! Saya Zhang San.", "Halo! Saya Zhang San."); serachbase.add ("3", "Cuacanya cukup bagus hari ini."); serachbase.add ("4", "Siapa kamu?", "Siapa kamu?"); serachbase.add ("5", "Subjek matematika lanjutan itu sulit", "matematika tinggi memang sulit."); serachbase.add ("6", "tes", "di atas hanya tes"); ID string = serachbase.getIds ("matematika tinggi Anda"); System.out.println (IDS); Daftar <POMPEST> OBJS = SerachBase.GetObjects (IDS); if (objs! = null) {for (objek obj: objs) {system.out.println ((string) obj); }}}} Hasil output tes adalah sebagai berikut:
5, 3, 2, 1, 4, angka yang lebih tinggi memang sulit. Cuaca hari ini cukup bagus. Halo! Saya Zhang San. Halo! Siapa kamu?
Mesin pencari sederhana seperti itu dianggap selesai.
Pertanyaan 1: Kata participle di sini menggunakan karakter participle, yang cukup bagus dalam menangani bahasa Mandarin, tetapi sangat lemah dalam menangani bahasa Inggris.
Metode Peningkatan: Gunakan metode segmentasi kata dewasa saat ini, seperti Ikanalyzer, StandardAnalyzer, dll. Dengan cara ini, struktur data Keysearch perlu dimodifikasi, yang dapat dimodifikasi menjadi hashmap pribadi <string, string> [] keysearch = hashMap baru [maxlength]; di mana kunci menyimpan elemen kata bagian, dan nilai menyimpan ID pengidentifikasi yang unik.
Pertanyaan 2: Mesin pencari yang diimplementasikan dalam artikel ini tidak menetapkan bobot untuk elemen kata seperti Lucene, tetapi hanya menentukan apakah elemen kata muncul dalam objek.
Metode Peningkatan: Belum ada. Menambahkan pemrosesan berat membuat struktur data lebih kompleks, sehingga belum diproses untuk saat ini, dan pemrosesan berat akan diimplementasikan dalam artikel mendatang.
Mari kita perkenalkan secara singkat ide -ide implementasi mesin pencari .
Atur dua properti detail dan Keysearch di kelas Serachbase. Detail digunakan untuk menyimpan informasi terperinci dari objek, dan Keysearch digunakan untuk mengindeks domain pencarian. Detail format data adalah hashmap, dan format data Keysearch adalah array yang jarang (juga bisa hashmap, nilai kunci medium hashmap setara dengan subskrip dalam array yang jarang, dan nilainya setara dengan nilai array yang jarang pada posisi ini).
Saya tidak akan memberikan terlalu banyak pengantar detail.
Metode perhitungan subskrip array dalam Keysearch (seperti hashmap adalah kunci) adalah untuk mendapatkan nilai int pertama dari elemen kata (karena kata participle dalam artikel ini menggunakan karakter participle, jadi karakter adalah elemen kata). Nilai int adalah subskrip dari array, dan nilai array yang sesuai adalah pengidentifikasi unik dari objek. Dengan cara ini, struktur data Keysearch adalah sebagai berikut
Karena itu, ketika Anda ingin menambahkan catatan baru, Anda hanya perlu memanggil metode Tambah.
Logika implementasi untuk pencarian mirip dengan Keysearch di atas. Untuk pencarian ID, cukup gunakan metode GET HashMap. Untuk pencarian istilah pencarian, proses keseluruhan juga menggunakan segmentasi kata terlebih dahulu, kueri kedua, dan diurutkan terakhir. Tentu saja, kata participle di sini harus konsisten dengan kata participle yang digunakan untuk membuat (yaitu, karakter participle digunakan saat membuat, dan karakter participle juga digunakan saat mencari).
Dalam metode GetIDS, hashmap <string, integer> idTimes = new HashMap <string, integer> (); variabel idtime digunakan untuk menyimpan berapa banyak elemen kata dalam istilah pencarian muncul di keysearch. Nilai kuncinya adalah ID pengidentifikasi unik dan nilainya adalah jumlah elemen kata yang muncul. Hashset <string> ids = hashset baru <string> (); Variabel IDS digunakan untuk menyimpan ID dari terjadinya kata tersebut. Kompleksitas pencarian dengan cara ini adalah jumlah elemen kata dan istilah pencarian. Dapatkan ID yang berisi elemen kata, buat array sortbean, dan urutkan. Aturan penyortirannya adalah untuk turun urutan jumlah elemen kata. Akhirnya, string IDS dikembalikan, dan setiap ID dibagi oleh ",". Jika Anda ingin mendapatkan informasi terperinci, gunakan metode GetObjects.
Di atas hanyalah mesin pencari sederhana dan belum merancang terlalu banyak metode perhitungan. Saya berharap ini akan menginspirasi pembelajaran semua orang.