반응형
Recent Posts
Recent Comments
관리 메뉴

개발잡부

[es] 자동완성 2 본문

ElasticStack/Elasticsearch

[es] 자동완성 2

닉의네임 2022. 1. 4. 13:38
반응형

개발환경 

Mac OS

java 1.8 maven (plugin)

elastic stack 7.12.1 (es, kibana)- docker compose 


 

애널라이저 구조가 이렇단 말이지..

애널라이저를 만들고 토크나이저에 edge_ngram 넣고 커스텀 플러그인 kr-danalyzer (korean doo analyzer) aka. KDA 를 설치해서 토큰 필터 적용,  필드에 맵핑시켜본다. 

 

Analyzer repository

https://github.com/900gle/kr-danalyzer

 

GitHub - 900gle/kr-danalyzer: doo analyzer for korean

doo analyzer for korean. Contribute to 900gle/kr-danalyzer development by creating an account on GitHub.

github.com

 

pom.xml 이 있는곳으로 가자..

mvn clean install

에러나네..

저번하고 같은 에러인데.. 지미.. 어떻게 해결했더라..

 

# 로그를 보자 -X 옵션 추가 
mvn clean -X install

솔라 관련 내용을 다 지워버리자!

 

elastic stack 버전이

 .env 파일 열어봅세

 

 

pom.xml 수정

 

이것도 맞춰서 

다시 빌드 

집파일은 target/releases/ 안에 있구만

 

Elasticsearch home 안에 plugin 디렉토리 만들고 .zip 파일 이동 

cp -af kr-danalyzer-7.12.1.zip ~/docker/elastic/elasticsearch/plugin

Dockerfile 에 인스톨 추가 

ARG ELK_VERSION

# https://www.docker.elastic.co/
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}

COPY plugin/kr-danalyzer-7.12.1.zip plugin/kr-danalyzer-7.12.1.zip
RUN elasticsearch-plugin install file:///usr/share/elasticsearch/plugin/kr-danalyzer-7.12.1.zip

설치가즈아

#일단 지우자
docker compose down

#백그라운드로 실행하고 다시 빌드
docker compose up -d --build

#로그 함 봐볼까?
docker logs doo_es

로그

 

인덱스 생성

PUT doo
{
  "settings": {
    "analysis": {
      "analyzer": {
        "doo_analyzer": {
          "type": "custom",
          "tokenizer": "autocomplete",
          "filter": [
            "doo-custom"
          ]
        },
        "jamo_analyzer": {
          "type": "custom",
          "tokenizer": "autocomplete",
          "filter": [
            "doo-jamo"
          ]
        },
        "chosung_analyzer": {
          "type": "custom",
          "tokenizer": "autocomplete",
          "filter": [
            "doo-chosung"
          ]
        }
      },
      "tokenizer": {
        "autocomplete": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 20,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "text",
        "analyzer": "doo_analyzer",
        "fields": {
          "jamo": {
            "type": "text",
            "analyzer": "jamo_analyzer"
          },
          "chosung": {
            "type": "text",
            "analyzer": "chosung_analyzer"
          }
        }
      }
    }
  }
}

데이터 입력

POST _bulk
{"index":{"_index":"doo", "_id":"1"}}
{"name":"나이키", "weight" : 1, "boost" : 1, "description" : "나이키 상품"}
{"index":{"_index":"doo", "_id":"2"}}
{"name":"나이키 에이맥스","weight" : 1, "boost" : 1,"description" : "나이키 운동화"}
{"index":{"_index":"doo", "_id":"3"}}
{"name":"나이키 에어조던","weight" : 1, "boost" : 1,"description" : "나이키 운동화 농구화"}
{"index":{"_index":"doo", "_id":"4"}}
{"name":"나이키 에어조단","weight" : 1, "boost" : 1,"description" : "나이키 운동화 농구화"}
{"index":{"_index":"doo", "_id":"5"}}
{"name":"나이키 후드티","weight" : 1, "boost" : 1,"description" : "나이키 의류"}
{"index":{"_index":"doo", "_id":"6"}}
{"name":"나이키 후드집업", "weight" : 1, "boost" : 1,"description" : "나이키 의류 자켓"}
{"index":{"_index":"doo", "_id":"7"}}
{"name":"나이키 후드나시티","weight" : 1, "boost" : 1,"description" : "나이키 의류 속옷"}
{"index":{"_index":"doo", "_id":"8"}}
{"name":"나이키 후드점퍼","weight" : 1, "boost" : 1,"description" : "나이키 의류 자켓"}
{"index":{"_index":"doo", "_id":"9"}}
{"name":"나이키 후드트레이닝","weight" : 1, "boost" : 1,"description" : "나이키 의류"}
{"index":{"_index":"doo", "_id":"10"}}
{"name":"나이키 트레이닝","weight" : 1, "boost" : 1,"description" : "나이키 의류 트레이닝"}

색인된 term 확인 

GET doo/_termvectors/3?fields=name.chosung
{
  "_index" : "doo",
  "_type" : "_doc",
  "_id" : "3",
  "_version" : 1,
  "found" : true,
  "took" : 0,
  "term_vectors" : {
    "name.chosung" : {
      "field_statistics" : {
        "sum_doc_freq" : 49,
        "doc_count" : 10,
        "sum_ttf" : 49
      },
      "terms" : {
        "ㄴㅇ" : {
          "term_freq" : 1,
          "tokens" : [
            {
              "position" : 0,
              "start_offset" : 0,
              "end_offset" : 2
            }
          ]
        },
        "ㄴㅇㅋ" : {
          "term_freq" : 1,
          "tokens" : [
            {
              "position" : 1,
              "start_offset" : 0,
              "end_offset" : 3
            }
          ]
        },
        "ㅇㅇ" : {
          "term_freq" : 1,
          "tokens" : [
            {
              "position" : 2,
              "start_offset" : 4,
              "end_offset" : 6
            }
          ]
        },
        "ㅇㅇㅈ" : {
          "term_freq" : 1,
          "tokens" : [
            {
              "position" : 3,
              "start_offset" : 4,
              "end_offset" : 7
            }
          ]
        },
        "ㅇㅇㅈㄷ" : {
          "term_freq" : 1,
          "tokens" : [
            {
              "position" : 4,
              "start_offset" : 4,
              "end_offset" : 8
            }
          ]
        }
      }
    }
  }
}

음.. 초성은 잘 되었고..

 

자동완성 쿼리

GET doo/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "fuzzy": {
            "name.chosung": {
              "value": "ㄴㅇㅋ",
              "fuzziness": 1
            }
          }
        },
        {
          "prefix": {
            "name.chosung": {
              "value": "ㄴㅇㅋ"
            }
          }
        }
      ]
    }
  }
}

분석기를 뺐으면 테스트 결과가 명확했을 것인디.. 

 대충 이런식으로 .. 나오니까

name 에 맵핑된 멀티 타입으로 자동완성 만들어 봐야것네

반응형

'ElasticStack > Elasticsearch' 카테고리의 다른 글

[es] intervals query  (0) 2022.01.06
[es] Java High Level REST Client  (0) 2022.01.05
[es] 자동완성1  (0) 2022.01.04
[es] query score test  (0) 2021.12.26
[es] multi-match query  (0) 2021.12.20
Comments