Apache Solr 란 무엇입니까? 그리고 그것을 사용해야하는 이유

Apache Solr는 Apache Lucene의 하위 프로젝트로, 가장 최근에 생성 된 검색 및 색인 기술 뒤에있는 색인 기술입니다. Solr은 핵심 검색 엔진이지만 그 이상입니다. 트랜잭션을 지원하는 NoSQL 데이터베이스입니다. SQL 지원을 제공하고 분산 방식으로 실행하는 문서 데이터베이스입니다.

흥미로운가요? 자세히 살펴 보려면 저와 함께하십시오. (전체 공개 : 저는 Solr 프로젝트에 많은 주요 기여자들을 고용하는 Lucidworks에서 일합니다.)

이상적으로는 8GB 이상의 RAM을 갖춘 괜찮은 머신 (또는 AWS 인스턴스 사용)이 필요합니다. //lucene.apache.org/solr에서 Solr를 찾을 수 있습니다. 또한 Java Virtual Machine 버전 8이 필요합니다. Solr을 디렉토리에 압축 해제하고 압축 해제하고 JAVA_HOME이 설정되어 있는지, Java 바이너리가 경로에 있는지 확인합니다. Solr이있는 디렉토리로 변경하고을 입력하십시오 bin/solr start -e cloud -noprompt. 그러면 이미로드 된 gettingstarted라는 샘플 컬렉션을 사용하여 랩톱에서 2 노드 클러스터가 시작됩니다.

정상적인 시작은 bin/solr start -c"클라우드"모드에서 Solr을 시작하는 것 입니다. 그러나 타이어를 걷어차려면 자신의 랩톱에 있더라도 다중 노드 설치를보고 싶을 것입니다. Solr Cloud는 최신 Solr 설치를 실행하는 방법입니다. 없이 시작 -c하면 레거시 모드에서 시작됩니다. 그것은 나쁜 일입니다.

문서 및 컬렉션

Solr은 문서 구조화 된 데이터베이스입니다. "Person"과 같은 엔티티는 이름, 주소, 이메일과 같은 필드로 구성됩니다. 이러한 문서는 컬렉션에 저장됩니다. 컬렉션은 관계형 데이터베이스의 테이블과 가장 가까운 유사체입니다. 그러나 관계형 데이터베이스와 달리 "Person"은 엔티티를 완전히 포함 할 수 있습니다. 즉, 한 사람이 여러 주소를 가지고있는 경우 해당 주소를 하나의 "Person"문서에 저장할 수 있습니다. 관계형 데이터베이스에서는 별도의 주소 테이블이 필요합니다.

사람 {

 "Id": "1333425",

 “first_name”:“Francis”,

 “middle_name”:“J.”,

 “last_name”:“언더우드”,

 '주소': [ '1600 Pennsylvania Ave NW, Washington, DC 20500', '1609 Far St. NW, Washington, DC, 20036'],

 '전화': [ '202-456-1111', '202-456-1414']

}

샤드, 복제본 및 코어

대부분의 관계형 데이터베이스와 달리 데이터는 Solr Cloud를 통해 자동으로 분할되고 복제됩니다. 즉, 적절하게 구성된 컬렉션에 문서를 쓸 때 Solr 인스턴스 중 하나에 배포됩니다. 그것이“샤딩”입니다. 읽기 성능을 향상시키기 위해 수행됩니다. 각 문서는 중복성을 위해 최소한 한 번 (구성 가능) 복제 또는 복사됩니다. 즉, Solr 인스턴스가 손실되고 클러스터 전체에서 성능이 저하 될 수 있지만 데이터 손실은 없습니다.

클러스터는 Solr을 실행하는 JVM (Java Virtual Machine) 인스턴스 인 "노드"세트입니다. 노드에는 여러 "코어"가 포함될 수 있습니다. 각 코어는 논리적 "샤드"의 복제본입니다. 일반적으로 코어는 문자열로 함께 연결된 컬렉션, 샤드 번호 및 복제본 번호로 식별됩니다.

컬렉션 만들기

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

Solr에 내장 된 것 (예 : 우리 회사에서 판매하는 제품에 내장 된 것)보다 ETL을위한 더 강력한 도구가 있지만 전반적으로 이것은 복잡한 수정이 아니 었습니다!

데이터를로드하기 전에 관계형 데이터베이스에있는 것과 유사한 "스키마"를 만들어야합니다. curlLinux / Mac 에서 명령을 사용하거나 Postman과 같은 GUI 도구를 사용할 수 있습니다.

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

 "필드 추가": {

     “이름”:”DRG_Definition”,

     "유형": "텍스트 _ 일반",

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     "name": "Provider_Id",

     "유형": "plong",

     "docValues": true,

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     "이름": "공급자 _ 이름",

     "유형": "텍스트 _ 일반",

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     “name”:”Provider_Street_Address”,

     "유형": "문자열",

     "indexed": false,

     "저장": true

  },

 "필드 추가": {

     "이름": "공급자 _ 도시",

     "유형": "문자열",

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     "이름": "공급자 _ 상태",

     "유형": "문자열",

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     “name”:”Provider_Zip_Code”,

     "유형": "문자열",

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     “name”:”Hospital_Referral_Region_Description”,

     "유형": "텍스트 _ 일반",

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     “name”:”Total_Discharges”,

     "유형": "파인트",

     "docValues": true,

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     “name”:”Average_Covered_Charges”,

     "유형": "pdouble",

     "docValues": true,

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     “name”:”Average_Total_Payments”,

     "유형": "pdouble",

     "docValues": true,

     "indexed": true,

     "저장": true

  },

 "필드 추가": {

     “name”:”Average_Medicare_Payments”,

     "유형": "pdouble",

     "docValues": true,

     "indexed": true,

     "저장": true

  }

} '// 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' 쿼리를 수행하도록 허용하지 않는다는 점을 기억하십시오 .