## 목차 ##



## 1. 인덱싱(색인)이란? ##

  • 검색을 할 수 있도록 솔라에 문서를 등록하는 것

    • 문서를 불러와 파싱(parsing)하고 저장한다.
  • 인덱싱은 문서 검색 속도를 매우 높일 수 있는 방법이다.

    • 검색 키워드를 key값으로 받아들여 인덱싱 된 문서를 돌려준다.
  • 인덱싱은 문서를 추가, 삭제, 생성하는 것이다.



## 2. 인덱싱 방법 ##

  • 솔라는 csv, xml, json 형식의 문서를 인덱싱 할 수 있다.

  • 인덱싱 방법

    • 솔라 웹 인터페이스(solr web interface)
    • 클라이언트 API(Java, Ruby, Python 등)
    • post 툴(명령어)



## 3. post를 통한 색인 ##

(1) CSV 포맷

아래는 students_list.csv 파일이다.

id,first_name,last_name,phone_no,location 
001,   Pruthvi,      Reddy,       9848022337,    Hyderabad 
002,   kasyap,       Sastry,      9848022338,    Vishakapatnam 
003,   Rajesh,       Khanna,      9848022339,    Delhi 
004,   Preethi,      Agarwal,     9848022330,    Pune 
005,   Trupthi,      Mohanty,     9848022336,    Bhubaneshwar 
006,   Archana,      Mishra,      9848022335,    Chennai

students_list의 데이터를 인덱싱 하기 위한 절차는 아래와 같다.



1. 코어 생성

bin/solr create -c students



2. post 커맨드로 색인

bin/post -c <코어이름> <색인파일 경로>
bin/post -c students -params "trim=true" ~/workspace/indexing_data/students_list.csv 

"trim=true" 파라미터를 넣어준 이유는 공백을 제거하기 위함이다. 이 파라미터가 없이 하니까 공백까지 문자열의 일부로 치부되더라..

그런데 위 파라미터를 넣어주어도 field name(id,first_name…등)은 공백제거가 안되길래 위의 csv 파일과 같이 공백을 아예 주지 않았다.

그리고 post툴 대신 리눅스 패키지인 curl도 많이 사용한다.

이제 색인 결과를 확인해보자. 솔라 웹 인터페이스 화면에서 결과를 확인할 수 있다.

indexing_result1



아래와 같이 찾고싶은 특정 필드값을 선택할 수도 있다.

indexing_result2

이제 인덱싱이 되었다. 이후 우리가 만든 프로그램에서 Solr API를 사용하면 인덱싱 결과를 사용해 검색 기능을 지원할 수 있다.

(2) XML 포맷

XML 포맷 파일을 인덱싱하는 방법이다.

<add> 
   <doc> 
      <field name = "id">001</field> 
      <field name = "first name">Rajiv</field> 
      <field name = "last name">Reddy</field> 
      <field name = "phone">9848022337</field> 
      <field name = "city">Hyderabad</field> 
   </doc>  
   <doc> 
      <field name = "id">002</field> 
      <field name = "first name">Siddarth</field> 
      <field name = "last name">Battacharya</field> 
      <field name = "phone">9848022338</field> 
      <field name = "city">Kolkata</field> 
   </doc>  
   <doc> 
      <field name = "id">003</field> 
      <field name = "first name">Rajesh</field> 
      <field name = "last name">Khanna</field> 
      <field name = "phone">9848022339</field> 
      <field name = "city">Delhi</field> 
   </doc>  
   <doc> 
      <field name = "id">004</field> 
      <field name = "first name">Preethi</field> 
      <field name = "last name">Agarwal</field> 
      <field name = "phone">9848022330</field> 
      <field name = "city">Pune</field> 
   </doc>  
   <doc> 
      <field name = "id">005</field> 
      <field name = "first name">Trupthi</field> 
      <field name = "last name">Mohanthy</field> 
      <field name = "phone">9848022336</field> 
      <field name = "city">Bhuwaeshwar</field> 
   </doc> 
   <doc> 
      <field name = "id">006</field> 
      <field name = "first name">Archana</field> 
      <field name = "last name">Mishra</field> 
      <field name = "phone">9848022335</field> 
      <field name = "city">Chennai</field> 
   </doc> 
</add>
  • add 태그

    • 색인에 문서를 추가하기 위한 루트 태그
  • doc 태그

    • 하나의 문서를 구분하기 위한 태그
  • field 태그

    • 필드는 키와 값을 가지고 있다.



색인하는 방법은 csv 포맷과 별반 다르지 않다. post툴이 파일의 확장자를 확인하고 알아서 파싱한다.

bin/post -c students -params "trim=true" ~/workspace/indexing_data/students_list.xml



## 4. Solr Client API를 통한 색인 ##

Solr Client API를 사용하면 프로그래밍 언어에서 직접 파일을 파싱하고 인덱싱을 할 수도 있다.

아래는 Solr에서 제공하는 Java 라이브러리를 사용해 색인을 하는 과정을 보여준다.

public class AddingDocument { 
   public static void main(String args[]) throws Exception { 

      //my_core 코어를 사용하는 솔라 클라이언트 생성 
      String urlString = "http://localhost:8983/Solr/my_core"; 
      SolrClient Solr = new HttpSolrClient.Builder(urlString).build();   

      //doc 객체 생성 
      SolrInputDocument doc = new SolrInputDocument(); 

      //doc객체에 필드 추가
      doc.addField("id", "003"); 
      doc.addField("name", "Rajaman"); 
      doc.addField("age","34"); 
      doc.addField("addr","vishakapatnam"); 

      //솔라에 doc 추가
      Solr.add(doc);         

      //commit
      Solr.commit(); 
      System.out.println("Documents added"); 
   } 
}

위 예시에서는 doc 하나만 색인했지만 파일을 읽어와서 매우 많은 doc을 색인할 수 있다.



## 5. 문서 내용 수정 ##

추가한 문서의 내용을 수정하고자 할 때는 아래의 문서 형식을 사용하면 된다.

<add>   
   <doc>     
      <field name = "id">001</field>     
      <field name = "first name" update = "set">Raj</field>     
      <field name = "last name" update = "add">Malhotra</field>     
      <field name = "phone" update = "add">9000000000</field>    
      <field name = "city" update = "add">Delhi</field>   
   </doc> 
</add>

문서 색인과 동일한 방법으로 post 툴을 사용해서 색인을 하면 되는데 다른점은 필드값에 update 혹은 add 속성을 사용하는 것이다.

  • update

    • 내용 변경
  • add

    • 기존 내용에 추가

이제 색인을 해보자

bin/post -c students -params "trim=true" ~/workspace/indexing_data/students_list_update.xml

솔라 웹 인터페이스에서 확인해보면 내용이 아래와 같이 수정된 것을 확인할 수 있다.

{
"id":"001", "first_name":["Raj"], 
"last_name":["Reddy", "Malhotra"], 
"phone_no":[9848022337],
 "location":["Hyderabad"],
 "phone":["9000000000"], 
 "city":["Delhi"], 
 "_version_":1662118804780482560
}



## 6. 문서 삭제 ##

위에서 색인한 문서 중 id값이 002, 003, 004, 005 인 문서를 삭제하고싶다면 아래와 같이 <delete\>태그로 둘러싼 후 삭제하고싶은 id를 추가해준 이후 post 명렁어를 통해 색인요청을 해주면 된다.

<delete>   
   <id>003</id>   
   <id>005</id>  
   <id>004</id>
   <id>002</id> 
</delete> 
bin/post -c students -params "trim=true" ~/workspace/indexing_data/students_list_delete.xml



솔라 웹 인터페이스 화면을 통해 모든 문서를 조회해보면 아래와 같이 문서가 삭제된 결과를 볼 수 있다.

doc_deleted



id가 아닌 특정 필드값을 통해 문서를 삭제하고 싶으면 아래의 예시와 같은 방식으로 <query\>태그로 감싼 후 post하면 된다.

<delete> 
   <query>city:Chennai</query> 
</delete>

+ Recent posts