Какво е Apache Solr? И защо трябва да го използвате

Apache Solr е подпроект на Apache Lucene, който е технологията за индексиране зад най-скоро създадената технология за търсене и индексиране. Solr е търсачка по сърце, но е много повече от това. Това е база данни NoSQL с поддръжка на транзакции. Това е база данни с документи, която предлага поддръжка на SQL и я изпълнява разпределено.

Звучи интересно? Присъединете се към мен за по-отблизо. (Пълно разкриване: Работя за Lucidworks, в която работят много от ключовите участници в проекта Solr.)

Нуждаете се от прилична машина (или просто използвайте AWS екземпляр) с идеално 8 GB или повече RAM. Можете да намерите Solr на //lucene.apache.org/solr. Също така се нуждаете от Java виртуална машина версия 8. Разархивирайте / разкопчайте Solr в директория, уверете се, че е зададен JAVA_HOME и че java двоичният файл е във вашия път. Променете в директорията Solr е и въведете bin/solr start -e cloud -noprompt. Това стартира клъстер от два възела на вашия лаптоп с пробна колекция, наречена Getstarted вече заредена.

Нормално стартиране би било просто bin/solr start -cда стартирате Solr в режим "облак". Но ако ще ритате гумите, наистина искате да видите инсталиране на множество възли, дори ако е на вашия собствен лаптоп. Solr Cloud е начинът, по който искате да стартирате модерна инсталация на Solr. Ако стартирате без -c, ще стартирате в стар режим. Това е лошо нещо.

Документи и колекции

Solr е документно структурирана база данни. Обекти като „Лице“ се състоят от полета като име, адрес и имейл. Тези документи се съхраняват в колекции. Колекциите са най-близкият аналог на таблиците в релационна база данни. Въпреки това, за разлика от релационната база данни, „Person“ може напълно да съдържа обекта, което означава, че ако човек има множество адреси, тези адреси могат да се съхраняват в един документ „Person“. В релационна база данни ще ви трябва отделна таблица с адреси.

Лице {

 "Id": "1333425",

 “First_name”: „Франсис”,

 “Средно_име”: “J.”,

 “Last_name”: „Underwood”,

 „Адрес“: [„1600 Pennsylvania Ave NW, Washington, DC 20500“, „1609 Far St. NW, Washington, DC, 20036“],

 „Телефон“: [„202-456-1111“, „202-456-1414“]

}

Парчета, реплики и ядра

За разлика от повечето релационни бази данни, данните автоматично се изострят и репликират чрез Solr Cloud. Това означава, че когато пишете документ в правилно конфигурирана колекция, той се разпространява в един от екземплярите на Solr. Това е „рязкост“. Прави се за подобряване на ефективността на четене. Всеки документ също се репликира или копира поне веднъж (конфигурируемо) за излишък. Това означава, че можете да загубите екземпляр на Solr и да страдате само от намалена производителност във вашия клъстер, но без загуба на данни.

Клъстерът е набор от „възли“, които са екземпляри на Java Virtual Machine (JVM), изпълняващи Solr. Възелът може да съдържа множество „ядра“. Всяко ядро ​​е копие на логически „парче“. Обикновено ядрата се идентифицират чрез колекцията, номера на парчето и номера на репликата, обединени заедно като низ.

Създаване на колекция

Въпреки че има подобни на REST HTTP интерфейси, можете просто да използвате командата bin/solr(или bin/solr.cmd), за да създавате и контролирате колекции. Нека използваме непротиворечива тема и да намерим публичен набор от данни. Вземете копие на данните за разходите за здравеопазване от Data.gov. За по-простота го вземете като CSV. Ако приемем, че сте започнали Solr според указанията, използвайте тази команда, за да създадете колекция, наречена ipps:

bin / solr create_collection -d basic_configs -c ipps

След това нека да заредим данни в колекцията. Първо трябва да поправим няколко неща в CSV файла. Премахнете всички $символи. Също така в горния ред на имената на полетата променете полетата от интервали на долни черти. Накарайте го да се чете така:

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

Има по-мощни инструменти за ETL от вградените в Solr (като този, вграден в продукта, който моята компания продава), но като цяло това не беше сложна корекция!

Преди да заредим каквито и да е данни, трябва да създадем „схема“, която е подобна на тази, която имате в релационна база данни. Можем да направим това с curlкомандата на Linux / Mac или можете да използвате GUI инструмент като Postman.

curl -X POST -H 'Тип съдържание: application / json' —data-binary '{

 “Add-field”: {

     “Name”: “DRG_Definition”,

     “Type”: “text_general”,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Provider_Id”,

     “Type”: “plong”,

     “DocValues”: вярно,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Provider_Name”,

     “Type”: “text_general”,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Provider_Street_Address”,

     “Type”: “низ”,

     „Индексирано“: невярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Provider_City”,

     “Type”: “низ”,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Provider_State”,

     “Type”: “низ”,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Provider_Zip_Code”,

     “Type”: “низ”,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Hospital_Referral_Region_Description”,

     “Type”: “text_general”,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Общо_разреждания”,

     “Type”: “пинта”,

     “DocValues”: вярно,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Средни_покрити_заряди”,

     “Type”: “pdouble”,

     “DocValues”: вярно,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Средни общи плащания”,

     “Type”: “pdouble”,

     “DocValues”: вярно,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  },

 “Add-field”: {

     “Name”: “Средни_медикаторни_плащания”,

     “Type”: “pdouble”,

     “DocValues”: вярно,

     „Индексирано“: вярно,

     „Съхранено“: вярно

  }

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

Това са имена на полета, типове полета и дали да се индексира и съхранява полето или не. Можете да научите повече за типовете данни на Solr и цялостната схема в справочното ръководство.

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 може да не е най-добрият ви избор, ако имате прости данни, които търсите по ключ и правите предимно за писане. Solr има твърде много водопроводи, за да прави по-големи неща, за да бъде толкова ефективен за това, колкото хранилището за ключ-стойност.

Solr е ясен избор, ако търсенето ви е много ориентирано към текста. Има обаче и други не толкова очевидни случаи, при които може да е добър избор, като за пространствено търсене на всички онези хора, чиито мобилни телефони сте хакнали, за да проследите местоположението им. Просто казвам, че вие, г-н Путин, може би искате да изберете и Solr.

Независимо от това, просто не забравяйте, че приятелите не позволяват на приятелите да правят SQL bla like '%stuff' заявки.