Apa itu Apache Solr? Dan mengapa anda mesti menggunakannya

Apache Solr adalah subproyek Apache Lucene, yang merupakan teknologi pengindeksan di sebalik teknologi carian dan indeks yang baru dibuat. Solr adalah mesin pencari di hati, tetapi lebih daripada itu. Ia adalah pangkalan data NoSQL dengan sokongan transaksi. Ia adalah pangkalan data dokumen yang menawarkan sokongan SQL dan melaksanakannya secara diedarkan.

Bunyi menarik? Sertailah saya untuk melihat dengan lebih dekat. (Pendedahan penuh: Saya bekerja untuk Lucidworks, yang menggunakan banyak penyumbang utama untuk projek Solr.)

Anda memerlukan mesin yang layak (atau hanya menggunakan contoh AWS) dengan ideal 8GB atau lebih RAM. Anda boleh mencari Solr di //lucene.apache.org/solr. Anda juga memerlukan Java Virtual Machine versi 8. Unzip / untar Solr ke dalam direktori, pastikan JAVA_HOME ditetapkan, dan binari java berada di jalan anda. Tukar ke direktori Solr ada dan taip bin/solr start -e cloud -noprompt. Ini memulakan kluster dua nod pada komputer riba anda dengan koleksi sampel yang disebut mula dimuat.

Permulaan biasa adalah bin/solr start -cdengan memulakan Solr dalam mod "cloud". Tetapi jika anda mahu menendang tayar, anda benar-benar mahu melihat pemasangan pelbagai nod walaupun pada komputer riba anda sendiri. Solr Cloud adalah cara anda ingin menjalankan pemasangan Solr moden. Sekiranya anda memulakan tanpa -canda akan bermula dalam mod warisan. Itu adalah perkara buruk.

Dokumen dan koleksi

Solr adalah pangkalan data berstruktur dokumen. Entiti seperti "Orang" terdiri daripada bidang seperti nama, alamat, dan e-mel. Dokumen tersebut disimpan dalam koleksi. Koleksi adalah analog yang paling hampir dengan jadual dalam pangkalan data hubungan. Namun, tidak seperti dalam pangkalan data relasional, "Orang" dapat sepenuhnya mengandung entitas, yang bermaksud jika seseorang mempunyai banyak alamat, alamat tersebut dapat disimpan dalam satu dokumen "Orang". Dalam pangkalan data hubungan anda memerlukan jadual alamat yang berasingan.

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"],

 "Telefon": ["202-456-1111", "202-456-1414"]

}

Pecah, replika, dan teras

Tidak seperti di kebanyakan pangkalan data perhubungan, data secara automatik dilipat dan direplikasi melalui Solr Cloud. Ini bermaksud bahawa semasa anda menulis dokumen ke koleksi yang dikonfigurasi dengan betul, dokumen tersebut diedarkan ke salah satu contoh Solr. Itu "memalukan." Ia dilakukan untuk meningkatkan prestasi membaca. Setiap dokumen juga ditiru atau disalin sekurang-kurangnya sekali (dapat dikonfigurasi) untuk kelebihan. Ini bermakna anda boleh kehilangan contoh Solr dan hanya mengalami penurunan prestasi di kluster anda, tetapi tidak ada kehilangan data.

Kluster adalah sekumpulan "node", yang merupakan contoh Java Virtual Machine (JVM) yang menjalankan Solr. Node boleh mengandungi beberapa "teras". Setiap inti adalah replika "pecahan" logik. Umumnya inti dikenali oleh koleksi, nombor pecahan, dan nombor replika yang digabungkan bersama sebagai rentetan.

Membuat koleksi

Walaupun terdapat antara muka HTTP seperti REST, anda hanya boleh menggunakan perintah bin/solr(atau bin/solr.cmd) untuk membuat dan mengawal koleksi. Mari gunakan topik yang tidak kontroversial dan cari set data awam. Dapatkan salinan data kos penjagaan kesihatan dari Data.gov. Untuk kesederhanaan, ambil sebagai CSV. Dengan andaian anda memulakan Solr seperti yang diarahkan, gunakan perintah ini untuk membuat koleksi yang disebut ipps:

bin / solr create_collection -d basic_configs -c ipps

Seterusnya mari memuatkan data ke dalam koleksi. Mula-mula kita perlu memperbaiki beberapa perkara dalam fail CSV. Keluarkan semua $watak. Juga, di baris atas nama bidang, ubah medan dari ruang ke garis bawah. Jadikan ia seperti ini:

DRG_Definisi, 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

Terdapat alat yang lebih hebat untuk ETL daripada yang terdapat di Solr (seperti alat yang dibina di dalam produk yang dijual oleh syarikat saya), tetapi secara keseluruhan ini bukan penyelesaian yang rumit!

Sebelum memuat data apa pun walaupun kita perlu membuat "skema" yang serupa dengan yang anda miliki dalam pangkalan data hubungan. Kita boleh melakukannya dengan curlperintah di Linux / Mac atau anda boleh menggunakan alat GUI seperti Postman.

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

 "Medan tambah": {

     "Name": "DRG_Definition",

     "Type": "text_general",

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Nama": "Penyedia_Id",

     "Type": "plong",

     "DocValues": benar,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Nama": "Nama Penyedia",

     "Type": "text_general",

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Name": "Penyedia_Street_Address",

     "Type": "string",

     "Diindeks": salah,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Nama": "Penyedia_Kota",

     "Type": "string",

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Name": "Provider_State",

     "Type": "string",

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Name": "Penyedia_Zip_Code",

     "Type": "string",

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Name": "Hospital_Referral_Region_Deskripsi",

     "Type": "text_general",

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Nama": "Jumlah_Pemberhentian",

     "Type": "pint",

     "DocValues": benar,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Nama": "Rata-rata_Caj Dilebihi",

     "Type": "pdouble",

     "DocValues": benar,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Nama": "Purata_Jumlah_Pembayaran",

     "Type": "pdouble",

     "DocValues": benar,

     "Diindeks": benar,

     "Disimpan": benar

  },

 "Medan tambah": {

     "Nama": "Purata_Perubahan_Pembayaran",

     "Type": "pdouble",

     "DocValues": benar,

     "Diindeks": benar,

     "Disimpan": benar

  }

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

Ini adalah nama bidang, jenis bidang, dan sama ada mengindeks dan menyimpan medan atau tidak. Anda boleh mengetahui lebih lanjut mengenai jenis data dan skema keseluruhan Solr dalam panduan rujukan.

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 mempunyai data ringkas yang anda cari berdasarkan kunci dan kebanyakan ditulis. Solr mempunyai banyak paip untuk melakukan perkara yang lebih besar untuk menjadi cekap untuk itu sebagai kedai nilai utama.

Solr adalah pilihan yang jelas jika carian anda sangat berpusatkan teks. Walau bagaimanapun, ada kes-kes lain yang tidak begitu jelas di mana ia mungkin merupakan pilihan yang baik seperti carian spasial pada semua orang yang telefon bimbit anda telah digodam untuk mengesan lokasi mereka. Saya hanya mengatakan bahawa anda, Tuan Putin, mungkin juga mahu memilih Solr.

Walau apa pun, ingatlah bahawa rakan tidak membiarkan rakan melakukan bla like '%stuff' pertanyaan SQL .