Elasticsearch adalah enjin carian sumber terbuka yang menjadi semakin popular kerana prestasi tinggi dan seni bina yang diedarkan. Artikel ini akan meneroka ciri -ciri utamanya dan membimbing anda cara menggunakannya untuk membuat enjin carian Node.js.
mata utama
Pengenalan kepada Elasticsearch
Elasticsearch dibina di atas Apache Lucene, perpustakaan enjin carian teks berprestasi tinggi. Walaupun Elasticsearch dapat melakukan penyimpanan dan pengambilan data, tujuan utamanya bukan untuk bertindak sebagai pangkalan data, tetapi enjin carian (pelayan), yang tujuan utamanya adalah untuk mengindeks, mencari dan menyediakan statistik data masa nyata.Elasticsearch mempunyai seni bina yang diedarkan yang dapat mencapai skala mendatar dengan menambahkan lebih banyak nod dan memanfaatkan perkakasan tambahan. Ia menyokong beribu -ribu nod untuk memproses petabytes data. Penskalaan mendatarnya juga bermakna ia mempunyai ketersediaan yang tinggi dan boleh mengimbangi semula data jika ada nod gagal.
Selepas mengimport data, ia akan digunakan dengan segera untuk mencari. Elasticsearch adalah bebas skema, menyimpan data dalam dokumen JSON dan secara automatik dapat mengesan struktur dan jenis data secara automatik.
Elasticsearch juga berkuasa API. Ini bermakna hampir semua operasi boleh dilakukan melalui API RESTful yang mudah menggunakan data JSON pada HTTP. Ia menyediakan banyak perpustakaan pelanggan untuk hampir semua bahasa pengaturcaraan, termasuk Node.js. Dalam tutorial ini, kami akan menggunakan perpustakaan klien rasmi.
Elasticsearch sangat fleksibel dari segi keperluan perkakasan dan perisian. Walaupun persekitaran pengeluaran yang disyorkan adalah 64GB RAM dan seberapa banyak teras CPU yang mungkin, anda masih boleh menjalankannya pada sistem yang terkawal sumber dan mendapatkan prestasi yang baik (dengan asumsi dataset anda tidak begitu besar). Untuk mengikuti contoh -contoh dalam artikel ini, sistem dengan memori 2GB dan teras CPU tunggal sudah cukup.
Anda boleh menjalankan Elasticsearch pada semua sistem operasi utama (Linux, Mac OS, dan Windows). Untuk melakukan ini, anda perlu memasang versi terkini Java Runtime Environment (lihat bahagian "Pemasangan Elasticsearch"). Untuk mengikuti contoh -contoh dalam artikel ini, anda juga perlu memasang Node.js (mana -mana versi selepas v0.11.0 akan dilakukan), serta NPM.
terminologi elasticsearch
Elasticsearch menggunakan istilahnya sendiri, yang berbeza dalam beberapa kes dari sistem pangkalan data biasa. Berikut adalah senarai istilah yang biasa digunakan dan makna mereka di Elasticsearch.
Indeks: Istilah ini mempunyai dua makna dalam konteks Elasticsearch. Yang pertama ialah operasi menambah data. Apabila data ditambah, teks itu dipecah menjadi tag (seperti kata -kata), dan setiap tag diindeks. Walau bagaimanapun, indeks juga merujuk kepada lokasi di mana semua data indeks disimpan. Pada asasnya, apabila anda mengimport data, ia akan diindeks ke dalam indeks. Setiap kali anda ingin melakukan apa sahaja pada data anda, anda perlu menentukan nama indeksnya.
Jenis: Elasticsearch menyediakan klasifikasi dokumen yang lebih terperinci dalam indeks, yang dipanggil Jenis. Setiap dokumen dalam indeks juga harus mempunyai jenis. Sebagai contoh, kita boleh menentukan indeks perpustakaan dan kemudian mengindeks pelbagai jenis data (seperti artikel, buku, laporan, dan persembahan) ke dalamnya. Oleh kerana indeks mempunyai overhead hampir tetap, adalah disyorkan untuk menggunakan indeks yang lebih sedikit dan lebih banyak jenis dan bukan lebih banyak indeks dan jenis yang lebih sedikit.
Cari: Istilah ini mungkin sama seperti yang anda fikirkan. Anda boleh mencari data dalam indeks dan jenis yang berbeza. Elasticsearch menyediakan banyak jenis pertanyaan carian, seperti terma, frasa, julat, kabur, dan juga pertanyaan data geografi.
Penapis: Elasticsearch membolehkan anda menapis hasil carian berdasarkan kriteria yang berbeza untuk memperbaiki julat hasil. Jika anda menambah pertanyaan carian baru ke satu set dokumen, ia boleh mengubah pesanan mengikut kebergantungan, tetapi jika anda menambah pertanyaan yang sama sebagai penapis, perintah itu tetap sama.
Agregasi: Ini menyediakan pelbagai jenis statistik untuk data agregat, seperti minimum, maksimum, purata, jumlah, histogram, dan banyak lagi.
Cadangan: Elasticsearch menyediakan pelbagai jenis cadangan untuk teks input. Cadangan ini boleh berdasarkan terma atau frasa, dan juga cadangan dapat diselesaikan.
Pasang Elasticsearch
Elasticsearch boleh didapati di bawah lesen Apache 2; Sebelum memasangnya, anda perlu memastikan bahawa Java Runtime Environment (JRE) dipasang pada komputer anda. Elasticsearch ditulis di Java dan bergantung kepada perpustakaan Java untuk dijalankan. Untuk memeriksa sama ada Java dipasang pada sistem anda, anda boleh menaip perkara berikut dalam baris arahan.
<code>java -version</code>
Versi stabil terbaru Java disyorkan (1.8 pada masa penulisan). Anda boleh mencari panduan untuk memasang Java pada sistem anda di sini.
Seterusnya, untuk memuat turun versi terkini Elasticsearch (2.4.0 pada masa penulisan), lawati halaman muat turun dan muat turun fail zip. Elasticsearch tidak memerlukan pemasangan, dan fail zip tunggal mengandungi set lengkap fail yang menjalankan program pada semua sistem operasi yang disokong. Unzip fail yang dimuat turun dan sudah selesai! Terdapat beberapa cara lain untuk menjalankan Elasticsearch, seperti mendapatkan fail tar atau pakej untuk pengagihan Linux yang berbeza (lihat di sini).
Jika anda menjalankan Mac OS X dan memasang homebrew, anda boleh menggunakan Brew Install Elasticsearch untuk memasang Elasticsearch. HomeBrew secara automatik akan menambahkan Executable ke laluan anda dan memasang perkhidmatan yang diperlukan. Ia juga membantu anda mengemas kini aplikasi anda dengan satu arahan: Menaik taraf Brew Elasticsearch.
Untuk menjalankan Elasticsearch di Windows, jalankan binelasticsearch.bat dari direktori yang dibongkar. Untuk semua sistem operasi lain, jalankan ./bin/Elasticsearch dari terminal. Pada ketika ini ia harus berjalan pada sistem anda.
Seperti yang saya nyatakan sebelum ini, hampir semua yang anda boleh lakukan dengan Elasticsearch boleh dilakukan melalui API REST. Elasticsearch menggunakan port 9200 secara lalai. Untuk memastikan anda menjalankannya dengan betul, lawati http: // localhost: 9200/dalam penyemak imbas anda, yang sepatutnya menunjukkan beberapa maklumat asas mengenai contoh yang anda jalankan.
Untuk maklumat lanjut mengenai pemasangan dan penyelesaian masalah, anda boleh mengakses dokumentasi.
antara muka pengguna grafik
Elasticsearch menyediakan hampir semua ciri melalui API REST dan tidak datang dengan antara muka pengguna grafik (GUI). Walaupun saya telah meliputi cara melakukan semua operasi yang diperlukan melalui API dan Node.js, terdapat beberapa alat GUI yang menyediakan maklumat visual mengenai indeks dan data, dan juga beberapa analisis lanjutan.
Kibana, yang dibangunkan oleh syarikat yang sama, memberikan ringkasan masa nyata data, serta beberapa pilihan visualisasi dan analisis tersuai. Kibana adalah percuma dan mempunyai dokumentasi terperinci.
Komuniti juga telah membangunkan alat lain, termasuk Elasticsearch-Head, The Elasticsearch GUI, dan juga sambungan Chrome yang dipanggil Elasticsearch Toolbox. Alat ini dapat membantu anda melayari indeks dan data dalam penyemak imbas anda, dan juga cuba carian yang berbeza dan pertanyaan agregat. Semua alat ini menyediakan panduan untuk pemasangan dan penggunaan.
Tetapkan persekitaran node.js
Elasticsearch menyediakan modul rasmi untuk node.js yang dipanggil Elasticsearch. Pertama, anda perlu menambah modul ke folder projek anda dan simpan kebergantungan untuk kegunaan masa depan.
<code>npm install elasticsearch --save</code>
anda kemudian boleh mengimport modul dalam skrip seperti berikut:
<code>java -version</code>
Akhirnya, anda perlu menyediakan pelanggan yang mengendalikan komunikasi dengan Elasticsearch. Dalam contoh ini, saya menganggap anda sedang menjalankan Elasticsearch pada mesin tempatan anda dengan alamat IP 127.0.0.1 dan pelabuhan 9200 (tetapan lalai).
<code>npm install elasticsearch --save</code>
memastikan bahawa semua kesilapan dilog masuk. Untuk seluruh artikel ini, saya akan menggunakan objek Esclient yang sama untuk berkomunikasi dengan Elasticsearch. Dokumentasi lengkap modul nod disediakan di sini.
Nota: Semua kod sumber untuk tutorial ini boleh didapati di GitHub. Cara paling mudah untuk diikuti adalah untuk mengklon repositori ke PC anda dan jalankan contoh dari sana:
<code>const elasticsearch = require('elasticsearch');</code>
Data import
Dalam tutorial ini, saya akan menggunakan dataset artikel akademik dengan kandungan yang dijana secara rawak. Data disediakan dalam format JSON, dan terdapat 1,000 artikel dalam dataset. Untuk memaparkan gaya data, item dalam dataset ditunjukkan di bawah.
<code>const esClient = new elasticsearch.Client({ host: '127.0.0.1:9200', log: 'error' });</code>
Nama medan adalah jelas. Satu -satunya perkara yang perlu diperhatikan ialah medan badan tidak ditunjukkan di sini, kerana ia mengandungi dokumen yang dijana secara rawak (termasuk 100 hingga 200 perenggan). Anda boleh mencari dataset lengkap di sini.
Walaupun Elasticsearch menyediakan kaedah untuk mengindeks, mengemaskini, dan memadam titik data individu, kami akan menggunakan kaedah batch Elasticserch untuk mengimport data, yang digunakan untuk melaksanakan operasi pada dataset yang besar dengan lebih cekap:
<code>git clone https://github.com:sitepoint-editors/node-elasticsearch-tutorial.git cd node-elasticsearch-tutorial npm install</code>
di sini, kita panggil fungsi Bulkindex, lulus perpustakaan sebagai nama indeks, artikel sebagai jenis, dan data JSON yang kita mahu indeks. Fungsi Bulkindex memanggil kaedah pukal pada objek esclient pada gilirannya. Kaedah ini mengambil objek dengan atribut badan sebagai parameter. Nilai yang diberikan kepada harta badan adalah array dengan dua penyertaan setiap operasi. Dalam entri pertama, jenis operasi ditentukan sebagai objek JSON. Dalam objek ini, harta indeks menentukan operasi yang akan dilakukan (dalam hal ini dokumen indeks), serta nama indeks, nama jenis, dan ID dokumen. Entri seterusnya sepadan dengan dokumen itu sendiri.
Sila ambil perhatian bahawa pada masa akan datang anda boleh menambah jenis dokumen lain (seperti buku atau laporan) kepada indeks yang sama dengan cara ini. Kami juga boleh menetapkan ID yang unik untuk setiap dokumen, tetapi ini adalah pilihan - jika anda tidak menyediakan satu, Elasticsearch akan memberikan anda ID yang dijana secara rawak yang unik untuk setiap dokumen.
Dengan mengandaikan anda telah mengkloning repositori, kini anda boleh mengimport data ke Elasticsearch dengan melaksanakan arahan berikut dari Root Projek:
<code>{ "_id": "57508457f482c3a68c0a8ab3", "title": "Nostrud anim proident cillum non.", "journal": "qui ea", "volume": 54, "number": 11, "pages": "109-117", "year": 2014, "authors": [ { "firstname": "Allyson", "lastname": "Ellison", "institution": "Ronbert", "email": "Allyson@Ronbert.tv" }, ... ], "abstract": "Do occaecat reprehenderit dolore ...", "link": "http://mollit.us/57508457f482c3a68c0a8ab3.pdf", "keywords": [ "sunt", "fugiat", ... ], "body": "removed to save space" }</code>
periksa sama ada data diindeks dengan betul
Ciri utama Elasticsearch adalah carian masa nyata. Ini bermakna apabila dokumen diindeks, mereka boleh mencari dalam masa yang kedua (lihat di sini). Sebaik sahaja data diindeks, anda boleh menyemak maklumat indeks dengan menjalankan indeks.js (dihubungkan dengan kod sumber):
// index.js const bulkIndex = function bulkIndex(index, type, data) { let bulkBody = []; data.forEach(item => { bulkBody.push({ index: { _index: index, _type: type, _id: item.id } }); bulkBody.push(item); }); esClient.bulk({body: bulkBody}) .then(response => { console.log('here'); let errorCount = 0; response.items.forEach(item => { if (item.index && item.index.error) { console.log(++errorCount, item.index.error); } }); console.log( `Successfully indexed ${data.length - errorCount} out of ${data.length} items` ); }) .catch(console.err); }; const test = function test() { const articlesRaw = fs.readFileSync('data.json'); bulkIndex('library', 'article', articles); };
Kaedah dalam objek kucing klien menyediakan maklumat yang berbeza mengenai contoh yang sedang berjalan. Kaedah indeks menyenaraikan semua indeks, kesihatan mereka, bilangan dokumen, dan saiznya pada cakera. Pilihan V menambah tajuk kepada tindak balas kaedah CAT.
Apabila anda menjalankan coretan kod di atas, anda akan melihat bahawa ia mengeluarkan kod warna untuk menunjukkan kesihatan kluster. Merah menunjukkan bahawa terdapat masalah dengan kluster dan ia tidak berjalan. Kuning menunjukkan kluster sedang berjalan, tetapi ada amaran, dan hijau menunjukkan semuanya baik -baik saja. Kemungkinan besar (bergantung pada tetapan anda), anda mendapat keadaan kuning ketika berjalan pada mesin tempatan anda. Ini kerana tetapan lalai mengandungi lima nod kluster, tetapi hanya satu contoh yang berjalan pada mesin tempatan anda. Walaupun anda harus sentiasa berusaha untuk negara hijau dalam pengeluaran, untuk tujuan tutorial ini, anda boleh terus menggunakan Elasticsearch di Negeri Kuning.
<code>java -version</code>
pemetaan dinamik dan tersuai
Seperti yang saya nyatakan sebelum ini, Elasticsearch adalah corak. Ini bermakna anda tidak perlu menentukan struktur data sebelum mengimportnya (sama seperti menentukan jadual dalam pangkalan data SQL), tetapi Elasticsearch akan mengesannya secara automatik untuk anda. Walau bagaimanapun, walaupun dipanggil skemaless, struktur data mempunyai beberapa batasan.
Elasticsearch memanggil struktur data pemetaan. Jika tiada pemetaan wujud, Elasticsearch melihat setiap bidang data JSON semasa mengindeks data dan secara automatik mentakrifkan pemetaan berdasarkan jenisnya. Jika medan sudah mempunyai entri pemetaan, ia memastikan bahawa data baru ditambah mengikuti format yang sama. Jika tidak, ia akan membuang kesilapan.
Sebagai contoh, jika {"key1": 12} telah diindeks, Elasticsearch akan secara automatik memetakan Key1 ke Long. Sekarang, jika anda cuba mengindeks {"key1": "value1", "key2": "value2"}, ia melemparkan ralat kerana ia menjangkakan jenis medan Key1 menjadi panjang. Sementara itu, objek {"Key1": 13, "Key2": "Value2"} akan diindeks tanpa masalah dan Key2 jenis rentetan akan ditambah ke peta.
peta adalah di luar skop artikel ini, dan dalam kebanyakan kes, pemetaan automatik berfungsi dengan baik. Saya cadangkan menyemak dokumentasi Elasticsearch, yang menyediakan perbincangan mendalam tentang pemetaan.
Bina enjin carian
Setelah data diindeks, kita boleh melaksanakan enjin carian. Elasticsearch menyediakan struktur pertanyaan carian teks penuh intuitif yang dipanggil pertanyaan dsl -Ia didasarkan pada JSON-untuk menentukan pertanyaan. Terdapat banyak jenis pertanyaan carian yang ada, tetapi dalam artikel ini kita akan melihat beberapa pertanyaan yang lebih umum. Dokumentasi lengkap untuk pertanyaan DSL boleh didapati di sini.
Ingat, saya telah menyediakan pautan kod untuk setiap contoh yang ditunjukkan di sini. Sebaik sahaja persekitaran disediakan dan data ujian diindeks, anda boleh mengklon repositori dan menjalankan sebarang contoh pada mesin anda. Untuk melakukan ini, hanya jalankan node filename.js dari baris arahan.
Kembalikan semua dokumen dalam satu atau lebih indeks
Untuk melakukan carian, kami akan menggunakan pelbagai kaedah carian yang disediakan oleh pelanggan. Pertanyaan yang paling mudah adalah Match_All, yang mengembalikan semua dokumen dalam satu atau lebih indeks. Contoh berikut menunjukkan bagaimana kami mendapatkan semua dokumen yang disimpan dalam indeks (pautan ke kod sumber).
<code>java -version</code>
pertanyaan carian utama terkandung dalam objek pertanyaan. Seperti yang akan kita lihat kemudian, kita boleh menambah pelbagai jenis pertanyaan carian ke objek ini. Untuk setiap pertanyaan, kami menambah kekunci yang mengandungi jenis pertanyaan (match_all dalam contoh ini) dengan nilai objek yang mengandungi pilihan carian. Tidak ada pilihan dalam contoh ini kerana kami ingin mengembalikan semua dokumen dalam indeks.
Di samping objek pertanyaan, badan carian juga boleh mengandungi sifat pilihan lain, termasuk saiz dan dari. Atribut saiz menentukan bilangan dokumen yang akan dimasukkan dalam respons. Jika nilai ini tidak wujud, sepuluh dokumen dikembalikan secara lalai. Dari harta benda menentukan indeks permulaan dokumen yang dikembalikan. Ini berguna untuk penomboran.
Memahami respons API carian
Jika anda merakam tindak balas API carian (hasil dalam contoh di atas), ia pada mulanya kelihatan rumit kerana ia mengandungi banyak maklumat.
<code>npm install elasticsearch --save</code>
Di peringkat tertinggi, tindak balas termasuk atribut mengambil yang mewakili bilangan milisaat yang diperlukan untuk mencari hasil, timed_out, yang benar hanya jika hasilnya tidak dijumpai dalam masa maksimum yang dibenarkan, _shards, yang digunakan Untuk memberikan maklumat nod yang relevan mengenai status (jika digunakan sebagai kluster nod), dan hits, yang mengandungi hasil carian.
Dalam harta hits, kami mempunyai objek dengan sifat -sifat berikut:
Ia sangat rumit, tetapi berita baiknya ialah apabila anda melaksanakan cara untuk mengekstrak hasilnya, anda akan sentiasa mendapat hasil dalam format yang sama tidak kira apa pertanyaan carian anda.
Juga ambil perhatian bahawa salah satu kelebihan Elasticsearch adalah bahawa ia secara automatik memberikan skor kepada setiap dokumen yang sepadan. Skor ini digunakan untuk mengukur kaitan dokumen, dan secara lalai, hasilnya dikembalikan mengikut skor penurunan. Dalam kes di mana kami menggunakan Match_All untuk mengambil semua dokumen, skor tidak masuk akal dan semua skor dikira sebagai 1.0.
Dokumen dengan nilai tertentu dalam medan Perlawanan
Sekarang, mari kita lihat beberapa contoh yang lebih menarik. Untuk memadankan dokumen yang mengandungi nilai tertentu dalam bidang, kita boleh menggunakan pertanyaan padanan. Berikut adalah badan carian mudah dengan pertanyaan padanan (pautan ke kod sumber).
<code>const elasticsearch = require('elasticsearch');</code>
Seperti yang saya nyatakan sebelum ini, kami mula -mula menambah entri ke objek pertanyaan yang mengandungi jenis carian, sepadan dengan contoh ini. Dalam objek jenis carian, kami mengenal pasti medan dokumen untuk mencari, berikut adalah tajuk. Di dalamnya, kami meletakkan data yang berkaitan dengan carian, termasuk atribut pertanyaan. Saya berharap bahawa selepas menguji contoh di atas, anda akan mula kagum dengan kelajuan carian.
Pertanyaan carian di atas mengembalikan dokumen yang medan tajuknya sepadan dengan mana -mana perkataan dalam atribut pertanyaan. Kami boleh menetapkan bilangan minimum perlawanan seperti yang ditunjukkan di bawah.
<code>java -version</code>
Pertanyaan ini sepadan dengan dokumen dengan sekurang -kurangnya tiga perkataan tertentu dalam tajuknya. Sekiranya terdapat kurang daripada tiga perkataan dalam pertanyaan, semua perkataan mesti muncul dalam tajuk untuk memadankan dokumen. Satu lagi ciri berguna yang ditambahkan untuk pertanyaan carian adalah kekaburan. Ini berguna jika pengguna memasuki ralat semasa menulis pertanyaan, kerana perlawanan kabur akan mencari terma dengan ejaan yang sama. Untuk rentetan, nilai kekaburan adalah berdasarkan jarak levinstein maksimum yang dibenarkan untuk setiap istilah. Berikut adalah contoh dengan kekaburan.
<code>npm install elasticsearch --save</code>
Cari dalam pelbagai bidang
Jika anda ingin mencari dalam pelbagai bidang, anda boleh menggunakan Multi_match untuk mencari jenis. Ia sama dengan perlawanan, kecuali bahawa bukannya menggunakan medan sebagai kunci dalam objek pertanyaan carian, kami menambah kunci medan, yang merupakan pelbagai bidang untuk dicari. Di sini kita mencari dalam tajuk, penulis.firstname dan penulis.lastname Fields. (Pautan ke kod sumber)
<code>const elasticsearch = require('elasticsearch');</code>
Pertanyaan multi_match menyokong sifat carian lain seperti minimum_should_match dan fuzziness. Elasticsearch menyokong kad liar (seperti *) untuk memadankan pelbagai bidang, jadi kita dapat memendekkan contoh di atas kepada ['tajuk', 'penulis. *Nama'].
Padankan frasa lengkap
Elasticsearch juga boleh memadankan frasa yang dimasukkan tepat tanpa sepadan pada tahap jangka masa. Pertanyaan ini adalah lanjutan pertanyaan perlawanan biasa yang dipanggil Match_phrase. Berikut adalah contoh Match_phrase. (Pautan ke kod sumber)
<code>const esClient = new elasticsearch.Client({ host: '127.0.0.1:9200', log: 'error' });</code>
Menggabungkan pelbagai pertanyaan
Setakat ini, dalam contoh, kami hanya menggunakan satu pertanyaan setiap permintaan. Walau bagaimanapun, Elasticsearch membolehkan anda menggabungkan pelbagai pertanyaan. Pertanyaan komposit yang paling biasa adalah bool. Pertanyaan bool menerima empat jenis kunci: mesti, harus, must_not, dan penapis. Seperti namanya, dokumen -dokumen dalam hasilnya mesti sepadan dengan pertanyaan dalam mesti, tidak dapat memadankan pertanyaan dalam must_not, jika mereka sepadan dengan pertanyaan harus, anda akan mendapat skor yang lebih tinggi. Setiap elemen di atas boleh menerima pelbagai pertanyaan dalam bentuk array pertanyaan. Di bawah, kami menggunakan pertanyaan bool dengan jenis pertanyaan baru query_string. Ini membolehkan anda menulis lebih banyak pertanyaan canggih menggunakan kata kunci seperti dan dan atau. Dokumentasi lengkap sintaks query_string boleh didapati di sini. Di samping itu, kami menggunakan pertanyaan skop (didokumenkan di sini), yang membolehkan kami mengehadkan medan ke julat tertentu. (Pautan ke kod sumber)
Dalam contoh di atas, pertanyaan mengembalikan nama pengarang yang mengandungi term1
atau<code>git clone https://github.com:sitepoint-editors/node-elasticsearch-tutorial.git cd node-elasticsearch-tutorial npm install</code>
dan tajuk mereka mengandungi term3, dan mereka tidak pada tahun 2011 , 2012 atau dokumen yang diterbitkan pada tahun 2013. Di samping itu, dokumen yang mengandungi frasa yang diberikan dalam badan mereka akan mendapat skor yang lebih tinggi dan akan dipaparkan di bahagian atas hasil (kerana pertanyaan perlawanan berada dalam klausa harus). penapis, agregasi dan cadangan
Di samping keupayaan carian lanjutannya, Elasticsearch menawarkan ciri -ciri tambahan. Di sini, kita melihat tiga ciri yang lebih biasa.
penapis
Biasanya, anda mungkin ingin memperbaiki hasil carian anda berdasarkan kriteria tertentu. Elasticsearch menyediakan fungsi ini melalui penapis. Dalam data artikel kami, katakan carian anda mengembalikan beberapa artikel dari mana anda ingin memilih hanya yang diterbitkan dalam lima tahun tertentu. Anda hanya boleh menyaring apa -apa yang tidak sepadan dengan kriteria anda dari hasil carian anda tanpa mengubah urutan carian.
Perbezaan antara penapis dan pertanyaan yang sama dalam klausa mesti pertanyaan bool ialah penapis tidak menjejaskan skor carian, dan pertanyaan mesti akan memberi kesan. Apabila hasil carian dikembalikan dan penapis pengguna berdasarkan kriteria tertentu, mereka tidak mahu menukar urutan hasil asal, tetapi hanya mahu memadam dokumen yang tidak relevan dari hasilnya. Penapis mengikuti format yang sama seperti carian, tetapi lebih kerap, ia ditakrifkan pada medan dengan nilai pasti dan bukannya rentetan teks. Elasticsearch mengesyorkan menambah penapis melalui klausa penapis pertanyaan carian komposit bool.Teruskan dengan contoh di atas, katakan kami ingin mengehadkan hasil carian kami kepada artikel yang diterbitkan dari tahun 2011 hingga 2015. Untuk melakukan ini, kita hanya perlu menambah pertanyaan pelbagai ke bahagian penapis pertanyaan carian asal. Ini akan menghapuskan sebarang dokumen yang tidak sesuai dari hasilnya. Berikut adalah contoh penapisan pertanyaan. (Pautan ke kod sumber)
<code>java -version</code>
pempolimeran
Rangka kerja agregasi menyediakan pelbagai data dan statistik agregat berdasarkan pertanyaan carian. Kedua -dua jenis agregasi utama adalah metrik dan pengelompokan, di mana pengagregatan metrik dan mengira metrik pada satu set dokumen, sementara pengagregatan dikumpulkan membina baldi, masing -masing dikaitkan dengan kunci dan keadaan dokumen. Contoh agregasi metrik termasuk kiraan min, minimum, maksimum, jumlah dan nilai. Contoh pengagregatan yang dikumpulkan termasuk julat, julat tarikh, histogram, dan terminologi. Penjelasan yang mendalam tentang agregator boleh didapati di sini.Agregasi diletakkan di dalam objek agregat, yang sendiri diletakkan secara langsung di dalam badan objek carian. Dalam objek agregat, setiap kunci adalah nama yang diberikan oleh pengguna kepada agregator. Jenis dan pilihan agregator harus diletakkan sebagai nilai kunci itu. Seterusnya, kita melihat dua agregator yang berbeza, agregator metrik dan agregator baldi. Sebagai agregator metrik, kami cuba mencari nilai tahun minimum (jawatan tertua) dalam dataset, dan untuk agregator baldi, kami cuba mencari bilangan kejadian setiap kata kunci. (Pautan ke kod sumber)
<code>npm install elasticsearch --save</code>
<code>const elasticsearch = require('elasticsearch');</code>
Cadangan
Elasticsearch mempunyai pelbagai jenis cadangan yang dapat memberikan cadangan penggantian atau penyelesaian untuk istilah input (didokumenkan di sini). Kami akan menyemak cadangan istilah dan frasa di sini. Istilah Suggester memberikan nasihat untuk setiap istilah dalam teks input (jika ada), manakala frasa Suggester merawat teks input sebagai frasa lengkap (bukannya memecahkannya ke dalam istilah) dan memberikan cadangan frasa lain (jika ada). Untuk menggunakan API Cadangan, kita perlu memanggil kaedah cadangan pada klien Node.js. Berikut adalah contoh suggester istilah. (Pautan ke kod sumber)
<code>java -version</code>
Dalam badan permintaan, selaras dengan semua kaedah klien lain, kami mempunyai medan indeks yang menentukan indeks carian. Di dalam harta badan, kami menambah teks yang kami cari cadangan, dan (seperti objek agregat), kami memberikan nama kepada setiap suggester (dalam kes ini TitleSuggester). Nilainya menentukan jenis dan pilihan cadangan. Dalam kes ini, kami menggunakan suggester istilah untuk medan tajuk dan mengehadkan bilangan maksimum cadangan setiap tag kepada lima (saiz: 5).
Sambutan API cadangan mengandungi kunci untuk setiap cadangan yang anda minta, yang merupakan pelbagai saiz yang sama dengan bilangan istilah dalam medan teks. Untuk setiap objek dalam array ini, terdapat objek pilihan yang medan teksnya mengandungi cadangan. Berikut adalah tindak balas separa terhadap permintaan di atas.
<code>npm install elasticsearch --save</code>
<code>const elasticsearch = require('elasticsearch');</code>
bacaan selanjutnya
Elasticsearch menyediakan pelbagai ciri, jauh di luar skop artikel ini. Dalam artikel ini, saya cuba menerangkan fungsinya pada tahap yang tinggi dan merujuk kepada sumber yang sesuai untuk pembelajaran selanjutnya. Elasticsearch sangat dipercayai dan mempunyai prestasi yang sangat baik (saya harap anda perasan ini apabila menjalankan contoh). Ini, ditambah pula dengan sokongan komuniti yang semakin meningkat, meningkatkan penggunaan elasticsearch dalam industri, terutama di kalangan syarikat yang memproses data masa nyata atau data besar.Setelah membaca dengan teliti contoh -contoh yang disediakan di sini, saya sangat mengesyorkan agar anda menyemak dokumentasi. Mereka menyediakan dua sumber utama, satu adalah rujukan kepada Elasticsearch dan ciri -cirinya, dan yang lain adalah panduan yang memberi tumpuan lebih kepada pelaksanaan, kes penggunaan dan amalan terbaik. Anda juga boleh mencari dokumentasi terperinci untuk pelanggan Node.js di sini.
Adakah anda sudah menggunakan Elasticsearch? Apa pengalaman anda? Atau adakah anda merancang untuk mencubanya setelah membaca ini? Tolong beritahu saya dalam komen di bawah.
Apakah perbezaan antara Elasticsearch dan enjin carian lain (seperti ElasticLunr atau Minisearch)?
Elasticsearch adalah enjin carian dan analisis sumber yang kuat, diedarkan dan terbuka. Ia direka untuk memproses sejumlah besar data dan memberikan hasil carian masa nyata. Sebaliknya, ElasticLunr dan Minisearch adalah perpustakaan carian pelanggan ringan untuk JavaScript. Mereka direka untuk set data yang lebih kecil dan sering digunakan dalam aplikasi berasaskan pelayar. Walaupun Elasticsearch menawarkan ciri -ciri yang lebih canggih seperti carian yang diedarkan, analisis data, dan keupayaan pembelajaran mesin, ElasticLunr dan Minisearch lebih mudah digunakan untuk keupayaan carian asas. Bagaimana untuk melaksanakan elasticsearch dalam aplikasi Node.js? Melaksanakan Elasticsearch dalam aplikasi Node.js melibatkan beberapa langkah. Pertama, anda perlu memasang pakej Elasticsearch menggunakan NPM. Kemudian anda perlu membuat contoh klien Elasticsearch dan sambungkannya ke pelayan Elasticsearch anda. Selepas itu, anda boleh menggunakan kaedah klien untuk melakukan pelbagai tindakan, seperti dokumen pengindeksan, mencari data, dan menguruskan kluster Elasticsearch anda. Bolehkah saya membina enjin carian dalam penyemak imbas saya menggunakan Elasticsearch? Walaupun Elasticsearch kebanyakannya direka untuk aplikasi sisi pelayan, ia boleh digunakan dalam aplikasi berasaskan pelayar dengan bantuan pelayan Node.js. Pelayan boleh bertindak sebagai proksi antara penyemak imbas dan pelayan Elasticsearch, mengendalikan semua permintaan carian dan respons. Walau bagaimanapun, untuk kes penggunaan yang lebih mudah, perpustakaan carian pelanggan seperti ElasticLunr atau Minisearch mungkin menjadi pilihan yang lebih baik. Bagaimana Elasticsearch dibandingkan dengan pakej carian NPM yang lain? Elasticsearch adalah salah satu pakej carian yang paling popular di NPM, terima kasih kepada ciri -ciri dan skalabilitinya yang kuat. Ia menyediakan satu set API yang komprehensif untuk mengindeks, mencari dan menganalisis data. Walau bagaimanapun, ia lebih kompleks dan berintensifkan sumber daripada pakej carian NPM yang lain. Jika anda bekerja pada projek kecil, atau anda memerlukan fungsi carian mudah, pakej NPM lain seperti indeks carian atau js-search mungkin lebih sesuai. Bagaimana untuk membina enjin carian dalam pelayar yang mudah menggunakan JavaScript? Membina enjin carian dalam pelayar yang mudah menggunakan JavaScript termasuk membuat indeks data, melaksanakan fungsi carian dan memaparkan hasil carian. Anda boleh memudahkan proses ini menggunakan perpustakaan carian JavaScript seperti ElasticLunr atau Minisearch. Perpustakaan ini menyediakan API yang mudah digunakan untuk indeks dan data carian dan boleh digunakan secara langsung dalam penyemak imbas tanpa keperluan pelayan. Apakah kelebihan menggunakan Elasticsearch untuk mencari dalam aplikasi saya? Elasticsearch menyediakan banyak kelebihan untuk melaksanakan keupayaan carian dalam permohonan anda. Ia menyediakan hasil carian masa nyata, yang bermaksud bahawa apabila dokumen diindeks, ia menjadi dicari. Ia juga menyokong pertanyaan carian kompleks, yang membolehkan anda mencari data berdasarkan pelbagai kriteria. Di samping itu, Elasticsearch sangat berskala dan boleh mengendalikan sejumlah besar data tanpa menjejaskan prestasi. Bagaimana pengindeksan data mengendalikan elasticsearch? Elasticsearch menggunakan struktur data yang dipanggil pengindeksan inverted untuk pengindeksan data. Ini membolehkan ia dengan cepat mencari dokumen yang sepadan dengan pertanyaan carian. Apabila dokumen diindeks, Elasticsearch menganalisis kandungan dan mencipta senarai kata -kata yang unik, dan kemudian menyimpan kata -kata dalam indeks terbalik bersama dengan maklumat mengenai kedudukan mereka dalam dokumen. Bolehkah saya menggunakan Elasticsearch untuk analisis data? Ya, Elasticsearch bukan sahaja enjin carian, tetapi juga alat analisis data yang kuat. Ia menyokong pengagregatan, membolehkan anda mengagregat dan menganalisis data anda dalam pelbagai cara. Anda boleh menggunakan Elasticsearch untuk melaksanakan tugas analisis data yang kompleks seperti mengira min, jumlah atau kiraan, mencari nilai minimum atau maksimum, kumpulan kumpulan berdasarkan keadaan tertentu, dan banyak lagi. Adakah Elasticsearch sesuai untuk aplikasi data besar? Ya, Elasticsearch direka untuk mengendalikan aplikasi data besar. Ia adalah sistem yang diedarkan, yang bermaksud ia boleh skala secara mendatar dengan menambahkan lebih banyak nod ke kluster. Ini membolehkan ia memproses sejumlah besar data dan memberikan hasil carian yang cepat walaupun di bawah beban berat. Di samping itu, Elasticsearch menyokong sharding dan replikasi, yang terus meningkatkan skalabiliti dan kebolehpercayaannya. Bagaimana untuk mengoptimumkan prestasi aplikasi Elasticsearch? Terdapat beberapa cara untuk mengoptimumkan prestasi aplikasi Elasticsearch anda. Pertama, anda harus mengkonfigurasi kluster Elasticsearch dengan betul, termasuk bilangan nod, shard, dan replika. Kedua, anda harus mengoptimumkan proses pengindeksan dengan menggunakan pengindeksan batch, melumpuhkan penyegaran, dan menggunakan penganalisis yang betul. Akhirnya, anda harus mengoptimumkan pertanyaan carian anda dengan menggunakan penapis dan bukan pertanyaan sebanyak mungkin, mengelakkan agregasi berat, dan menggunakan API "Jelaskan" untuk memahami bagaimana pertanyaan dilaksanakan.
Atas ialah kandungan terperinci Bina enjin carian dengan node.js dan elasticsearch. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!