Sebuah proyek yang menyenangkan untuk menulis mesin pencari kecil dan naif yang cocok untuk Small Data™.
Jalankan pengujian unit:
mix test --exclude external
Jalankan semua pengujian, termasuk pengujian yang mengandalkan layanan eksternal. Seperti tes RedisIndex
:
mix test
pastikan Anda memiliki connection_string yang benar untuk redis di config/config.exs . Anda dapat menggunakan docker-compose
untuk mengaktifkan dan menjalankan instance redis dengan cepat.
Setiap indeks di Cedrik diwakili oleh proses dengan Index
@behaviour
. Untuk mengindeks sesuatu ke dalam indeks cukup panggil Index.index_doc(something, :index_name, type)
di mana something
akan berupa peta atau struct Elixir (saya akan merekomendasikan membuat struct, dengan bidang id yang mengimplementasikan protokol Storable
- lihat di lib/document.ex
dan lib/agent_store.ex
untuk referensi), type
harus berupa salah satu implementasi indeks yang ada AgentIndex
atau RedisIndex
. Argumen terakhir untuk Index.index_doc
bersifat opsional dan defaultnya adalah AgentIndex
.
Untuk mendapatkan daftar indeks yang ada gunakan Index.list/0
atau Index.list/1
- ini akan mengembalikan daftar tupel dalam format {pid, name, module}
Ini adalah tipe indeks dalam memori yang naif, cocok untuk hal-hal yang sesuai dengan memori dan tidak perlu disimpan.
Ini adalah indeks yang didukung oleh redis. Anda harus mengaktifkan dan menjalankan instance redis agar ini berfungsi. Manfaat utama menggunakan RedisIndex dibandingkan AgentIndex adalah ketika Anda ingin mempertahankan data.
Untuk saat ini token hanyalah string apa pun yang dipisahkan oleh spasi.
Gunakan Search.search(query_struct, [:index1, :index2])
, lihat test/e2e_test.exs
dan test/query_test.exs
sebagai contoh.
Untuk mendapatkan query_struct
yang dipahami Cedrik, ada parser sederhana (dan tidak lengkap) untuk string: Query.Parse.parse/1
. Ini akan memberi token pada string dan kemudian membuat struct kueri Term dan Wildcard yang sesuai. Syarat dan Wildcard akan dibungkus dengan Boolean, di dalam kolom must.
Kueri ini akan mengembalikan semua id dokumen dalam indeks yang ditentukan.
TermQuery hanya memberikan kembali id dokumen (dan lokasi istilah dalam dokumen itu) yang berisi istilah tertentu. Anda dapat menentukan dengan tepat bidang apa yang ingin dicari, atau semuanya (yang merupakan default).
Dengan BooleanQuery Anda dapat membuat kueri lebih lanjut. must
, optional
dan must_not
Kueri ini dapat membantu memperluas jangkauan Anda. Misalnya, kueri Wildcard dengan nilai "foo*"
cocok dengan foo dan foobar. Perhatikan bahwa hanya satu wildcard yang didukung untuk saat ini, baik di awal ( *foo
) atau di akhir ( foo*
)
Saat ini hasil dari Search.search/2
akan memberi Anda daftar tupel yang terlihat seperti: {doc_id, #MapSet<[%Location{field: :field, position: x}]>}
diurutkan berdasarkan hal-hal yang paling banyak hits Pertama.