Apa itu Apache Solr? Dan mengapa Anda harus menggunakannya

Apache Solr adalah subproyek dari Apache Lucene, yang merupakan teknologi pengindeksan di balik teknologi pencarian dan indeks yang paling baru dibuat. Solr adalah mesin pencari di hati, tetapi lebih dari itu. Ini adalah database NoSQL dengan dukungan transaksional. Ini adalah database dokumen yang menawarkan dukungan SQL dan menjalankannya secara terdistribusi.

Terdengar menarik? Bergabunglah dengan saya untuk melihat lebih dekat. (Pengungkapan penuh: Saya bekerja untuk Lucidworks, yang mempekerjakan banyak kontributor utama proyek Solr.)

Anda membutuhkan mesin yang layak (atau cukup gunakan instans AWS) dengan idealnya RAM 8 GB atau lebih. Anda dapat menemukan Solr di //lucene.apache.org/solr. Anda juga memerlukan Java Virtual Machine versi 8. Unzip / untar Solr ke dalam direktori, pastikan JAVA_HOME disetel, dan biner java ada di jalur Anda. Ubah ke direktori Solr dan ketik bin/solr start -e cloud -noprompt. Ini memulai cluster dua node di laptop Anda dengan koleksi sampel yang disebut getstarted sudah dimuat.

Startup normal hanya akan menjalankan bin/solr start -cSolr dalam mode "cloud". Tetapi jika Anda akan menendang ban, Anda benar-benar ingin melihat pemasangan multi-node bahkan jika itu ada di laptop Anda sendiri. Solr Cloud adalah cara Anda ingin menjalankan penginstalan Solr modern. Jika Anda memulai tanpa -cAnda akan mulai dalam mode lama. Itu hal yang buruk.

Dokumen dan koleksi

Solr adalah database dokumen terstruktur. Entitas seperti "Orang" terdiri dari bidang seperti nama, alamat, dan email. Dokumen tersebut disimpan dalam koleksi. Koleksi adalah analog terdekat dengan tabel dalam database relasional. Namun, tidak seperti dalam database relasional, "Orang" dapat sepenuhnya berisi entitas, artinya jika seseorang memiliki beberapa alamat, alamat tersebut dapat disimpan dalam satu dokumen "Orang". Dalam database relasional, Anda memerlukan tabel alamat terpisah.

Orang {

 "Id": "1333425",

 “First_name”: “Francis”,

 “Middle_name”: “J.”,

 “Last_name”: “Underwood”,

 “Alamat”: [“1600 Pennsylvania Ave NW, Washington, DC 20500”, “1609 Far St. NW, Washington, DC, 20036”],

 “Telepon”: [“202-456-1111”, “202-456-1414”]

}

Pecahan, replika, dan inti

Tidak seperti di kebanyakan database relasional, data secara otomatis dipisahkan dan direplikasi melalui Solr Cloud. Ini berarti bahwa ketika Anda menulis dokumen ke koleksi yang dikonfigurasi dengan benar, dokumen itu didistribusikan ke salah satu contoh Solr. Itu adalah "sharding". Ini dilakukan untuk meningkatkan kinerja membaca. Setiap dokumen juga direplikasi atau disalin setidaknya sekali (dapat dikonfigurasi) untuk redundansi. Ini berarti Anda bisa kehilangan instans Solr dan hanya mengalami penurunan kinerja di seluruh klaster Anda, tetapi tidak ada kehilangan data.

Cluster adalah sekumpulan "node", yang merupakan instance Java Virtual Machine (JVM) yang menjalankan Solr. Node dapat berisi beberapa "inti". Setiap inti adalah replika dari "pecahan" yang logis. Umumnya inti diidentifikasi oleh koleksi, nomor pecahan, dan nomor replika yang digabungkan bersama sebagai string.

Membuat koleksi

Meskipun ada antarmuka HTTP seperti REST, Anda dapat menggunakan perintah bin/solr(atau bin/solr.cmd) untuk membuat dan mengontrol koleksi. Mari gunakan topik yang tidak kontroversial dan temukan kumpulan data publik. Dapatkan salinan data biaya perawatan kesehatan dari Data.gov. Demi kesederhanaan, ambil itu sebagai CSV. Dengan asumsi Anda memulai Solr seperti yang diarahkan, gunakan perintah ini untuk membuat koleksi bernama ipps:

bin / solr create_collection -d basic_configs -c ipps

Selanjutnya, mari muat data ke dalam koleksi. Pertama kita perlu memperbaiki beberapa hal di file CSV. Hapus semua $karakter. Selain itu, di baris atas nama bidang, ubah bidang dari spasi menjadi garis bawah. Buatlah menjadi seperti ini:

DRG_Definition, Provider_Id, Provider_Name, Provider_Street_Address, Provider_City, Provider_State, Provider_Zip_Code, Hospital_Referral_Region_Description, Total_Discharges, Average_Covered_Charges, Average_Total_Payments, Average_Medicare_Payments

Ada alat yang lebih kuat untuk ETL daripada yang ada di dalam Solr (seperti yang ada di dalam produk yang dijual perusahaan saya), tetapi secara keseluruhan ini bukanlah perbaikan yang rumit!

Sebelum kita memuat data apa pun, kita perlu membuat "skema" yang mirip dengan apa yang Anda miliki dalam database relasional. Kami dapat melakukannya dengan curlperintah di Linux / Mac atau Anda dapat menggunakan alat GUI seperti Postman.

curl -X POST -H 'Content-type: application / json' —data-binary '{

 "Add-field": {

     “Name”: ”DRG_Definition”,

     “Type”: ”text_general”,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Provider_Id”,

     “Type”: ”plong”,

     “DocValues”: benar,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Provider_Name”,

     “Type”: ”text_general”,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Provider_Street_Address”,

     "Type": "string",

     "Diindeks": salah,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Provider_City”,

     "Type": "string",

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Provider_State”,

     "Type": "string",

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Provider_Zip_Code”,

     "Type": "string",

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Hospital_Referral_Region_Description”,

     “Type”: ”text_general”,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Nama”: ”Total_Discharges”,

     “Type”: ”pint”,

     “DocValues”: benar,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Average_Covered_Charges”,

     “Type”: ”pdouble”,

     “DocValues”: benar,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Average_Total_Payments”,

     “Type”: ”pdouble”,

     “DocValues”: benar,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Add-field": {

     “Name”: ”Average_Medicare_Payments”,

     “Type”: ”pdouble”,

     “DocValues”: benar,

     "Diindeks": benar,

     "Disimpan": benar

  }

} '// localhost: 8983 / solr / ipps / schema

Ini adalah nama bidang, tipe bidang, dan apakah akan mengindeks dan menyimpan bidang atau tidak. Anda dapat mengetahui lebih lanjut tentang tipe data Solr dan skema keseluruhan dalam panduan referensi.

Now that we’ve got a schema we can “post” the data into Solr. There are many routes to do this. You could use curl or Postman, but Solr includes a command line tool, bin/post, which will be available out of the box on Linux and MacOS.

bin/post -c ipps -params "rowid=id" -type "text/csv" /home/acoliver/Downloads/Inpatient_Prospective_Payment_System__IPPS__Provider_Summary_for_the_Top_100_Diagnosis-Related_Groups__DRG__-_FY2011.csv

On Windows:

java -Dtype=text/csv -Dc=ipps -Dparams="rowid=id" -jar example\exampledocs\post.jar \Users\acoliver\Downloads\Inpatient_Prospective_Payment_System__IPPS__Provider_Summary_for_the_Top_100_Diagnosis-Related_Groups__DRG__-_FY2011.csv

W00t you have data!

Querying your data

There are language bindings for Solr that you can use for Java or Python, or if you’re more of a power developer you can use the one for PHP. Or you could just use curl or Postman or your browser.

Paste this into an address bar:

//localhost:8983/solr/ipps/select?indent=on&q=*:*&wt=json

This URL is a simple query that returns the 10 most relevant results. You can change the pagination and find out more about Solr’s Solr’s query language and even alternative query parsers in the reference guide. If you want to see the same thing in XML you can configure that.

Maybe you want to do something a bit more advanced. Below finds procedures in the town I live in:

//localhost:8983/solr/ipps/select?indent=on&q=Provider_State:NC%20AND%20Hospital_Referral_Region_Description:%22*Durham%22&wt=json

You can go much further and do more summaries and calculations and fuzzy matches.

Solr administration

Some of you are like “Good gosh, the command line scares me!” So that’s fine, Solr has a GUI. Got to //localhost:8983/solr and see this beauty:

If you select your collection on the side, you can even go to a screen that will let you fill in query parameters:

If that screen gives you a headache, you can just go to //localhost:8983/solr/ipps/browse.

We’ve done simple text queries. You can also do ranges and spatial searches. If the “relevance” sorting isn’t working for you, you can do more advanced expressions and have Solr return things “as they are found” much like an RDBMS does it. You can sort on various fields and filter by categories. You can even have it “learn to rank”—a machine learning capability that lets Solr “learn” what users think is the most relevant result. We’ve really only scratched the surface.

Why Solr?

So clearly you might choose to use Solr if you need a search engine. However, it is also a redundant, distributed document database that offers SQL (out of the box) for those who want to connect tools like Tableau. It is extensible in Java (and other JVM languages), and yet with the REST-like interface you can easily speak JSON or XML to it.

Solr mungkin bukan pilihan terbaik Anda jika Anda memiliki data sederhana yang Anda cari berdasarkan kunci dan kebanyakan menulis. Solr memiliki terlalu banyak pipa ledeng untuk melakukan hal-hal yang lebih besar agar seefisien sebagai penyimpanan nilai kunci.

Solr adalah pilihan yang jelas jika pencarian Anda sangat teks-sentris. Namun, ada kasus lain yang tidak terlalu jelas di mana itu mungkin merupakan pilihan yang baik seperti untuk pencarian spasial pada semua orang yang ponselnya telah Anda hack untuk melacak lokasi mereka. Saya hanya mengatakan bahwa Anda, Tuan Putin, mungkin ingin memilih Solr juga.

Terlepas dari itu, ingatlah bahwa teman tidak mengizinkan teman melakukan bla like '%stuff' kueri SQL .