logstash 9600 포트 죽이기




cmd 명령어  for /f "tokens=5" %p in (' netstat -ano ^| find ":9600" ') do taskkill /F /PID %p


>> cmd 에서는 잘 되나 bat 파일로 만들었을때 그냥 꺼지는 오류 발생, 아래와 같이 bat 파일 생성함


for /f "tokens=5" %%p in ('netstat -ano ^| find "9600"') do taskkill /F /PID %%p


참조 : http://c.tistory.com/243



PUT /cine21

{

  "settings": {

    "analysis": {

      "analyzer": {

        "korean_analyzer" : {

          "type" : "custom",

          "tokenizer": "korean_tokenizer",

          "filter" : ["stop", "lowercase", "trim", "synonym"]

        },

        "ngram_analyzer" : {

            "type" : "custom",

            "tokenizer" : "ngram_tokenizer",

            "filter" : ["lowercase", "trim","synonym"]

        },

        "edge_ngram_analyzer" : {

            "type" : "custom",

            "tokenizer" : "edge_ngram_tokenizer",

            "filter" : ["lowercase", "trim","synonym"]

        }

      },

      "tokenizer": {

        "korean_tokenizer": {

          "type": "mecab_ko_standard_tokenizer",

          "compound_noun_min_length": 100

        },

        "ngram_tokenizer" : {

            "type" : "nGram",

            "min_gram" : "1",

            "max_gram" : "5",

            "token_chars": [ "letter", "digit", "punctuation", "symbol" ]

        },

        "edge_ngram_tokenizer" : {

            "type" : "edgeNGram",

            "min_gram" : "1",

            "max_gram" : "5",

            "token_chars": [ "letter", "digit", "punctuation", "symbol" ]

        }        

      },

      "filter": {

        "synonym" : {

            "type" : "synonym",

            "synonyms" : [

                "탐, 톰",

                "플래이어, 플레이어"

            ]

        }

      }

    }

  }, 

  "mappings": {

    "movie" : {

      "analyzer" : "korean_analyzer",

      "index_analyzer" : "edge_ngram_analyzer",

      "search_analyzer" : "edge_ngram_analyzer",

      "properties": {

        "title" : {

          "type": "string", 

          "fields" : {

            "h_pf" : {"type" : "string", "store" : "no", "index" : "not_analyzed", "omit_norms" : true, "index_options" : "offsets", "term_vector" : "with_positions_offsets", "include_in_all" : false, "boost": 20},

            "h_ko" : {"type" : "string", "index_analyzer" : "korean_analyzer", "boost": 3},

            "h_ng" : {"type" : "string", "index_analyzer" : "ngram_analyzer", "boost": 1},

            "h_ed" : {"type" : "string", "index_analyzer" : "edge_ngram_analyzer", "boost": 2}

          }

        }

      }

    }

  }

}





GET /cine21/_search





GET /cine21/_search

{

  "query": {

    "bool": {

      "should": [

        {"prefix": {

          "title.h_pf": "창"

        }},{"term": {

          "title.h_ko": "창"

        }},{"term": {

          "title.h_ed": "창"

        }},{"term": {

          "title.h_ng": "창"

        }}

      ],

      "minimum_should_match": 1

    }

  }

}



출처: http://c.tistory.com/243 [coens TISTORY]

출처: http://c.tistory.com/243 [coens TISTORY]

출처: http://c.tistory.com/243 [coens TISTORY]

curl -XPOST localhost:9200/_bulk --data-binary @6_1_hotels.json


개발 환경 : .NETFramework version = v3.5

운영 체제 : 윈도우7



1. mecab-ko-dic 설치

참조 : https://groups.google.com/forum/#!topic/eunjeon/Dzohqj4n3QI



2. mecab-java-msvc설치


2-1. 환경 변수 설정

path 에 C:\mecab; 추가


3. 빌드 

 >> javac C:\mecab\org\chasen\mecab\*.java

  >> 테스트 : mecab.exe -o output.txt input.txt 

4. Elasticsearch plugin 설치

>> elasticsearch-plugin  install https://bitbucket.org/eunjeon/mecab-ko-lucene-analyzer/issues/attachments/9/eunjeon/mecab-ko-lucene-analyzer/1500357175.91/9/elasticsearch-analysis-mecab-ko-5.5.0.0.zip



4-1 오류1 


위와 같은 오류 발생 시 https://bitbucket.org/eunjeon/mecab-ko-lucene-analyzer/issues/attachments/9/eunjeon/mecab-ko-lucene-analyzer/1500357175.91/9/elasticsearch-analysis-mecab-ko-5.5.0.0.zip

zip 파일을 다운 받아 압축 해제 후  plugin-descriptor.properties 파일을 수정한다.

1) version = 5.6.0.0 으로 수정


2) elasticsearch.version = 5.6.0 으로 수정




3) 수정 후 다시 압축 하여 파일을 install 하준다

4-2 오류 2

4-1 수정 후 재시도 하였으나 아래와 같은 오류가 발생.



설치가 완료된 1대의 pc 에서 mecab 파일을 복사 후 재 설치 한 부분으로 
mecab.exe -o output.txt input.txt  명령어를 다시한번 처리 후 

4번 시도 시 정상적으로 처리 되었다. (정확한 부분인지는 모르겠음)


4-3. 성공





5. Elasticsearch 인덱스 적용
키바나에서 아래와 같이 인덱스를 등록한다.

PUT /eunjeon
{
        "settings": {
            "index": {
            "analysis": {
                "analyzer": {
                "korean_index": {
                    "type": "custom",
                    "tokenizer": "mecab_ko_standard_tokenizer"
                },
                "korean_query": {
                    "type": "custom",
                    "tokenizer": "korean_query_tokenizer"
                }
                },
                "tokenizer": {
                "mecab_ko_standard_tokenizer": {
                    "type": "mecab_ko_standard_tokenizer",
                    "mecab_args": "-d C:/mecab/mecab-ko-dic"
                },
                "korean_query_tokenizer": {
                    "type": "mecab_ko_standard_tokenizer",
                    "compound_noun_min_length": 100,
                    "mecab_args": "-d C:/mecab/mecab-ko-dic"
                }
                }
            }
            }
        }
    }

5-1 오류 1
아래와 같이 오류 발생 시 elasticsearch 를 재시작 한다.


5-2 성공 메시지가 나오면 아래와 같이 검색 한다
GET /eunjeon/_analyze/?analyzer=korean_query
{
 "text" : "유관순선생님"
}

>>> 유관순, 선생, 님  으로  
tokenizing 되는 부분 확인 




6. 원하는 index 의 document 에 형태소 분석기를 적용하고 싶을때.

 PUT /log/
{
        "settings": {
            "index": {
            "analysis": {
                "analyzer": {
                "korean_index": {
                    "type": "custom",
                    "tokenizer": "mecab_ko_standard_tokenizer"
                },
                "korean_query": {
                    "type": "custom",
                    "tokenizer": "korean_query_tokenizer"
                }
                },
                "tokenizer": {
                "mecab_ko_standard_tokenizer": {
                    "type": "mecab_ko_standard_tokenizer",
                    "mecab_args": "-d C:/mecab/mecab-ko-dic"
                },
                "korean_query_tokenizer": {
                    "type": "mecab_ko_standard_tokenizer",
                    "compound_noun_min_length": 100,
                    "mecab_args": "-d C:/mecab/mecab-ko-dic"
                }
                }
            }
            }
        },  "mappings" : {    
        "logs" : {  ----type
            "properties" : {        
                   "title": {"type": "text", "analyzer": "korean_query"}, ......                -----document
                  
            }    
        }  
    }
    }
    






'검색엔진' 카테고리의 다른 글

자동완성 기능 설정  (0) 2017.12.13
벌크로 제이슨 파일 넣기  (0) 2017.12.02
mecab 설치  (0) 2017.10.23
10.[Elasticsearch]/[ELK]. SCORE 검색 점수  (0) 2017.10.20
9.[Elasticsearch]/[ELK]. QUERY 와 FILTER 차이  (1) 2017.10.20

mecab.exe -o output.txt input.txt 


elasticsearch-plugin  install https://bitbucket.org/eunjeon/mecab-ko-lucene-analyzer/issues/attachments/9/eunjeon/mecab-ko-lucene-analyzer/1500357175.91/9/elasticsearch-analysis-mecab-ko-5.5.0.0.zip


3.번 필요 없구 플러그인 설치 안됬던 문제는 HOST 접근이 안되어 발생한 문제였따


http://test-mid.milkt.co.kr/mecab-ko-5.5.0.0.zip



출처 http://www.popit.kr/bm25-elasticsearch-5-0%EC%97%90%EC%84%9C-%EA%B2%80%EC%83%89%ED%95%98%EB%8A%94-%EC%83%88%EB%A1%9C%EC%9A%B4-%EB%B0%A9%EB%B2%95/


색 점수

검색이란 사용자가 입력한 검색 쿼리(query)에 대해 관련있는 문서를 매칭한 후, 관련성에 따라 정렬하는 과정이다. 관련성(relevance)은 주어진 쿼리와 매칭되는 문서를 관련된 정도에 따라 수치화 한 값으로, 검색 점수(score)라고 부른다. 또한 쿼리는 “최순실“, “통일교“와 같이 한단어 일수도 있지만, “최순실 게이트“과 같이 여러 단어일수도 있다. 이 경우 “최순실”, “게이트”에 대한 각 단어의 검색 점수를 합해야 하며, 이러한 각 단어를 텀(term)이라고 부른다.

bm25_document_score

그림. 쿼리에 대한 문서의 검색 점수 계산

우리가 익히 알고 있는 TF/IDF 알고리즘은 이러한 검색 점수를 계산하기 위한 가장 일반적인 방법이다.

 

TF/IDF

루씬의 TF/IDF 알고리즘은 아래와 같다.

bm25_lucene_tf_idf_algorithm

그림. 루씬 TF/IDF 수식(출처: Real-time Analytics & Anomaly detection using Hadoop, Elasticsearch and Storm)

수식은 복잡하지만 그 의미는 직관적이다.

TF(Term Frequency): 단어 빈도

텀(term)이 문서에 등장하는 횟수로, 많이 등장할수록 문서의 검색 점수는 당연히 높아진다.

bm25_tfidf_tf

그림. TF가 높아질수록 점수가 높아진다(출처: Elasticsearch, Improved Text Scoring with BM25)

IDF(Inverse Document Frequency): 문서 역빈도

문서 빈도(DF: Document Frequency)는 텀(term)이 등장하는 문서 개수로, 여러 문서에 등장할수록 문서의 검색 점수가 낮아진다. IDF는 1/DF다.

bm25_tfidf_idf

그림. DF가 높아질수록 점수가 낮아진다(출처: Elasticsearch, Improved Text Scoring with BM25)

 

the”, “a”, “is”와 같이 문장에서 거의 항상 등장하는 텀(term)은 검색 결과에 영향을 미치지 않게 하기 위한 것으로, 이러한 단어들은 불용어(stop word)라고 부른다.

norm: 문서 길이 가중치

텀(term)이 등장하는 문서의 길이에 대한 가중치로, 문서 길이가 길수록 검색 점수가 낮아진다.

bm25_tfidf_norm

그림. 문서 길이가 길수록 점수가 낮아진다(출처: Elasticsearch, Improved Text Scoring with BM25)

“철수의 취미는 축구다”와 “영희의 취미는 축구와 야구다”와 같은 문장이 있을 때 “축구”로 검색한 경우, “철수의 취미는 축구다”라는 문서의 검색 점수가 더 높다. 직관적으로 보더라도, 여가생활에 철수는 “축구”만 하고, 영희는 “축구”와 “야구”를 섞어서 할 것이므로, 철수는 영희보다 “축구”를 더 좋아할 가능성이 높을 것이다.

나머지들

수식의 첫번째 항목인 쿼리 norm과 마지막 항목인 텀 부스트(boost)는 이 글에서는 크게 신경쓰지 않아도 된다.

 

BM25

BM25를의 검색 점수를 계산하는 수식은 다음과 같다.

bm25_formula

그림. BM25 수식(출처: Elasticsearch, Improved Text Scoring with BM25)

수식을 수학적으로 이해하는 것도 중요하겠지만, TF/IDF와 비교하여 검색 결과에 어떤 영향을 주는지를 느낄 수만 있다면 충분하다.

bm_25_tfidf_vs_bm25

그림. 항목별 TF/IDF와 BM25 비교(출처: Elasticsearch, Improved Text Scoring with BM25)

TF(Term Frequency): 단어 빈도

TF의 영향이 줄어든다.

TF에서는 단어 빈도가 높아질수록 검색 점수도 지속적으로 높아지는 반면, BM25에서는 특정 값으로 수렴한다.

IDF(Inverse Document Frequency): 문서 역빈도

IDF의 영향이 커진다.

BM25에서는 DF가 높아지면 검색 점수가 0으로 급격히 수렴하므로, 불용어가 검색 점수에 영향을 덜 미친다.

norm: 문서 길이 가중치

문서 길이의 영향이 줄어든다.

BM25에서는 문서의 평균 길이(avgdl)를 계산에 사용하며, 문서의 길이가 검색 점수에 영향을 덜 미친다.

 

추가로

Coordination Factor

루씬 TF/IDF 알고리즘에는 coordination 항목도 검색 점수에 영향을 미친다. coordination 요소란 쿼리에 포함된 텀(term)을 더 많이 가진 문서에 대해 더 많은 점수 가중치를 부여하는 요소다.

bm_25_tfidf_coord_factor

그림. “holiday, china”로 검색한 경우 두 문서의 검색 점수(출처: Elasticsearch, Improved Text Scoring with BM25)

예를 들어 “holiday, china”로 검색한 경우, 첫 번째 문서는 “holiday”와 “china” 단어를 모두 가지며 최종 점수는 9점이다. 반면 두 번째 문서는 “china” 단어만 등장하며, 최종 점수는 15점이다. 단순히 TF로만 계산한다면, 두 번째 문서가 더 검색점수가 높지만, 실제로 관련성이 더 높은 문서는 첫 번째 문서다. coordination 항목은 이러한 불린(boolean) 쿼리에서 쿼리에 포함된 여러 텀(term)이 문서에 동시에 나타나는 경우 더 높은 가중치를 부여한다. 자세한 내용은 The Definitive Guide [2.x] > Lucene’s Practical Scoring Function에서 찾아볼 수 있다.

BM25 알고리즘에서 coordination 항목이 없으며, 활성화할 필요가 없다.

BM25 알고리즘 사용하기

5.0.0 이전 버전에서 기본 검색 알고리즘인 TF/IDF 대신 BM25를 사용하려면, 전역으로 설정하거나 각 필드별로 설정할 수 있다. 전역 설정은 elasticsearch.yml 파일의 index.similarity.default.type 항목을 BM25로 설정한다.

출처 ㅣ http://guruble.com/elasticsearch-query-vs-filter/



Elasticsearch를 이용하여 원하는 결과를 얻어내는 방법은 크게 Query를 이용하는 방법과 Filter를 이용하는 방법 두 가지가 있습니다. 이 두가지는 비슷하면서도 달라서 어떤 상황에서 무엇을 이용해야 하는지 종종 혼란스러울 때가 있습니다. 특히, 처음 ‘검색’이라는 것을 접하게 된 경우에는 더욱 그렇습니다.

Elasticsearch에서 Query 와 Filter의 차이를 설명하는 가장 일반적인 내용은 아래와 같습니다.

  1. Query는 스코어 값에 영향을 미치고, Filter는 스코어 값에 영향을 미치지 않는다.
  2. Query는 캐싱되지 않고, Filter는 캐싱되므로 Filter가 성능면에서 유리하다.

한마디로 이야기하자면, 스코어 값이 필요할 경우에는 Query를 이용하고, 스코어 값이 필요하지 않은 경우에는 Filter를 이용하면 됩니다.

이 내용만으로도 Query와 Filter의 특징을 알 수 있지만, 당장 내가 이용해야 하는 것이 Query인지 Filter인지에 대한 답변으로는 부족할 때가 많습니다. 그래서 처음 Elasticsearch를 접하시는 분들을 위하여 상황에 따라 Query를 사용해야 하는지, Filter를 사용해야 하는지에 대해서 조금은 속 시원하게 정리해보도록 하겠습니다.

Filter :  RDBMS를 이용할 때 사용했던 WHERE 절 구문은 Elasticsearch의 Filter에 해당한다.

Query라는 용어는 Elasticsearch 뿐만 아니라, RDBMS를 이용할 때에도 공통적으로 사용되는 용어입니다. 그렇기 때문에 처음 Elasticsearch를 이용할 때 내가 원하는 결과를 추려내기 위해서 Query 문을 이용하는 경우가 많습니다. 하지만, 우리가 흔히 사용하였던 SQL query 에서의 WHERE 절에 해당하는 조건은 filter를 이용하는 것이 적합합니다. 왜냐하면, 전체결과에서 원하는 결과를 추려내는 작업(narrow down)이라는 점에서 개념이 동일하고, 성능면에서도 유리하며, 예상치 못한 결과를 얻게되는 일이 없기 때문입니다.

Query 검색 고유의 역할에 관련된 부분은 Query를 이용한다.

Elasticsearch에서 말하는 Query는 일반적인 SQL query의 개념과 다소 차이가 있습니다. 검색이라는 것은 단순히 ‘이러한 조건을 만족하는 레코드를 찾아라’라는 개념을 넘어서, ‘가장 적합하고 유사성(스코어)이 높은 결과를 찾아라‘라는 개념이 포함되기 때문입니다. 다시말해, 이미 tokenizing, analyzing 과정을 거쳐서 인덱싱 되어있는 데이터로 부터 검색 문자열에 해당하는 가장 유사성 높은 결과를 반환하는 것은 기존 SQL 문으로는 한계가 있었던 점이고, 이를 해결하기 위한 것이 바로 lucene과 같은 검색엔진을 기반으로 하는 오픈소스에서 Query에 해당하는 것입니다.



개발 환경 : .NETFramework version = v3.5

운영 체제 : 윈도우7




보통 Elasticsearch.Net(NEST) 클라이언트를 사용하여 개발 하지만, 현재 사이트가 닷넷 3.5 버전으로

PlainElastic.Net 을 사용 하여 개발 하였다. (Elasticsearch.Net(NEST) : 4.5버전 이상에서 개발 가능)




1. .Net / Elasticsearch 연동 파일 설치

 

1.Nuget 패키지에서  PlainElastic.Net을 다운 로드 한다.


1) visual studio 상단 도구매뉴 > Nuget 패키지 관리자 > Nuget 패키지 관리





2) 혹은 패키지 관리자 콘솔 에서 Install-Package PlainElastic.Net




3) 설치 완료






2. .Net 예제 소스 



  var connection = new ElasticConnection("localhost", 9200);   // elastic의 ip 및 포트 연결

  strComment = new SearchCommand("log"null);                 // 인덱스,타입 

result = connection.Post(strComment, query);                 // query : JSON 형태의 엘라스틱 검색 쿼리




운영체제 :  window7 

DB :  로컬 디비가 아닌 원격 서버로 연동 한다



1. sqljdbc4.jar 다운로드 하여  LOGSTASH 폴더에 저장


2. logstash.conf 수정



input {

        stdin {

                codec => json

        }

file {

            path => "B:/******/Log/2017-09-18.log"

          }

jdbc {

  jdbc_driver_library => "B:/STUDY/Java/logstash-5.6.0/bin/plugin/sqljdbc4.jar" 

  jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"

  jdbc_connection_string=>"jdbc:sqlserver://**:1433;databaseName=********;" 

  jdbc_user => "sa"          # 계정

  jdbc_password => "***"  # 비밀번호 

  statement => "select top 100 * from [TBL]" 

 }


}


output {

        elasticsearch {

               # host => "localhost"

               index => "log"

               # index_type => "article"

               # protocol => "http"

      hosts => ["localhost:9200"]

        }

        stdout {

                codec => json { }

        }

file {

                path => "B:/STUDY/Java/logstash-5.6.0/logs/WebLog/webLog.log"

codec => json { }

        }


}


3. logstash 재시작

bin\logstash.bat -f logstash.conf




4. KIBANA 에서 데이터 확인 

GET /log/_search

{

  "query": {

    "match_all": {}

  }

}





MSSQL 연동 중 오류 발생 처리 내역

1. jdbc 연동 중 아래와 같은 오류가 발생 했을때

(logstash.agent cannot create pipeline : reason => "invalid byte sequence in UTF-8")




>conf 파일에서 jdbc {} 를 삭제 하면 오류 없이 재기동 되나, jdbc {} 를 추가 하자 마자 오류가 발생 했다.

로컬 pc와 동일한 conf 파일 이였으나, 위와 같은 오류가 발생 되어 


1. sqljdbc4.jar 파일을 sqljdbc42.jar 로 변경 (버전업처리)

2. logstash-5.6.1 > logstash-5.6.2 로 변경   (버전업처리)


하여 해결 





1. Elasticsearch 용어




   1) index 


      - collection of different types of document  under on logical namespace 


        (rdb에서 schema와 같은 역할)


      - shard의 수 및 replica를 설정


      - multitenant 지원 하고 자유로이 생성 및 삭제가능




   2) type


      - logical collection of documents like the same entity


        (rdb에서 table와 같은 역할)


      - table과 같은 domain objects 표현 (client, company, user...)




   3) document


      - logical unit that represents the instance of an entity


        (rdb에서 row와 같은 역할)


      - json object




   4) field


      - multiple fields that are organized as JSON key / value pairs.


        (rdb에서 columns와 같은 역할)




출처: http://semode.tistory.com/30 [세모데]

+ Recent posts