<<해당 인덱스의 템플릿 조정>>

  • settings 
"settings" : {
      "index" : {
        "analysis" : {
          "analyzer" : {
            "korean" : {
              "type" : "custom",
              "tokenizer" : "seunjeon_default_tokenizer"
            }
          },
          "tokenizer" : {
            "seunjeon_default_tokenizer" : {
              "type" : "seunjeon_tokenizer",
              "index_eojeol" : "false",
              "decompound" : "false"
            }
          }
        }
      }
    }

 

  • mapping 

분석하고 싶은 필드값에 추가

 "contents" : {
          "type" : "text",
          "analyzer" : "korean"
        }

 

 

<<결과>>

다음과 같이 "강아지"로 리퀘스트를 보내 줬을 때, "강아지가 귀여워" 가 검색된닷

GET sample4/_search
{
  "query": {
    "match": {
      "contents": "강아지"
    }
  }
}
          "contents" : "강아지는 귀여워",
          "mdate" : "2020-02-03T15:00:06.000Z",
          "blocked_type" : 0,
          "category" : null,
          "view_yn" : 0,
          "contents_type" : 3

 

<<참고>>

1. analyzer와 search analyzer는 서로 다른 분석기로 설정 가능

2. "match" 쿼리: inverted index에 저장되는 토큰에서 "분석"하여 찾아줌 - "강아지"로 "강아지는 귀여워" 못찾는다

3. "term" 쿼리: inverted index에 저장되어 있는 토큰에서 찾아줌

## logstash의 config 설정 파일

input { 
      jdbc{ 
           jdbc_driver_library => "/usr/share/java/mysql-connector-java-5.1.47/mysql-connector-java-5.1.47.jar" 
   
          jdbc_driver_class => "com.mysql.jdbc.Driver" 
   
          jdbc_connection_string => ###
   
          jdbc_user =>"admin" 
   
          jdbc_password => ###
   
          jdbc_paging_enabled => true 
           tracking_column => "contents_code" 
           use_column_value => true 
           tracking_column_type => "numeric" 
           schedule => "*/1 * * * *"  # 1분마다
   
   
          statement => "SELECT * FROM tbl_contents_master 
          WHERE mdate > (SELECT DATE_SUB(NOW(), INTERVAL 60 MINUTE))" 
      } 
  } 
  filter{ 
   
   fingerprint { 
          key => "1234ABCD" 
          method => "SHA256" 
          source => ["contents_code"] 
          target => "[@metadata][generated_id]" 
          concatenate_sources => true 
      } 
  } 
  output { 
      amazon_es { 
           hosts => ###
           region => "ap-northeast-2" 
           aws_access_key_id => ###
           aws_secret_access_key => ###
          index =>"new" 
          document_id => "%{[@metadata][generated_id]}" 
          doc_as_upsert => true 
          action => "update" 
   } 
   
      stdout{ 
          codec => rubydebug{} 
      } 
  }

 

1. logstash 1분마다 갱신되도록 : schedule => "*/1 * * * *"  # 1분마다

2. 현재시간과 비교해서 1분 전 안에 들어온 데이터를 전부 삽입

: "SELECT * FROM tbl_contents_master WHERE mdate > (SELECT DATE_SUB(NOW(), INTERVAL 60 MINUTE))" 

3. contents_code 를 기준으로 같은 코드면 덮어쓰게 함 : source => ["contents_code"] 

4. 새로운 데이터가 삽입되면 반영 : doc_as_upsert => true 

5. <update!!> output에 document_type => "_doc"

삽질하면서 느낀 점 나열.... 딱히 해결책은 아닌거같다ㅎ

 

1. Logstash의 ouput plugin에서 elastisearch 와 amazon_es 구분해야함

elasticsearch - 서버에 엘라스틱서치 설치해서 쓸 경우

amazon_es - 말그대로 아마존 엘라스틱서비스 사용하고 있는 경우 - optional 이라고 공식 문서에서 설명하지만...

access_key와 secret key 를 다 넣어주어야 함

- 그리고 저 둘 사이에 버전차이가 있는듯 했다,, amazon_es가 업데이트가 좀 늦어서 버전 6을 인스톨 하라는 사람들이 있어서 인스톨 해줬는데 

bin/logstash-plugin install --version 6.0.0 logstash-output-amazon_es  (버전 6으로 다시)

그런데 굳이 플러그인을 인스톨을 해야되는건가 여전히 의문이 듬.. 이게 그렇게 큰 효과가 있었는지는 모르겠다

 

2. logstash output에 인덱스를 지정해주지 않으면 자동으로 logstash 날짜별 인덱스가 생성됨

반대로 만들어놓지 않은 인덱스를 써주면 인덱스가 생성됨

 

3. 템플릿으로 엄청 고생

인덱스를 설정 안해주고(로그스태시 날짜별 자동 생성된 인덱스 사용) logstash 실행하면

[ERROR] 2020-01-30 13:53:26.307 [[main]-pipeline-manager] amazones - Failed to install template: [400]
 {"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"Root mapping definition has unsupported parameters:  
[_default_ : {dynamic_templates=[{message_field={path_match=message, mapping={norms=false, type=text},

 

템플릿을 저렇게 지정하라고 나오는데,, 그래서 친절하게 누군가 올려준 json 형식 템플릿을 가져다가 그대로 썼었다. 

>>> https://stackoverflow.com/questions/48682000/logstash-conf-error-amazon-es/48687996#48687996

 

Logstash conf error - amazon_es

I am trying to configure for the first time my logstash.conf file with an output to amazon_es. My whole logstash.conf file is here: input { jdbc { jdbc_connection_string => "jdbc:mysql://

stackoverflow.com

하지만 딱히 도움이 되지는 않앗다,,,ㅎㅅㅎ 

템플릿 에러도 계속 떴었고, 저 템플릿을 조금씩 수정하면 어쩌다 에러가 없어지기도 했는데, 인덱스 안에 그 어떤 값도 들어가잇지 않아서 그냥 계속 삽질했었음

 

4. 지금까지의 결론

여튼 logstash stdin input plugin을 통해서 amazon_es에 인덱스 생성하고 데이터 넣는 것을 성공함. 

인덱스는 새로 만들어 주었고, 템플릿은 기존에 있는것을 사용중. 그러니까 잘 들어간다

+ Recent posts