Elasticsearch에서 Dictionary를 사용하여 analyzer를 만들고 그를 사용해서 index에 Document를 인덱싱할 수 있다. 근데 Dictionary가 변경되면 analyzer를 변경하고 indexing된 document를 갱신하려면 어떻게 해야하는지 정리해보자.
Background 지식
Analyzer는 character filter, tokenizer, token filter 순서대로 적용한다. 기본적으로 anaylyzer는 indexing time과 search time에 적용된다. index time 분석 대상은 source data(원본 데이터)이고 search time 분석 대상은 query string이다. 그러므로 사전을 변경하는 것은 indexing, serching 두개 모두 영항을 준다.
사전 업데이트 방법
엘라스틱서치에서 analyzer는 index가 close/open될 때 사전을 읽는다. 그리고 일반적으로 로딩된 이후로는 다시 사전을 읽어 들이지 않는다. 그러므로 수정된 사전을 업데이트 하기 위해서는 dictionary file을 가지고 있는 node를 재시작하거나 index를 _close, _open해야한다.
예를들어 위메프라고 형태소를 나눴을 때, 위메프라는 명사를 알지 못해 다음과 같이 쪼개진다.
GET nori_sample/_analyze
{
"analyzer": "my_analyzer",
"text" : "위메프"
}
그럼 명사라는걸 알려주기 위해서 사전에 위메프를 추가해보자.
그리고 다시 검색을 해보자.
하지만 결과는 처음과 같다. 위에 말한 것 처럼 반영해주기 위해서는 node를 재시작하거나 index를 닫았다가 열어야한다.
그럼 index를 _close했다가 _open해보자.
POST nori_sample/_close
POST nori_sample/_open
그리고 결과를 다시 확인하면 잘 구분된걸 확인할 수 있다.
하지만 이 방식으로 사전 업데이트는 이미 인덱싱된 document에는 적용되지는 않는다. 왜냐하면 document는 사전이 업데이트 되기전에 analyzer를 사용해서 인뎅싱 되기 때문이다. 그래서 사전이 업데이트 되었다고해서 사전이 적용되어서 검색결과가 변경되어 나오지는 않는다.
그럼 어떻게 변경된 사전정보를 이미 존재하는 indices에 적용할 수 있을까?
엘라스틱서치에서는 인덱스된 document가 업데이트 되었을 때, document는 제거되고 다시 생성된다. 이때 우리가 업데이트한 사전정보를 이용해서 document가 다시 인덱싱된다. 그렇기 때문에 update by query api를 사용하여 인덱스에 모든 정보를 업데이트해야한다.
update by query 사용방법은 다음과 같다.
update by query 사용방법
https://www.elastic.co/guide/en/elasticsearch/reference/7.0/docs-update-by-query.html
출처 : https://www.elastic.co/kr/blog/dictionary-update-behavior-for-elasticsearch-cjk-language-analyzers
'데이터베이스 > Elasticsearch' 카테고리의 다른 글
Elasticsearch nori 형태소 분석기에서 readingform filter를 이용해서 한자 내용을 한글로 변환하기 (0) | 2019.06.18 |
---|---|
Elasticsearch 특정 형태소 종류를 제외하여 검색하는 필터 nori_part_of_speech 적용 (2) | 2019.06.18 |
[번역] Elasticsearch 퍼포먼스 튜닝 방법 - ebay (1) | 2019.06.12 |
Elasticsearch template를 일별 index 구성하기 (0) | 2019.06.12 |
Elasticsearch에서 reindex를 이용해서 매핑정보 변경하기 (0) | 2019.06.12 |