Pencarian dalam memori sederhana untuk koleksi ( Vec , HashMap , BTreeMap , dll.) Dan toko-toko nilai kunci. Fitur pelengkapan otomatis dan pencocokan fuzzy.
Ada banyak mesin pencari luar biasa yang tersedia untuk karat. Banyak yang tampaknya membutuhkan kompilasi biner server yang terpisah. Saya menginginkan sesuatu yang sederhana dan ringan-peti yang mudah digunakan yang dapat dengan mudah mencari struct dan koleksi dalam biner saya sendiri. Jadi, saya membuat indicium .
Sementara indicium dibuat dengan aplikasi web dalam pikiran, ini adalah pencarian dalam memori dan tidak skala tanpa batas atau ukuran cloud (yaitu ukuran Facebook atau Google). Bahkan dalam lingkungan seperti itu, itu masih akan menjadi cara yang nyaman untuk mencari daftar besar (seperti mata uang, bahasa, negara, dll.) Ini juga bagus untuk aplikasi di mana ada batasan skala yang diantisipasi (yaitu mencari daftar aset perusahaan, daftar pengguna dalam intranet perusahaan, dll.)
Indicium dapat dengan mudah menangani jutaan catatan tanpa berkeringat berkat Btreemap Rust. Peti ini terutama dibatasi oleh memori yang tersedia. Namun, tergantung pada sifat data Anda dan jika ada kata kunci yang diulang berkali-kali, kinerja mungkin mulai menurun pada suatu titik.
Konfigurasikan dependensi dalam file Cargo.toml proyek Anda:
[ dependencies ]
indicium = " 0.6 "Catatan rilis tersedia di GitHub.
Log perubahan penuh tersedia di GitHub.
Untuk contoh panduan start cepat kami, kami akan mencari di dalam struct berikut:
struct MyStruct {
title : String ,
year : u16 ,
body : String ,
} Untuk memulai, kita harus membuat catatan terindeks. Kami akan melakukan ini dengan mengimplementasikan sifat Indexable untuk struct kami. Idenya adalah mengembalikan String untuk setiap bidang yang ingin kami diindeks. Contoh:
use indicium :: simple :: Indexable ;
impl Indexable for MyStruct {
fn strings ( & self ) -> Vec < String > {
vec ! [
self .title.clone ( ) ,
self .year.to_string ( ) ,
self .body.clone ( ) ,
]
}
} Jangan lupa bahwa Anda dapat membuat angka, pengidentifikasi numerik, enum, dan jenis lain dalam struct (atau tipe kompleks lainnya) yang dapat diindeks dengan mengubahnya menjadi String dan memasukkannya ke dalam Vec<String> yang dikembalikan.
Untuk mengindeks koleksi yang ada, kami dapat mengulangi koleksi. Untuk setiap catatan, kami akan memasukkannya ke dalam indeks pencarian. Ini seharusnya terlihat seperti dua contoh ini:
use indicium :: simple :: SearchIndex ;
let my_vec : Vec < MyStruct > = Vec :: new ( ) ;
// In the case of a `Vec` collection, we use the index as our key. A
// `Vec` index is a `usize` type. Therefore we will instantiate
// `SearchIndex` as `SearchIndex<usize>`.
let mut search_index : SearchIndex < usize > = SearchIndex :: default ( ) ;
my_vec
. iter ( )
. enumerate ( )
. for_each ( | ( index , element ) |
search_index . insert ( & index , element )
) ; use std :: collections :: HashMap ;
use indicium :: simple :: SearchIndex ;
let my_hash_map : HashMap < String , MyStruct > = HashMap :: new ( ) ;
// In the case of a `HashMap` collection, we use the hash map's key as
// the `SearchIndex` key. In our hypothetical example, we will use
// MyStruct's `title` as a the key which is a `String` type. Therefore
// we will instantiate `HashMap<K, V>` as HashMap<String, MyStruct> and
// `SearchIndex<K>` as `SearchIndex<String>`.
let mut search_index : SearchIndex < String > = SearchIndex :: default ( ) ;
my_hash_map
. iter ( )
. for_each ( | ( key , value ) |
search_index . insert ( key , value )
) ; Selama sifat Indexable diimplementasikan untuk tipe nilai Anda, contoh -contoh di atas akan mengindeks Vec atau HashMap yang sebelumnya dihuni. Namun, metode yang disukai untuk koleksi besar adalah insert ke dalam SearchIndex saat Anda memasukkan ke dalam koleksi Anda (VEC, hashmap, dll.)
Disarankan untuk membungkus koleksi target Anda ( Vec Anda, HashMap , dll.) Dan SearchIndex ini bersama -sama dalam jenis struct baru. Kemudian, terapkan metode insert , replace , remove , dll. Untuk jenis struct baru ini yang akan memperbarui kedua koleksi dan indeks pencarian. Ini akan memastikan bahwa koleksi dan indeks Anda selalu disinkronkan.
Setelah indeks telah diisi, Anda dapat menggunakan metode search dan autocomplete .
Metode search akan mengembalikan kunci sebagai hasil pencarian. Setiap kunci yang dihasilkan kemudian dapat digunakan untuk mengambil catatan lengkap dari koleksinya.
Penggunaan Dasar:
let mut search_index : SearchIndex < usize > = SearchIndex :: default ( ) ;
search_index . insert ( & 0 , & "Harold Godwinson" ) ;
search_index . insert ( & 1 , & "Edgar Ætheling" ) ;
search_index . insert ( & 2 , & "William the Conqueror" ) ;
search_index . insert ( & 3 , & "William Rufus" ) ;
search_index . insert ( & 4 , & "Henry Beauclerc" ) ;
let resulting_keys : Vec < & usize > = search_index . search ( "William" ) ;
assert_eq ! ( resulting_keys, vec! [ & 2 , & 3 ] ) ;
// Demonstrating fuzzy matching:
let resulting_keys : Vec < & usize > = search_index . search ( "Harry" ) ;
assert_eq ! ( resulting_keys, vec! [ & 0 ] ) ; Cari hanya mendukung kecocokan kata kunci yang tepat. Untuk pencarian Live , pencocokan fuzzy hanya diterapkan pada kata kunci terakhir. Pertimbangkan untuk memberikan fitur autocomplete kepada pengguna Anda sebagai alternatif ergonomis untuk pencocokan fuzzy.
Metode autocomplete akan memberikan beberapa opsi pelengkapan otomatis untuk kata kunci terakhir dalam string yang disediakan.
Penggunaan Dasar:
let mut search_index : SearchIndex < usize > =
SearchIndexBuilder :: default ( )
. autocomplete_type ( & AutocompleteType :: Global )
. build ( ) ;
search_index . insert ( & 0 , & "apple" ) ;
search_index . insert ( & 1 , & "ball" ) ;
search_index . insert ( & 3 , & "bird" ) ;
search_index . insert ( & 4 , & "birthday" ) ;
search_index . insert ( & 5 , & "red" ) ;
let autocomplete_options : Vec < String > =
search_index . autocomplete ( "a very big bi" ) ;
assert_eq ! (
autocomplete_options,
vec! [ "a very big bird" , "a very big birthday" ]
) ;
// Demonstrating fuzzy matching:
let autocomplete_options : Vec < String > =
search_index . autocomplete ( "a very big birf" ) ;
assert_eq ! (
autocomplete_options,
vec! [ "a very big bird" , "a very big birthday" ]
) ;Peti ini dipertahankan secara pasif. Peti ini melakukan apa yang diharapkan untuk dilakukan dan melakukannya dengan cukup baik, menurut saya. Pembaruan yang sering tidak diharapkan.