Elasticsearch adalah mesin pencari dengan json rest api, menggunakan Lucene dan ditulis dalam Java. Penjelasan tentang semua kelebihan mesin ini tersedia di situs resmi. Berikut ini kita akan menyebut Elasticsearch sebagai ES.
Mesin serupa digunakan untuk pencarian kompleks dalam database dokumen. Misalnya pencarian berdasarkan morfologi bahasa atau pencarian berdasarkan koordinat geografis.
Pada artikel kali ini saya akan membahas tentang dasar-dasar ES dengan menggunakan contoh pengindeksan postingan blog. Saya akan menunjukkan cara memfilter, mengurutkan, dan mencari dokumen.
Agar tidak bergantung pada sistem operasi, saya akan membuat semua permintaan ke ES menggunakan CURL. Ada juga plugin untuk google chrome bernama rasa.
Teks tersebut berisi tautan ke dokumentasi dan sumber lain. Di bagian akhir terdapat tautan untuk akses cepat ke dokumentasi. Definisi istilah asing dapat ditemukan di ΠΎΡΡΠ°ΡΠΈΠΈ.
Instalasi
Untuk melakukan ini, pertama-tama kita memerlukan Java. Pengembang Sarankan instal versi Java yang lebih baru dari pembaruan Java 8 20 atau pembaruan Java 7 55.
ES otomatis dibuat indeks blog dan Ketik pos. Kita dapat menggambar analogi kondisional: indeks adalah database, dan tipe adalah tabel dalam database ini. Setiap jenis memiliki skemanya sendiri - pemetaan, seperti tabel relasional. Pemetaan dihasilkan secara otomatis ketika dokumen diindeks:
# ΠΠΎΠ»ΡΡΠΈΠΌ mapping Π²ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ² ΠΈΠ½Π΄Π΅ΠΊΡΠ° blog
curl -XGET "$ES_URL/blog/_mapping?pretty"
Dalam respons server, saya menambahkan nilai bidang dokumen yang diindeks di komentar:
Perlu dicatat bahwa ES tidak membedakan antara nilai tunggal dan serangkaian nilai. Misalnya, bidang judul hanya berisi judul, dan bidang tag berisi larik string, meskipun direpresentasikan dengan cara yang sama dalam pemetaan.
Kita akan membicarakan lebih banyak tentang pemetaan nanti.
Pertanyaan
Mengambil dokumen berdasarkan idnya:
# ΠΈΠ·Π²Π»Π΅ΡΠ΅ΠΌ Π΄ΠΎΠΊΡΠΌΠ΅Π½Ρ Ρ id 1 ΡΠΈΠΏΠ° post ΠΈΠ· ΠΈΠ½Π΄Π΅ΠΊΡΠ° blog
curl -XGET "$ES_URL/blog/post/1?pretty"
Kunci baru muncul di respons: _version ΠΈ _source. Secara umum, semua kunci dimulai dengan _ tergolong resmi.
ΠΠ»ΡΡ _version menunjukkan versi dokumen. Hal ini diperlukan agar mekanisme penguncian optimis dapat bekerja. Misal kita ingin mengubah dokumen yang memiliki versi 1. Kita submit dokumen yang diubah tersebut dan menandakan bahwa ini merupakan editan dari dokumen dengan versi 1. Jika ada orang lain yang juga mengedit dokumen dengan versi 1 dan mengajukan perubahan sebelum kita, maka ES tidak akan menerima perubahan kita, karena itu menyimpan dokumen dengan versi 2.
ΠΠ»ΡΡ _source berisi dokumen yang kami indeks. ES tidak menggunakan nilai ini untuk operasi pencarian karena Indeks digunakan untuk mencari. Untuk menghemat ruang, ES menyimpan dokumen sumber terkompresi. Jika kita hanya membutuhkan id saja, dan bukan seluruh dokumen sumber, maka kita dapat menonaktifkan penyimpanan sumber.
Jika tidak membutuhkan informasi tambahan, kita hanya bisa mendapatkan isi _source saja:
Kami memilih posting terakhir. size membatasi jumlah dokumen yang akan diterbitkan. total menunjukkan jumlah total dokumen yang cocok dengan permintaan. sort dalam output berisi array bilangan bulat yang digunakan untuk menyortir. Itu. tanggal diubah menjadi bilangan bulat. Anda dapat membaca lebih lanjut tentang pengurutan dokumentasi.
Filter dan kueri
ES sejak versi 2 tidak membedakan antara filter dan kueri konsep konteks diperkenalkan.
Konteks kueri berbeda dari konteks filter karena kueri menghasilkan _score dan tidak disimpan dalam cache. Saya akan menunjukkan kepada Anda apa itu _score nanti.
Filter berdasarkan tanggal
Kami menggunakan permintaan tersebut jarak dalam konteks filter:
Namun jika kita mencari βceritaβ di kolom konten, kita tidak akan menemukan apa pun, karena Indeks hanya berisi kata-kata asli, bukan kata dasar. Untuk melakukan pencarian berkualitas tinggi, Anda perlu mengkonfigurasi penganalisis.
Lapangan _score acara relevansi. Jika permintaan dijalankan dalam konteks filter, maka nilai _score akan selalu sama dengan 1, yang berarti filter benar-benar cocok.
Penganalisis
Penganalisis diperlukan untuk mengubah teks sumber menjadi sekumpulan token.
Alat analisa terdiri dari satu Tokenizer dan beberapa opsional Filter Token. Tokenizer mungkin didahului oleh beberapa Filter Char. Tokenizer memecah string sumber menjadi token, seperti spasi dan karakter tanda baca. TokenFilter dapat mengubah token, menghapus atau menambahkan yang baru, misalnya menyisakan kata dasar saja, menghilangkan preposisi, menambahkan sinonim. CharFilter - mengubah seluruh string sumber, misalnya, memotong tag html.
Penganalisis standar membagi string menjadi spasi dan mengubah semuanya menjadi huruf kecil, penganalisis Rusia menghapus kata-kata yang tidak penting, mengubahnya menjadi huruf kecil dan meninggalkan batang kata.
Mari kita lihat Tokenizer, TokenFilters, CharFilters mana yang digunakan oleh penganalisis Rusia:
Mari kita jelaskan penganalisis kami berdasarkan bahasa Rusia, yang akan memotong tag html. Sebut saja default, karena penganalisis dengan nama ini akan digunakan secara default.
Pertama, semua tag HTML akan dihapus dari string sumber, kemudian standar tokenizer akan membaginya menjadi token, token yang dihasilkan akan dipindahkan ke huruf kecil, kata-kata yang tidak penting akan dihapus, dan token yang tersisa akan tetap menjadi batang kata.
Membuat indeks
Di atas kami menjelaskan penganalisis default. Ini akan berlaku untuk semua bidang string. Postingan kami berisi serangkaian tag, sehingga tag tersebut juga akan diproses oleh penganalisis. Karena Kami mencari postingan dengan pencocokan persis dengan sebuah tag, lalu kami perlu menonaktifkan analisis untuk bidang tag.
Mari kita buat indeks blog2 dengan penganalisis dan pemetaan, di mana analisis bidang tag dinonaktifkan:
Mari tambahkan 3 postingan yang sama ke indeks ini (blog2). Saya akan menghilangkan proses ini karena... ini mirip dengan menambahkan dokumen ke indeks blog.
Karena Kami menggunakan penganalisa dengan stemming Rusia, maka permintaan ini akan mengembalikan semua dokumen, meskipun hanya berisi kata 'sejarah'.
Permintaan mungkin berisi karakter khusus, misalnya:
""fried eggs" +(eggplant | potato) -frittata"
Sintaks permintaan:
+ signifies AND operation
| signifies OR operation
- negates a single token
" wraps a number of tokens to signify a phrase for searching
* at the end of a term signifies a prefix query
( and ) signify precedence
~N after a word signifies edit distance (fuzziness)
~N after a phrase signifies slop amount
Jika Anda tertarik dengan artikel-pelajaran serupa, mempunyai ide untuk artikel baru, atau mempunyai usulan kerjasama, maka saya akan dengan senang hati menerima pesan melalui pesan pribadi atau email. [email dilindungi].