Analyzer 적용했을 때, term query 관련 질문드립니다


(Yungyoung Ok) #1

안녕하세요. 현재 엘라스틱서치에 은전한닢 플러그인을 적용해서 사용하려고 테스트해보고 있습니다.
엘라스틱서치5.1.1 버전에 한글 형태소 분석기 seunjeon을 설치했고, template 구조는 아래와 같습니다.

PUT _template/news_template
{
"template": "news*",
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1,
"index":{
"analysis":{
"analyzer":{
"eunjeon":{
"type":"custom",
"tokenizer":"seunjeon_default_tokenizer",
"filter": ["lowercase","synonym","stopwords"]
}
},
"tokenizer": {
"seunjeon_default_tokenizer": {
"type": "seunjeon_tokenizer",
"index_eojeol": false,
"user_dict_path":"user_dic.txt",
"index_poses": ["N"],
"decompound": false
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "synonyms.txt"
},
"stopwords":{
"type": "stop",
"stopwords_path": "stopwords.txt"
}
}
}
}
},
"mappings": {
"default": {
"_source": {
"enabled": true
},
"_all": {
"enabled": false
},
"properties": {
"title": {
"type": "text",
"analyzer": "eunjeon",
"search_analyzer": "eunjeon"
},
"contents": {
"type": "text",
"analyzer": "eunjeon",
"search_analyzer": "eunjeon"
},
"crawl_datetime":{
"type":"date",
"format": "yyyy-MM-dd HH:mm:ss"
},
"url":{
"type":"text"
},
"@timestamp":{
"type":"date",
"format":"yyyy-MM-dd'T'HH:mm:ss.SSSZ"
},
"publisher":{
"type":"text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}

이 상태에서 데이터를 넣고 term query를 날리면 검색결과가 하나도 안나오는데요.
예를 들어 제가 seunjeon에 삼성전자를 NNP로 등록해놓은 상태에서 term query로 삼성전자를 찾으면 total이 0건이 나옵니다.
GET news-*/_search
{
"query":{
"term":{
"contents":"삼성전자"
}
}
}

제가 공부하기로는 analyzer를 설정하면 엔드포인트를 _analyzer로 쿼리를 날렸을 때 역색인을 해서 결과를 보여주는거고,
search_analyzer는 엔드포인트를 _search로 날렸을 때 analyzer를 적용해서 역색인 한 후 결과를 반환해주는 걸로 알고있습니다.
그래서 term query를 날렸을 때는 제가 설정한 analyzer가 적용안되고, 문서에 '삼성전자'라는 텍스트가 있으면 무조건 검색에 걸리는 걸로 알고있는데요. 아닌가요?
match query로 삼성전자를 검색하면 결과가 잘 나옵니다.
설정이 잘못되었다면 어디가 잘못되었는지, 아니면 맞는 결과라면 왜 맞는지 설명해주실 수 있나요???

추가로 현재 5.4.0에서는 은전한닢으로 테스트 중인데, 또 여기서는 똑같이 analyzer, search_analyzer를 설정해도 term query로 삼성전자를 검색했을 때 결과가 잘 나옵니다.
analyzer, search_analyzer를 적용했을 때 어떤게 맞는건가요?


(Jong Min Kim) #2

질문이 명확하게 이해가 되질 않는데요
우선 analyzer 는 데이터 색인 시 색인하는 분석기를 지정하는 것이고
search_analyzer 는 검색 시 검색문을 분석하는 분석기를 지정하는 것입니다.

예를 들어 search_analyzer 를 ngram 으로 하고 "삼성전자" 를 검색하면
, 삼성, 삼성전, 삼성전자
4개를 검색한 것으로 됩니다.


(system) #3

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.