엘라스틱서치+은전한닢은 이럴때 어떤결과가 나오나요?

1,508 views
Skip to first unread message

yongphil kim

unread,
Dec 9, 2015, 5:01:24 AM12/9/15
to 은전한닢 프로젝트

이런 질문을 드려도 되는지 모르겠습니다

은전한닢에서 아래 단어들을 타이핑 했을 때  검색 결과값이 궁금합니다

저희가 현재 사용하고 있는 검색엔진의 결과(형태소가 분절이 잘 안되는 듯해요)

가 너무 안나와서 엘라스틱+은전한닢을 고려 중입니다.

아래와 같은 키워드를 넣었을 때 발견하고 싶은 컨텐츠를 찾을 수 있을까요?

아니면 어떤 작업들이 필요한지요..

대부분 띄어쓰기와 붙여쓰기의 문제들입니다.

저희 현재 엔진에서는 전부 검색이 안되요

저는 프로그래머는 아니고 기획자인데 궁금해서요

회사에 의견을 넣어보려고 합니다.






Auto Generated Inline Image 1
Auto Generated Inline Image 2

유영호

unread,
Dec 15, 2015, 5:13:16 AM12/15/15
to 은전한닢 프로젝트
답변이 늦었네요.. 

문장을 띄어쓰기를 하지 않고 입력했을 때 분석을 잘 해주냐의 문제인데요.
기본적으로 기능이 제공되고 있습니다. 하지만, 사전에 없는 단어가 입력되었을 경우에는 오분석으로 검색이 안될 수 있습니다.
그떄는 사전에 단어를 추가하시고 사용하시면 되겠습니다. 
단, 9, 10번 문제는 다른 영어권의 필터를 찾아서 elasticsearch에 붙이면 될수도 있겟네요. 은전한닢으로는 불가능합니다.

개발자 한명 붙잡아서 일단 mecab, mecab-ko-dic 설치하셔서 분석이 어떻게 되는지 대략 확인해보시면 빠르게 작업하실 수 있을 것 같습니다.

yongphil kim

unread,
Dec 18, 2015, 1:18:09 AM12/18/15
to 은전한닢 프로젝트
감사합니다 은전한닢 설치해서 전부 해결되었습니다. 단 uhdtv 같은 영어를 빼구요
혹시 추천해주실 영어필터가 계신가요?
그리고 " 갤럭시 기어s2"로 검색시 검색된 컨텐츠에. "갤러시 기어s가 2대있어요"가 나옵니다
" 갤럭시 기어 s2"나 "갤럭시 기어s 2"만 나오게 하는 방법은 없나요?
S와 2를 형태소가 분절이 안되거나 s와 2는 나눠지더라도 멘데터리처럼 되는 방법이....

유영호

unread,
Dec 18, 2015, 2:01:37 AM12/18/15
to 은전한닢 프로젝트
다시 생각해보니 9, 10번 문제도 사전에 smart, uhd, tv를 등록하면 해결이 되네요.. 대소문자를 다 등록할 필요없이 elasticsearch lower filter를 사용한다면 소문자만 등록해도 됩니다.
그리고 "갤럭시 기어 s2" 문제도 "s2"를 사전에 등록하면 "갤럭시 기어 기어s가 2대 있어요"는 안나오게 막을 수 있을 것 같습니다. 덩달아 "갤럭시 기어s 2"도 안나올것같긴하지만...
쇼핑쪽 작업을 하시는 것 같은데 일단 상품명 사전을 우선 구축하는게 좋을 것 같아요.

yongphil kim

unread,
Dec 24, 2015, 9:52:28 AM12/24/15
to 은전한닢 프로젝트
감사합니다. 많은 도움되었습니다

ikc...@soribada.com

unread,
Jan 29, 2016, 2:29:46 AM1/29/16
to 은전한닢 프로젝트
내용글 보고, 잘못된 부분이 있어 답글 남깁니다.

저도 비슷한 케이스로 대소문자 관련하여 사전등록에 대한 의문이 들었는데요

시뮬레이션 결과 lowercase filter 적용 후에도 사전은 대/소문자 모두 등록해야만 가능하더군요.. 

예를 들어 그룹가수 "015b", "015B" 의 경우, 사전에 "015B"만 등록하면 "015b" 로 은전한닢으로 색인된 문서는 검색이 되지 않습니다.

왜냐하면, 분석기=((토크나이저=은전한닢) + filter) 이기 때문에 015B는 사전에 등록되어 있어 정상적으로 015B가 토큰으로 추출되고 filter적용되어 015b로 변환되지만

015b는 토크나이저에서 먼저 015, b로 분리되어 filter를 후에 적용하기때문이죠..
다음은 시뮬레이션 결과입니다.


netcrazy@ubuntu:/usr/local/server/elasticsearch/bin$ curl -XPUT localhost:9200/test/?pretty -d '{
>   "settings" : {
>     "index":{
>       "analysis":{
>         "analyzer":{
>           "korean":{
>             "type":"custom",
>             "tokenizer":"seunjeon_default_tokenizer",
>             "filter" : [ "lowercase" ]
>           }
>         },
>         "tokenizer": {
>           "seunjeon_default_tokenizer": {
>             "type": "seunjeon_tokenizer",
>             "deinflect": false,
>             "index_eojeol": true,
>             "index_poses": ["N","SL", "SH", "SN", "XR", "V", "UNK"],
>             "pos_tagging": true,
>             "user_words": ["낄끼빠빠,-100", "버카충", "샌디에고","015B"]
>           }
>         }
>       }
>     }
>   }
> }'
{
  "acknowledged" : true
}
netcrazy@ubuntu:/usr/local/server/elasticsearch/bin$ curl -XPOST 'http://localhost:9200/test/_analyze?analyzer=korean&pretty' -d '015b'
{
  "tokens" : [ {
    "token" : "015/sn",
    "start_offset" : 0,
    "end_offset" : 3,
    "type" : "SN",
    "position" : 0
  }, {
    "token" : "b/sl",
    "start_offset" : 3,
    "end_offset" : 4,
    "type" : "SL",
    "position" : 1
  } ]
}
netcrazy@ubuntu:/usr/local/server/elasticsearch/bin$ curl -XPOST 'http://localhost:9200/test/_analyze?analyzer=korean&pretty' -d '015B'
{
  "tokens" : [ {
    "token" : "015b/n",
    "start_offset" : 0,
    "end_offset" : 4,
    "type" : "N",
    "position" : 0
  } ]
}

유영호

unread,
Jan 30, 2016, 9:28:53 AM1/30/16
to 은전한닢 프로젝트
네, 제가 직접 해본건 아니였고, 짧게 생각하고 답변 드렸었는데 해결이 안되나봅니다. ^^;
혹시 은전한닢에서 token filter를 제공하면 해결이 될까요?

lowercase tokenizer 선 적용 후 은전한닢 형태소분석을 하면 가능하겠죠?

유영호

unread,
Jan 30, 2016, 11:45:17 AM1/30/16
to 은전한닢 프로젝트
다시 생각해보니.. 그냥 자체적으로 소문자화 시켜서 키워드를 뽑으면 간단하게 될것도 같네요..
다음 버전에서는 해결을 해서 릴리즈 해볼게요.

ikc...@soribada.com

unread,
Jan 31, 2016, 8:07:09 PM1/31/16
to 은전한닢 프로젝트
빠른답변 대응 감사합니다.
즐거운 하루 되세요~

유영호

unread,
Feb 1, 2016, 7:03:29 PM2/1/16
to 은전한닢 프로젝트
mapping char_filter 를 사용해서 바로 적용해볼수는 있겠네요.
lowercase기능을 어떻게 적용할지는 고민이 필요할 것 같구요, 그 전에 아래와 같이 적용해서 사용해보세요.


#!/usr/bin/env bash

ESIDX='seunjeon-idx'

curl -XPUT ${ES}/${ESIDX}/?pretty -d '{
  "settings" : {
    "index":{
      "analysis":{
        "analyzer":{
          "korean":{
            "type":"custom",
            "char_filter": ["lowercase"],
            "tokenizer":"seunjeon_default_tokenizer"
          }
        },
        "char_filter": {
          "lowercase": {
            "type": "mapping",
            "mappings": [
              "A=>a", "B=>b", "C=>c", "D=>d", "E=>e", "F=>f", "G=>g", "H=>h", "I=>i", "J=>j", 
              "K=>k", "L=>l", "M=>m", "N=>n", "O=>o", "P=>p", "Q=>q", "R=>r", "S=>s", "T=>t", 
              "U=>u", "V=>v", "W=>w", "X=>x", "Y=>y", "Z=>z"]
          }
        },
        "tokenizer": {
          "seunjeon_default_tokenizer": {
            "type": "seunjeon_tokenizer",
            "user_words": ["abc마트"]
          }
        }
      }
    }
  }
}'

sleep 1


echo "========================================================================"
curl -XGET ${ES}/${ESIDX}/_analyze?analyzer=korean\&pretty -d 'Abc마트'



불편함이 있다면 계속해서 말씀주세요~

유영호

unread,
Feb 1, 2016, 7:28:42 PM2/1/16
to 은전한닢 프로젝트
노멀라이즈해서 돌려도 잘되네요.


curl -XPUT ${ES}/${ESIDX}/?pretty -d '{
  "settings" : {
    "index":{
      "analysis":{
        "analyzer":{
          "korean":{
            "type":"custom",
            "char_filter": [ "nfc_cf_normalizer" ],
            "tokenizer":"seunjeon_default_tokenizer"
          }
        },
        "char_filter": {
          "nfc_cf_normalizer": {
            "type": "icu_normalizer"
          }
        },
        "tokenizer": {
          "seunjeon_default_tokenizer": {
            "type": "seunjeon_tokenizer",
            "user_words": ["낄끼빠빠,-100", "버카충", "abc마트"]
          }
        }
      }
    }
  }
}'





유영호

unread,
Feb 20, 2016, 5:17:51 AM2/20/16
to 은전한닢 프로젝트
http://eunjeon.blogspot.kr/2016/02/elasticsearch-analysis-seunjeon-2113.html

기본적으로 소문자 변환하도록 수정하여 새롭게 릴리즈하였습니다.

의견 감사합니다!!
Reply all
Reply to author
Forward
0 new messages