[해외] 특허 인덱스 설정과 매핑-①

Ariul·2022년 9월 26일
0
post-thumbnail

6주 동안 실전 프로젝트를 진행하면서 학습한 내용을 기록하고, 팀의 리더로서 프로젝트 매니징 경험을 기록하는 시리즈입니다.


고민 지점 및 의사결정

1. 모든 데이터가 영어가 아니다! 국가마다 다른 언어의 데이터가 들어 있다!

1) 다국어 처리는 어떻게 해야 하는가?

2) index를 분리한다면 어떻게 분리해야 하는가?

  • 모든 국가(25개국)별 인덱스를 분리하면 관리가 어렵습니다.
  • 분석기 지원이 안 되는 언어도 있습니다.
  • 우리의 타겟 유저는 국내에 있는 특허 검색 서비스 초보 이용자입니다.
    → 포르투갈어, 덴마크어, 콜롬비아어 등으로 특허를 검색할 확률이 극히 낮을 것이라 판단하였습니다.

⇒ 결론: 영어권, 비영어권, 일본으로 인덱스를 분리하기로 결정하였습니다.

<인덱스 1 - 영어권>
미국, 유럽, PCT, 중국, 영국, 독일, 프랑스, 호주, 캐나다, 대만, 이스라엘, 스페인, 필리핀, 스웨덴
<인덱스 2 - 비영어권>
러시아, 오스트리아, 덴마크, 포르투갈, 스위스, 폴란드, 슬로베니아, 콜롬비아, 유라시아, 세르비아
<인덱스 3>
일본

🤔 중국, 유럽, 프랑스, 독일, 이스라엘, 스페인, 스웨덴이 영어권 인덱스에 있는 이유

  • 키프리스 데이터를 분석한 결과, 영어권 인덱스에 포함하여도 무방할 만큼 영어로 저장된 데이터가 많다고 판단하였기 때문입니다.

2. 동의어 사전을 색인할 때 사용할까 검색할 때 사용할까?

동의어는 색인 시에 또는 검색 시에 사용될 수 있는 분석기에서 사용됩니다. 보통 색인 시에 동의어를 사용하면 다음과 같은 장단점이 있습니다.

색인 시 동의어 사용

  • 장점
    • 성능: 쿼리 시마다 매번 수행해야 할 필요가 없기 때문에, 일치되어야 하는 좀 더 많은 용어들이 잠재적으로 결과에 포함될 수 있다.
  • 단점
    • 모든 동의어가 색인되어야 하기 때문에 인덱스가 더 커질 수 있다.
    • 용어 통계에 의존하는 검색 점수는 동의어들도 개수 계산에 포함되기 때문에 문제가 생길 수 있으며, 좀 더 일반적으로 사용되지 않는 단어들에 대한 통계는 왜곡된다.
    • 동의어 규칙은 재색인 없이 기존 문서에 대해 변경될 수 없다.

보통 검색 시에 동의어를 사용하면 다음과 같은 장단점이 있습니다.

검색 시 동의어 사용

  • 장점
    • 인덱스 크기에 영향을 미치지 않는다.
    • 모음의 용어 통계가 동일하게 유지된다.
    • 동의어 규칙이 변경되어도 문서를 재색인할 필요가 없다.
  • 단점
    • 쿼리 시마다 매번 동의어 확장을 수행해야 하며 잠재적으로 일치시켜야 하는 단어가 더 많다.

일반적으로, 검색 시 동의어 사용의 장점은 보통 색인 시 동의어를 사용할 때 얻을 수 있는 약간의 성능 상의 이득보다 앞선다고 평가합니다.

하지만 우리 프로젝트에서는, 국가 필드에서만 동의어를 사용하며 그마저도 용어를 대체(⇒)하는 것이기 때문에 색인 시 동의어 사용에 큰 단점이 없다고 판단했습니다. 또한, [국가] 필드는 필터의 기능만 하며, 굳이 search_analyzer를 따로 사용할 필요가 없다고 판단하여 색인 시 동의어를 사용하기로 결정하였습니다.

4. 하나의 동의어 사전 파일에 모든 국가 코드를 다 포함하는 게 좋은가?

해당되지 않는 국가는 파일에 포함하지 않는 게 맞다고 생각하여 영어권 동의어 사전과 비영어권 동의어 사전으로 분리하기로 결정하였습니다. 일본의 경우, 따로 동의어 사전 파일을 만들지 않고, synonyms 항목에서 직접 동의어 목록을 입력하기로 하였습니다.


영어권 인덱스 매핑 정의

PUT english-test3
{
  "settings": {
    "index": { //1️⃣샤드 수는 클러스터 설계가 완료된 후 변경할 계획입니다.
      "number_of_shards": 1,
      "number_of_replicas": 1
    },
    "analysis": {
      "analyzer": { // 2️⃣애널라이저
        "english_analyzer": {
          "tokenizer": "standard",
          "filter": ["lowercase", "stopword", "my_snow"]
        },
        "number_analyzer" : {
          "type" : "pattern",
          "pattern" :"[.]"
        },
        "country_analyzer": {
          "tokenizer": "standard",
          "filter": ["synonym"]
        }
      },
      "filter": { // 3️⃣ 토큰 필터
        "my_snow": {
          "type": "snowball",
          "language": "English"
        },
        "synonym": {
          "type": "synonym",
          "synonyms_path": "user_dic/my_syn_dic.txt"
        },
        "stopword" : {
          "type" : "stop",
          "stopwords_path" : "user_dic/stopwords.txt"
        }
      }
    }
  },
  "mappings": {
    "properties": { //4️⃣ 필드에 데이터 타입 매핑
      "CPC분류": {
        "type": "text"    
      },
      "IPC분류": {
        "type": "text"    
      },
      "event": {
        "properties": {
          "original": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      },
      "log": {
        "properties": {
          "file": {
            "properties": {
              "path": {
                "type": "text",
                "fields": {
                  "keyword": {
                    "type": "keyword",
                    "ignore_above": 256
                  }
                }
              }
            }
          }
        }
      },
      "공개번호": {
        "type": "keyword"      
      },
      "공고번호": {
        "type": "keyword"
      },
      "등록번호": {
       "type": "keyword"
      },
      "발명의명칭": {                 
        "type": "text",
        "analyzer": "english_analyzer", 
        "fields": {
          "keyword": {
          "type": "keyword",
          "ignore_above": 256
          }
        }
      },
      "국가": {
        "type": "text",
        "analyzer": "country_analyzer" 
      },
      "요약": {                  
        "type": "text",
        "analyzer": "english_analyzer"
      },
      "출원번호": {
        "type": "keyword"
      },
      "출원인": {
        "type": "text",
        "analyzer": "english_analyzer", 
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "출원일자": {
        "type": "text",
        "analyzer": "number_analyzer",
        "fields": {
          "keyword" : {
            "type" : "keyword",
            "ignore_above" : 256
          }
        }
      }
    }
  }
}

1. 샤드 설정은 클러스터 설계가 완료된 후 변경할 예정.

2. Analyzer

2.1. english_analyzer

[발명의명칭], [출원인], [요약] 필드의 데이터에 custom analyzer를 적용하였습니다.

토크나이저는 standard이고, 토큰 필터는 lowercase, stopword, snowball을 사용하였습니다.

2.2. number_analyzer

[출원일자] 필드의 데이터는 ‘2022.09.21’의 형태를 가집니다.

그 중에서 연도(2022)만 추출하기 위해 패턴 “[.]”을 기준으로 텍스트를 분리하는 패턴 애널라이저를 적용했습니다.

2.3. country_analyzer

[국가] 필드의 데이터는 ‘US(미국), AU(호주)’ 등의 국가코드입니다.

한국어로 검색할 수 있도록 하기 위해 국가 코드를 한국어로 치환하였습니다.

3. Token Filter

3.1. my_snow

snowball은 보통 ~ing, ~s 등을 제거하여 문장에 쓰인 단어들을 기본 형태로 변경합니다.

language 파라미터를 English로 설정하였습니다.

3.2. synonym

국가 코드를 한국어로 치환하는 동의어 사전을 만들고, 경로를 지정하였습니다.

# sysnonyms setting in sysnonyms.txt

# replacement
US => 미국
EP => 유럽
WO => PCT
CN => 중국
GB => 영국
DE => 독일
FR => 프랑스
AU => 호주
CA => 캐나다
TW => 대만
IL => 이스라엘
ES => 스페인
PH => 필리핀
SE => 스웨덴

3.3. stopword

캐나다 데이터에 있는 문자 ‘â’와 검색에 불필요한 용어를 제거하기 위해 불용어 사전을 만들고, 경로를 지정하였습니다.

â
.â
a
an
and
are
as
at
be
but
by
for
if
in
into
is
it
no
not
of
on
or
such
that
the
their
then
there
these
they
this
to
was
will
with

4. 필드에 데이터 타입 매핑

  • [출원번호] : keyword
  • [출원일자] : text, keyword
  • [발명의명칭] : text, keyword
  • [출원인] text, keyword
  • [IPC분류] text
  • [CPC분류] text
  • [공고번호] keyword
  • [공개번호] keyword
  • [등록번호] keyword
  • [국가] text
  • [요약] text
profile
정성과 진심을 담아 흔적을 기록하자💡

0개의 댓글