이것저것

공부하기

  • 데이터를 많이 모아 보려고 하고 있다.
  • 데이터를 모으는것은 그냥 모으면 되지만, 이것들을 어떻게 활용 할 것인가에 대한 고민...
    • 데이터를 "처리"하는 부분
    • 데이터를 "분석"하는 부분
    • 데이터를 "활용"하는 부분
  • 으로 나뉘어 질텐데, 우선 텍스트를 쉽게 분석? 할 수 있는 엘라스틱 스택에 대해서 공부 하기로.

읽기

  • 우선 이 책은 초보자를 위한 책은 아님이 확실하다.
  • 엘라스틱 서치의 많은 것을 알려 주기는 하지만, 설명이 장황하고, 구체적이다. 초보가 보기에는 정보가 너무 많아, 너무 어렵게 느껴 질 것으로 판단된다.
  • 이 글에서는, 책의 순서가 뒤죽 박죽이 될 수도 있겠다.

02장 일래스틱서치 시작하기

  • p57 kibana에서 REST API 호출하기

    • GET /라고 입력한 뒤, 초록색 삼각형()을 누르면 해당 쿼리가 실행된다고 한다.
    • 더 쉬운 방법이 있다. 실행하고 싶은 쿼리가 있는 곳으로 커서을 옮긴 뒤, Ctrl + Enter를 입력하면, 커서가 있는 위치의 명령이 수행된다. 이걸 쓰도록 하자.
    • kibana Dev Tools 에서 쿼리를 입력하는 도중 문제가 있으면, 에러 표시()를 해 주므로, 쉽게 사용할 수 있다.
      • 아래는 json의 key 부분인 params"로 감싸지 않아서, 문제가 있다고 알려줌.
      • 단, 모든 에러를 모두 찾아주는건 아니니깐.. 그건 어쩔 수 없음. ㅋ.
  • 엘라스틱 서치에서 REST API의 동작이 ... 뭔가 .. 좀 이해하기 어렵다.

    • 보통 POST는 "추가/생성"의 의미를 가지고, PUT은 "수정(혹은 생성?)"의 의미를 가지는데, 이책의 예제들을 보면, 그게 좀 모호하다.
      • POST
        • id 지정 없이 데이터를 추가하고 싶은 경우(서버가 알아서 id를 할당)
        • id 가 있고, 데이터를 수정하고 싶은 경우 (응???)
      • PUT
        • 인덱스를 새로 만들고 싶은 경우
        • id를 지정해서 도큐먼트(데이터)를 추가하고 싶은 경우
  • p60 가운데 그림

    • 노드 이라고 되어 있는데, 아마도 인덱스가 되어야 할 것이다.
    • 실제 노드에 대한 설명은 64, 64 페이지에 나온다.
  • p78 가운데 업데이트 API 예제

    • POST /catalog/product/1/_update { 에서 마지막 {를 빼야 한다.
    • 다음줄에 {가 또 나오기 때문이다.
    • Kibana에서 입력할 때도 _update뒤에 {가 있으면, 아래와 같이 에러가 발생한다.
  • p 82 인덱스의 매핑을 지정하기 위해서 mappings를 사용하는 부분.

    • mappings로 되어 있어서, 여러개의 type을 넣어 보고 싶어서 시도 했드나, 한개의 인덱스에 여러개의 type을 넣으니 에러가 발생했다. 이상하다, 분명히 인터넷에 여러개의 type을 넣는 예제( [Elasticsearch] Multi types into Index. )도 있는데 말이다.

    • 근데 왜 mappings일까?

      • 한국 엘라스틱에서 올린 글( 미처 못 다한 이야기들 - Elastic{ON} Tour Seoul )에서 이유를 찾을 수 있다.

        • 타입(Type) : 엘라스틱 서치 6.0부터는 타입이 하나로 제한됩니다. 단, 5.x에서 만들어진 인덱스는 6.0으로 업그레이드 했을 때도 그대로 여러 타입을 사용할 수 있습니다.

      • 즉, 이전에는 mappings가 정확한 의미를 잘 표현한 것이고, 6.x에서 달라졌으나, 그 이름을 그대로 활용하는 상태라고 이해된다. 그냥 mapping이라고 하나 추가해도 될 듯 한데...

  • p83 기존 인덱스에 타입 매핑 생성

    • 인덱스를 생성한 후에도 인덱스 타입을 추가할 수 있다.라는 말이 있는데, 이게 상황에 따라 다르다.
    • 이전 페이지인 p 82 에서 이미 catalog에 대해서 my_type이라는 타입을 만들어 두었다.
    • 위에 설명한 mappings에 대한 설명을 적용하면, 한개의 인덱스에서는 두개의 타입을 넣을 수 없다. 그러므로 이미 my_type이라는 타입을 넣어 두었으므로, p 83에서 추가하려고하는 catalog 타입을 넣으려고 하면, 아래와 같이 에러가 발생한다.
    • 그러므로, 정확한 설명은 인덱스를 생성하고, 타입을 추가하지 않은 경우, 나중에 타입을 추가할 수 있다. 라고 되어야 한다. 이를 모두 자세히 나열하면 아래와 같은 것이다.
      • DELETE /catalog로 먼저 생성해둔 catalog 인덱스를 삭제
      • PUT /catalog인덱스만 생성
      • PUT /catalog/_mapping/category { ... }category 라는 타입을 추가하면서 mappings까지 설정
      • GET /catalog/_mapping/을 통해서 category라는 타입mappings가 잘 설정 되었는지 확인.
  • p88 JSON 응답 형식 부분

    • 기본적으로 모든 요청에 대한 응답은 형식이 없다. .. 어떠한 형식도 지정되지 않는다. 부분의 번역이 언뜻 이해하기 어렵다.
    • 단 한줄로 json응답이 오면 응답 형식이 없는 상태이고, 엔터와 탭으로, 예쁘게 json 응답이 오는것을 응답 형식이 있는 상태라고 해석하고 있다.
    • 아마도, "포맷(format)"을 "형식"이라고 번역했지 않을까 생각해 본다.
    • 기술 서적이라면(적어도, 이정도의 고난이도?? 기술을 다루는 책이라면.. 모든것을 번역할 필요가 있을지 의문이다... )
    • 책에서는 ?pretty=true를 사용했지만, 단순히 ?pretty만 사용해도 json 형태의 응답이 예쁘게 출력 된다.
    • 또한 JSON 형식 뿐만 아니라, yaml 형태로 출력 할 수도 있다. ?format=yaml를 이용해서 쿼리를 날리면 된다.
  • p90 GET /_search의 결과물 부분

    • 책에서는 나오지 않지만, 실제로 쿼리를 실행하면, 우리가 만든 category 뿐만 아니라, 우리가 만들지 않은 .kibana_1이라는 인덱스를 발견할 수 있다.
    • 이건 말 그대로 kibana용 인덱스이다. 언제 이런게 만들어졌나고?
    • kibana를 최초로 실행시키면 아래의 로그를 볼 수 있다.

03장 유사도 검색

  • 이후 부터 용어라는 말이 나오는데, 영어로는 term이다. ( 사실 이미 p73 등에서 등장한 말이다.) 역색인시 사용하는 key 정도로 이해하고 우선 넘어 가면 될 듯 하다. ( key일래스틱 서치와 같이, 여러개의 단어로 이루어져 있을 수도 있을것 같다. - 정확하지 않음.)

  • p94 전문검색 이라는 용어가 나오는데, 全文검색이다. 영어로는 Full Text Search

  • 텍스트 분석기는 아래의 3가지 과정은 순차적으로 거친다

    1. 문자 필터(Character filters) : 0개 이상 - 문자열 치환 등 문자열 처리
    2. 토크나이저(Tokenizer) : 정확히 1개 - 문자열을 쪼개주는 역할, 역색인 만들때 사용
    3. 토큰 필터(Token filters) : 0개 이상 - 쪼개진 문자열을 다시 처리하는 역할, 각 토큰으로 들어온 문자열을 소문자로 바꾸거나, 불용어(The, a, an, is ...)를 없애주는 등의 처리 가능
  • 토크나이저(Tokenizer)는 문자열을 잘라주는 역할인데, 표준분석기, 언어분석기, 공백분석기 등이 있다.

  • 이 중에서 제일 재미난건 언어 분석기인데, 사실상 이 놈의 핵심인것 같다.

  • 재수좋게도, 2018년 8월 24일에 엘라스틱에서 공식 한국어 분석 플러그인 '노리'를 만들었다. 아싸!!

    • 용량이 작다.
    • 속도가 빠르다.
    • 공식지원이니 설치가 편하다.
  • 설치하는 방법과 간단한 사용방법은 Elasticsearch 6.4 기본 한글 형태소 분석기 노리 (nori) 설명 및 사전 추가하기를 방문해서 확인해 보자.

  • REST api로는 아래와 같이 호출해 보면, 아래와 같이 주요 단어를 잘 뽑아 주는것을 확인해 볼 수 있다.

  • 뉴스 관련 데이터로 몇가지 테스트를 해 보았다.

    • 뉴스의 카테고리는 category라는 이름으로 그냥 text로 만들었고, title과 contents는 "nori" 분석기를 달도록 설정했다.
    • 이후 news/article type에 30여개의 document를 추가 했다.
    • 뉴스 데이터 category에 "경제"를 넣어 두고, 검색할때 "category" : "경제" 를 검색하면 아래와 같이 잘 찾아 진다.
    • 하지만 "category" : "경제적"을 검색하면 제대로 찾아 지지 않는다.
    • 이제 contents에도 똑같이 경제를 검색해 보자. "경제"라는 글자가 contents에 있는 경우에는 당연히 잘 검색 된다.
    • 이제 contents에 경제적을 검색해 보자. "nori" 분석기가 잘 동작했다면, "경제적"이라는 전체 단어가 아니라, "경제"라는 단어만 있어도 잘 검색해 줄 것이다. 아래 결과를 보면 "경제"가 들어간 결과 뿐만 아니라, 경제를도 잘 검색 된다는것을 알 수 있다. 즉, 분석기가 글자를 잘 분석해서 역색인 했다는것을 알 수 있다.
      • 구조화된 데이터 검색

  • 반면, 비슷것을 찾아주는게 아니라 정확하게 색인 된 것만 찾으려면 term 을 사용해서 찾으면 된다.

    • match를 사용하는 위의 예제에서는 경제적을 검색어로 써도 경제를 찾거나, 경제를을 찾아준다.하지만 정확하게 색인된 것만 찾으려면 term을 사용하자
    • term을 사용해서 경제적을 찾으며 아무것도 찾아지지 않는다는것을 알 수 있다.
    • 그렇다면 contents에 실제로 있는 경제를이라는 검색어를 term을 사용해서 검색하면 어떻게 될까? 아래와 같이 검색 되지 않는다.
    • term색인된 것만을 검색한다. nori 분석기에서는 경제를을 색인한것이 아니라, 경제만 색인 했기 때문에 term을 사용했을때 경제를이라는 검색어로는 찾아지지 않는것으로 보인다.
    • term을 사용하여 경제를 찾으면 제대로 찾아 지는것을 알 수 있다.
  • title이나 contents 필드는 text 타입으로 설정해 두었다. 그러므로 match로 검색을 하면 nori 분석기를 통해서 비슷한 것도 찾아 준다. 하지만 만약 category 필드와 같이 keyword 타입으로 설정해 두었다면, nori 분석기등을 통하지 않고 "정확한 것"만 검색하도록 된다.

    전문 텍스트 검색

  • match검색시 검색어에 오타가 있을 경우를 대비한 fuzziness값을 줄 수도 있다.

    • fuzziness에 1, 2 등의 값을 주면, 몇 글자가 틀려도 알아서 찾아 준다.
    • 예를 들어 경조라고 잘못 검색어를 입력해도,공조, 경찰, 경제등을 찾아 준다.
  • 반면 match에는 여러 검색어에 정확하게 맞는 쿼리를 보내고 싶을 때는 match_phrase를 사용한다. 구글에서 " " 로 감싸서 쿼리하는것과 비슷하다.

    • 단, 검색어에서 순서는 정확하게 맞지만, 일부 단어가 생략되는것을 허용하려면 slop 값을 조정하면 된다.
  • 그외 이것 저것은 생략. 나중에 필요할 때 찾아 보자

    04장 일래스틱서치 분석 ( 아직 안 읽음 )

+ Recent posts