본문 바로가기
Elasticsearch

Elasticsearch + nori 한글 형태소 분석기로 데이터 검색하기 # 2

by reo.l 2021. 8. 30.

 

이전 글에서 nori 토크 나이저 설정 파일에 대한 설명을 하였다. 여기서는 이를 logstash conf 파일에 설정하고 elasticsearch에 output 한 데이터를 kibana를 통해 확인하고 django에서 직접 사용해 보겠다. 

 

먼저 /etc/conf.d 에 설정 파일을 만들어 준다. 현재 jdbc를 사용하여 rds와 연결된 상태인데 여기서 output 설정을 조금 바꾸어 주면 된다.

 

/etc/logstash/conf.d/partner.conf

input {
  jdbc {
    jdbc_driver_library => "/etc/logstash/postgresql-42.2.23.jar" 
    jdbc_driver_class => "org.postgresql.Driver"
    jdbc_connection_string => "jdbc:postgresql://rds.url"
    jdbc_user => "user"
    jdbc_password => "password"
    schedule => "*/2 * * * *" 
    statement => "select * from account_partner"
  }
}
output {
  elasticsearch { 
    hosts => ["127.0.0.1:9200"]
    index => "partner-1"
    template=>"/etc/logstash/partner_template.json"
    template_name=>"partner-1"
    template_overwrite=>true
    document_id=>"%{id}"
    ilm_enabled => false
   }
  # stdout { codec => rubydebug }

}

 

ouput에서는 전에 만든 template의 경로, template 명, 덮어쓰기 등의 설정을 해주면 된다. 설정을 완료하고 logstash를 실행하고 /var/log/logstash 에서 tail -f로 log 파일을 확인해보면 schedule에 따라 데이터를 업데이트해주는 것을 확인할 수 있다. kibana를 실행하고 index management를 확인해 보면 

 

 

 

데이터가 들어간 것을 확인할 수 있고 index에 들어가 settings와 mappings를 확인해 보면 

 

 

 

다음과 같이 잘 들어간 것을 확인할 수 있다. 이제 elasticsearch에서 데이터 검색 시 partner라는 모델의 history 등의 필드에서 한글 검색 시 원하는 데이터를 검색하여 받아 올 수 있게 된 것이다. 이제 django에 직접 적용하여 볼 것이다. 여기서는 elastcisearch package를 install 하고 localhost:9200에 연결하여 데이터를 받아올 것이다. 

 

pip install elasticsearch

 

drf의 viewset list함수를 오버라이드 하여 사용할 것이다. 

 

def list(self, request, *args, **kwargs):

  es = Elasticsearch("http://localhost:9200", timeout=100, max_retries=10, retry_on_timeout=True)

  partner = es.search(
      index='partner-1',
      body={
          'size':10000,
          "query": {
              "multi_match": {
                  "query": searchQ,
                  "fields": [
                      "name.english_field",
                      "name.korean_field",
                      "info_company.english_field",
                      "info_company.korean_field",
                      "history.english_field",
                      "history.korean_field",
                      "region.english_field",
                      "region.korean_field",
                  ]
              }
          }
      })

  print(partner) # query : searchQ에 원하는 검색키워드를 넣어주고 검색한다.

 

search  파라미터로 들어온 검색어 키워드를 searchQ 변수에 담아주고 elasticsearch에 접속하여 template에 설정한 english_field, korean_field를 설정하여주면 검색 키워드를 각 필드에서 검색하여 partner 변수에 데이터를 담아준다.

 

 

 

댓글