-
Search Query Test ( Elasticsearch v6.5.4)검색/ElasticSearch 2021. 8. 26. 14:41반응형
테스트 indices 생성
field 분석기 적용 title_std_std 색인 시점 : standard 검색 시점 : standard title_kor_std 색인 시점 : korean 검색 시점 : standard title_std_kor 색인 시점 : standard 검색 시점 : korean title_kor_kor 색인 시점 : korean 검색 시점 : korean title_ngram_std 색인 시점 : ngram 검색 시점 : standard PUT search_query_test/ { "mappings" : { "_doc" : { "dynamic": "strict", "properties" : { "title_std_std" : { "type" : "text", "analyzer": "standard" }, "title_kor_std" : { "type" : "text", "analyzer": "korean", "search_analyzer" : "standard" }, "title_std_kor" : { "type" : "text", "analyzer": "standard", "search_analyzer" : "korean" }, "title_kor_kor" : { "type" : "text", "analyzer": "korean" }, "title_ngram_std" : { "type" : "text", "analyzer": "ngram", "search_analyzer" : "standard" } } } }, "settings": { "index": { "number_of_shards": "3", "max_ngram_diff" : "8", "analysis": { "filter": { "synonym": { "type": "synonym", "synonyms_path": "synonyms.txt", "updateable": "true" } }, "analyzer": { "korean" : { "filter" : [ "lowercase", "synonym" ], "type" : "custom", "tokenizer" : "korean_default_tokenizer" }, "ngram": { "filter": [ "lowercase", "synonym" ], "type": "custom", "tokenizer": "ngram" }, "standard": { "filter" : [ "lowercase" ], "tokenizer": "whitespace" } }, "tokenizer": { "ngram": { "type": "ngram", "min_gram": 2, "max_gram": 10, "token_chars": [ "letter", "digit" ] }, "korean_default_tokenizer" : { "type" : "nori_tokenizer", "user_dictionary" : "userdict_ko.txt", "decompound_mode" : "mixed" } } }, "number_of_replicas": "1" } } }
데이터 삽입
PUT search_query_test/_doc/1 { "title_std_std" : "어떤 과자를 즐겨 먹느냐는 것만 보고도 그 사람의 성격이 드러난다고 한다.", "title_kor_std" : "어떤 과자를 즐겨 먹느냐는 것만 보고도 그 사람의 성격이 드러난다고 한다.", "title_std_kor" : "어떤 과자를 즐겨 먹느냐는 것만 보고도 그 사람의 성격이 드러난다고 한다.", "title_kor_kor" : "어떤 과자를 즐겨 먹느냐는 것만 보고도 그 사람의 성격이 드러난다고 한다.", "title_ngram_std" : "어떤 과자를 즐겨 먹느냐는 것만 보고도 그 사람의 성격이 드러난다고 한다." } PUT search_query_test/_doc/2 { "title_std_std" : "미국 ‘후각 및 미각 치료조사협회’의 앨런허쉬의 박사가 8년에 걸쳐 8백 명의 실험 참가자들을 대상으로 음식 선택과 인격간의 관계에 대한 연구 결과이다.", "title_kor_std" : "미국 ‘후각 및 미각 치료조사협회’의 앨런허쉬의 박사가 8년에 걸쳐 8백 명의 실험 참가자들을 대상으로 음식 선택과 인격간의 관계에 대한 연구 결과이다.", "title_std_kor" : "미국 ‘후각 및 미각 치료조사협회’의 앨런허쉬의 박사가 8년에 걸쳐 8백 명의 실험 참가자들을 대상으로 음식 선택과 인격간의 관계에 대한 연구 결과이다.", "title_kor_kor" : "미국 ‘후각 및 미각 치료조사협회’의 앨런허쉬의 박사가 8년에 걸쳐 8백 명의 실험 참가자들을 대상으로 음식 선택과 인격간의 관계에 대한 연구 결과이다.", "title_ngram_std" : "미국 ‘후각 및 미각 치료조사협회’의 앨런허쉬의 박사가 8년에 걸쳐 8백 명의 실험 참가자들을 대상으로 음식 선택과 인격간의 관계에 대한 연구 결과이다." } PUT search_query_test/_doc/3 { "title_std_std" : "육류가 들어간 과자를 즐기는 사람은 연인이나 친구 등 좋아하는 사람이 있으면 무엇이든 베풀기 좋아하고, 항상 사람들이곁에 바글바글하는 인기인. 하지만 손익계산이 부족하고 남을지나치게 믿기 때문에, 다른 사람이 자신을 실망시키면 고통스러워한다.", "title_kor_std" : "육류가 들어간 과자를 즐기는 사람은 연인이나 친구 등 좋아하는 사람이 있으면 무엇이든 베풀기 좋아하고, 항상 사람들이곁에 바글바글하는 인기인. 하지만 손익계산이 부족하고 남을지나치게 믿기 때문에, 다른 사람이 자신을 실망시키면 고통스러워한다.", "title_std_kor" : "육류가 들어간 과자를 즐기는 사람은 연인이나 친구 등 좋아하는 사람이 있으면 무엇이든 베풀기 좋아하고, 항상 사람들이곁에 바글바글하는 인기인. 하지만 손익계산이 부족하고 남을지나치게 믿기 때문에, 다른 사람이 자신을 실망시키면 고통스러워한다.", "title_kor_kor" : "육류가 들어간 과자를 즐기는 사람은 연인이나 친구 등 좋아하는 사람이 있으면 무엇이든 베풀기 좋아하고, 항상 사람들이곁에 바글바글하는 인기인. 하지만 손익계산이 부족하고 남을지나치게 믿기 때문에, 다른 사람이 자신을 실망시키면 고통스러워한다.", "title_ngram_std" : "육류가 들어간 과자를 즐기는 사람은 연인이나 친구 등 좋아하는 사람이 있으면 무엇이든 베풀기 좋아하고, 항상 사람들이곁에 바글바글하는 인기인. 하지만 손익계산이 부족하고 남을지나치게 믿기 때문에, 다른 사람이 자신을 실망시키면 고통스러워한다." } PUT search_query_test/_doc/4 { "title_std_std" : "짭짤한 과자를 좋아하는 사람은 늘 정력이 넘치고 새로운 도전거리를 찾아 눈을 굴린다. 새로운 일에 대한 집착이 너무 커서때로는 당장 해야할 일을 외면하기도. 또 쉽게 싫증을 느끼는편이며, 본능에 따라 결정을 내리곤 한다.", "title_kor_std" : "짭짤한 과자를 좋아하는 사람은 늘 정력이 넘치고 새로운 도전거리를 찾아 눈을 굴린다. 새로운 일에 대한 집착이 너무 커서때로는 당장 해야할 일을 외면하기도. 또 쉽게 싫증을 느끼는편이며, 본능에 따라 결정을 내리곤 한다.", "title_std_kor" : "짭짤한 과자를 좋아하는 사람은 늘 정력이 넘치고 새로운 도전거리를 찾아 눈을 굴린다. 새로운 일에 대한 집착이 너무 커서때로는 당장 해야할 일을 외면하기도. 또 쉽게 싫증을 느끼는편이며, 본능에 따라 결정을 내리곤 한다.", "title_kor_kor" : "짭짤한 과자를 좋아하는 사람은 늘 정력이 넘치고 새로운 도전거리를 찾아 눈을 굴린다. 새로운 일에 대한 집착이 너무 커서때로는 당장 해야할 일을 외면하기도. 또 쉽게 싫증을 느끼는편이며, 본능에 따라 결정을 내리곤 한다.", "title_ngram_std" : "짭짤한 과자를 좋아하는 사람은 늘 정력이 넘치고 새로운 도전거리를 찾아 눈을 굴린다. 새로운 일에 대한 집착이 너무 커서때로는 당장 해야할 일을 외면하기도. 또 쉽게 싫증을 느끼는편이며, 본능에 따라 결정을 내리곤 한다." } PUT search_query_test/_doc/5 { "title_std_std" : "크래커를 즐기는 사람은 머리가 가슴을 지배하는 사람. 논리적이 아니라고 판단하는 일에는 절대 눈길도 주지 않는다. 부끄러움을 타는 성향이 있으면서도, 커다란 프로젝트와 정말로 좋아하는 일 사이에서 오도가도 못하는 타입. 남과 대적하기를싫어하고 대부분 다른 사람들에게 친절하고 호의적이다.", "title_kor_std" : "크래커를 즐기는 사람은 머리가 가슴을 지배하는 사람. 논리적이 아니라고 판단하는 일에는 절대 눈길도 주지 않는다. 부끄러움을 타는 성향이 있으면서도, 커다란 프로젝트와 정말로 좋아하는 일 사이에서 오도가도 못하는 타입. 남과 대적하기를싫어하고 대부분 다른 사람들에게 친절하고 호의적이다.", "title_std_kor" : "크래커를 즐기는 사람은 머리가 가슴을 지배하는 사람. 논리적이 아니라고 판단하는 일에는 절대 눈길도 주지 않는다. 부끄러움을 타는 성향이 있으면서도, 커다란 프로젝트와 정말로 좋아하는 일 사이에서 오도가도 못하는 타입. 남과 대적하기를싫어하고 대부분 다른 사람들에게 친절하고 호의적이다.", "title_kor_kor" : "크래커를 즐기는 사람은 머리가 가슴을 지배하는 사람. 논리적이 아니라고 판단하는 일에는 절대 눈길도 주지 않는다. 부끄러움을 타는 성향이 있으면서도, 커다란 프로젝트와 정말로 좋아하는 일 사이에서 오도가도 못하는 타입. 남과 대적하기를싫어하고 대부분 다른 사람들에게 친절하고 호의적이다.", "title_ngram_std" : "크래커를 즐기는 사람은 머리가 가슴을 지배하는 사람. 논리적이 아니라고 판단하는 일에는 절대 눈길도 주지 않는다. 부끄러움을 타는 성향이 있으면서도, 커다란 프로젝트와 정말로 좋아하는 일 사이에서 오도가도 못하는 타입. 남과 대적하기를싫어하고 대부분 다른 사람들에게 친절하고 호의적이다." } PUT search_query_test/_doc/6 { "title_std_std" : "매콤달콤한 멕시코 풍의 과자를 좋아하는 사람은 높은 이상을 품고 있는 완벽주의자. 약간은 강박관념을 가지고 있어, 만족할 때까지는 무슨 일이든 몇 번이고 다시 하고 또 다시 한다. 또 그런 성격을 남에게까지 전가시키는 습성이 있어서, 친구들이나 사랑하는 사람들 역시 자신만큼 엄격하게 대한다.", "title_kor_std" : "매콤달콤한 멕시코 풍의 과자를 좋아하는 사람은 높은 이상을 품고 있는 완벽주의자. 약간은 강박관념을 가지고 있어, 만족할 때까지는 무슨 일이든 몇 번이고 다시 하고 또 다시 한다. 또 그런 성격을 남에게까지 전가시키는 습성이 있어서, 친구들이나 사랑하는 사람들 역시 자신만큼 엄격하게 대한다.", "title_std_kor" : "매콤달콤한 멕시코 풍의 과자를 좋아하는 사람은 높은 이상을 품고 있는 완벽주의자. 약간은 강박관념을 가지고 있어, 만족할 때까지는 무슨 일이든 몇 번이고 다시 하고 또 다시 한다. 또 그런 성격을 남에게까지 전가시키는 습성이 있어서, 친구들이나 사랑하는 사람들 역시 자신만큼 엄격하게 대한다.", "title_kor_kor" : "매콤달콤한 멕시코 풍의 과자를 좋아하는 사람은 높은 이상을 품고 있는 완벽주의자. 약간은 강박관념을 가지고 있어, 만족할 때까지는 무슨 일이든 몇 번이고 다시 하고 또 다시 한다. 또 그런 성격을 남에게까지 전가시키는 습성이 있어서, 친구들이나 사랑하는 사람들 역시 자신만큼 엄격하게 대한다.", "title_ngram_std" : "매콤달콤한 멕시코 풍의 과자를 좋아하는 사람은 높은 이상을 품고 있는 완벽주의자. 약간은 강박관념을 가지고 있어, 만족할 때까지는 무슨 일이든 몇 번이고 다시 하고 또 다시 한다. 또 그런 성격을 남에게까지 전가시키는 습성이 있어서, 친구들이나 사랑하는 사람들 역시 자신만큼 엄격하게 대한다." } PUT search_query_test/_doc/7 { "title_std_std" : "치즈가 많이 들어간 과자를 즐기는 사람들은 가족이나 친구, 연인의 기대를 한 몸에 받는다. 대부분 어떤 문제가 터지면 이 사람에게 조언을 구하는 경우가 많다. 못난 사람 잘난 사람 할것 없이 누구나 항상 공평하게 대하는 사람.", "title_kor_std" : "치즈가 많이 들어간 과자를 즐기는 사람들은 가족이나 친구, 연인의 기대를 한 몸에 받는다. 대부분 어떤 문제가 터지면 이 사람에게 조언을 구하는 경우가 많다. 못난 사람 잘난 사람 할것 없이 누구나 항상 공평하게 대하는 사람.", "title_std_kor" : "치즈가 많이 들어간 과자를 즐기는 사람들은 가족이나 친구, 연인의 기대를 한 몸에 받는다. 대부분 어떤 문제가 터지면 이 사람에게 조언을 구하는 경우가 많다. 못난 사람 잘난 사람 할것 없이 누구나 항상 공평하게 대하는 사람.", "title_kor_kor" : "치즈가 많이 들어간 과자를 즐기는 사람들은 가족이나 친구, 연인의 기대를 한 몸에 받는다. 대부분 어떤 문제가 터지면 이 사람에게 조언을 구하는 경우가 많다. 못난 사람 잘난 사람 할것 없이 누구나 항상 공평하게 대하는 사람.", "title_ngram_std" : "치즈가 많이 들어간 과자를 즐기는 사람들은 가족이나 친구, 연인의 기대를 한 몸에 받는다. 대부분 어떤 문제가 터지면 이 사람에게 조언을 구하는 경우가 많다. 못난 사람 잘난 사람 할것 없이 누구나 항상 공평하게 대하는 사람." } PUT search_query_test/_doc/8 { "title_std_std" : "그의 연구 결과에 따르면, 감자칩을 선호하는 사람들은 은연중에 이 세상에 족적을 남기겠다고 결심한 사람이다. 집에서든 직장에서든 꿈을 실현시키기 위해 최선을 다하고 실제로 그렇게 한다. 하지만 조금은 말투가 거만해서 거의 매일 자잘한 시비에 시달린다.", "title_kor_std" : "그의 연구 결과에 따르면, 감자칩을 선호하는 사람들은 은연중에 이 세상에 족적을 남기겠다고 결심한 사람이다. 집에서든 직장에서든 꿈을 실현시키기 위해 최선을 다하고 실제로 그렇게 한다. 하지만 조금은 말투가 거만해서 거의 매일 자잘한 시비에 시달린다.", "title_std_kor" : "그의 연구 결과에 따르면, 감자칩을 선호하는 사람들은 은연중에 이 세상에 족적을 남기겠다고 결심한 사람이다. 집에서든 직장에서든 꿈을 실현시키기 위해 최선을 다하고 실제로 그렇게 한다. 하지만 조금은 말투가 거만해서 거의 매일 자잘한 시비에 시달린다.", "title_kor_kor" : "그의 연구 결과에 따르면, 감자칩을 선호하는 사람들은 은연중에 이 세상에 족적을 남기겠다고 결심한 사람이다. 집에서든 직장에서든 꿈을 실현시키기 위해 최선을 다하고 실제로 그렇게 한다. 하지만 조금은 말투가 거만해서 거의 매일 자잘한 시비에 시달린다.", "title_ngram_std" : "그의 연구 결과에 따르면, 감자칩을 선호하는 사람들은 은연중에 이 세상에 족적을 남기겠다고 결심한 사람이다. 집에서든 직장에서든 꿈을 실현시키기 위해 최선을 다하고 실제로 그렇게 한다. 하지만 조금은 말투가 거만해서 거의 매일 자잘한 시비에 시달린다." }
들어가기
- Precision(정밀도)
- 모델이 True라고 분류한 것 중에서 실제 True인 것의 비율입니다.
- Recall(재현율)
- 실제 True인 것 중에서 모델이 True라고 예측한 것의 비율입니다.
예를 들어 한달 30일 동안 맑은 날이 20일이었는데, 확실한 2일만 맑다고 예측한다면, 당연히 맑다고 한 날 중에 실제 맑은 날(Precision)은 100%가 나오게 됩니다. 하지만 과연, 이러한 모델이 이상적인 모델일까요?
따라서, 우리는 실제 맑은 20일 중에서 예측한 맑은 날의 수도 고려해 보아야합니다. 이 경우에는 Precision만큼 높은 결과가 나오지 않습니다. Precision과 함께 Recall을 함께 고려하면 실제 맑은 날들(즉, 분류의 대상이 되는 정의역, 실제 data)의 입장에서 우리의 모델이 맑다고 예측한 비율을 함께 고려하게 되어 제대로 평가할 수 있습니다. Precision과 Recall은 상호보완적으로 사용할 수 있으며, 두 지표가 모두 높을 수록 좋은 모델입니다.
(pdf: p128, Precision and Recall : https://sumniya.tistory.com/26)- 정밀도와 재현율을 높이기 위해서는 쿼리와 옵션을 적절히 사용해야 합니다.
색인 데이터 살펴보기
- Termvector를 조회하는 다양한 옵션들이 있는데 이 정보를 이용하면 문서간의 유사도를 공식으로 계산 할 수 있다고 합니다.
- 여기서는 문서가 어떻게 색인 되어있는지 확인하는 용도로 사용했습니다.
GET /search_query_test/_doc/1/_termvectors { "fields" : ["title_std_std"], "offsets" : true, "payloads" : true, "positions" : true, "term_statistics" : true, "field_statistics" : true } GET /search_query_test/_doc/1/_termvectors { "fields" : ["title_kor_std"], "offsets" : true, "payloads" : true, "positions" : true, "term_statistics" : true, "field_statistics" : true } GET /search_query_test/_doc/1/_termvectors { "fields" : ["title_std_kor"], "offsets" : true, "payloads" : true, "positions" : true, "term_statistics" : true, "field_statistics" : true } GET /search_query_test/_doc/1/_termvectors { "fields" : ["title_kor_kor"], "offsets" : true, "payloads" : true, "positions" : true, "term_statistics" : true, "field_statistics" : true } GET /search_query_test/_doc/1/_termvectors { "fields" : ["title_ngram_std"], "offsets" : true, "payloads" : true, "positions" : true, "term_statistics" : true, "field_statistics" : true }
검색 테스트
1. The match Query
- 역색인된 token 들 중에서 일치하는 값이 있는지 찾는다.
- term query와 차이점은 검색하는 키워드를 analyze 한다는 것이다.
- match query는 기본적으로 or 로직을 사용한다.
title_std_std 경우는 “미국의 or 후각 or 치료사 or 협회” 로 검색한다.
GET search_query_test/_search { "query": { "match": { "title_std_std": "미국의 후각 치료사 협회" } }, "_source":"title_std_std" } GET search_query_test/_search { "query": { "match": { "title_kor_std": "미국의 후각 치료사 협회" } }, "_source":"title_kor_std" } GET search_query_test/_search { "query": { "match": { "title_std_kor": "미국의 후각 치료사 협회" } }, "_source":"title_std_kor" } GET search_query_test/_search { "query": { "match": { "title_kor_kor": "미국의 후각 치료사 협회" } }, "_source":"title_kor_kor" } GET search_query_test/_search { "query": { "match": { "title_ngram_std": "미국의 후각 치료사 협회" } }, "_source":"title_ngram_std" }
2. The match Query with Operator
- 좀 더 엄격한 결과를 얻고 싶다면 operator : and 옵션을 추가한다.
GET search_query_test/_search { "query": { "match": { "title_std_std" : { "query": "미국 박사", "operator" : "and" } } }, "_source":"title_std_std" } GET search_query_test/_search { "query": { "match": { "title_kor_std" : { "query": "미국 치료 협회", "operator" : "and" } } }, "_source":"title_kor_std" } GET search_query_test/_search { "query": { "match": { "title_std_kor": { "query": "미국 선택과", "operator" : "and" } } }, "_source":"title_std_kor" } GET search_query_test/_search { "query": { "match": { "title_kor_kor": { "query": "미국 치료 협회'", "operator" : "and" } } }, "_source":"title_kor_kor" } GET search_query_test/_search { "query": { "match": { "title_ngram_std": { "query": "미국 치료 협회", "operator" : "and" } } }, "_source":"title_ngram_std" }
3. The match Query with Minimum_should_match
- minimum_should_match 에 정의한 수 만큼만 term이 매치 되면 결과로 나온다.
GET search_query_test/_search { "query": { "match": { "title_std_std": { "query": "미국 작전 협회", "minimum_should_match": 2 } } }, "_source":"title_std_std" } GET search_query_test/_search { "query": { "match": { "title_kor_std" : { "query": "미국 작전 협회", "minimum_should_match": 2 } } }, "_source":"title_kor_std" } GET search_query_test/_search { "query": { "match": { "title_std_kor": { "query": "실험한 음식의 연구결과이다.", "minimum_should_match": 2 } } }, "_source":"title_std_kor" } GET search_query_test/_search { "query": { "match": { "title_kor_kor": { "query": "참가한 사람의 관계도를 그려보자", "minimum_should_match": 3 } } }, "_source":"title_kor_kor" } GET search_query_test/_search { "query": { "match": { "title_ngram_std": { "query": "실험 대상", "minimum_should_match": 1 } } }, "_source":"title_ngram_std" }
4. match_phrase
- 키워드를 analyze 하는 것은 match와 동일하다.
- 다른 점은, 검색 키워드에 입력한 term이 문서에 모두 존재해야하며,
검색 키워드 순서가 문서 내에서도 지켜져야 한다는 것이다.
GET search_query_test/_search { "query": { "match_phrase": { "title_std_std": "즐기는 사람은" } }, "_source":"title_std_std" } GET search_query_test/_search { "query": { "match_phrase": { "title_kor_std": "즐기는 사람은" } }, "_source":"title_kor_std" } GET search_query_test/_search { "query": { "match_phrase": { "title_std_kor": "즐기는 사람은" } }, "_source":"title_std_kor" } GET search_query_test/_search { "query": { "match_phrase": { "title_kor_kor": "즐기는 사람은" } }, "_source":"title_kor_kor" } #ㅋㅋ GET search_query_test/_search { "query": { "match_phrase": { "title_ngram_std": "즐기는 사람은" } }, "_source":"title_ngram_std" }
5. match_phrase with slop
- slop 옵션을 사용하면 검색 키워드와 매칭되는 문서 사이에 slop size만큼의 term을 허용 할 수 있다.
GET search_query_test/_search { "query": { "match_phrase": { "title_std_std": { "query": "과자 사람", "slop": 2 } } }, "_source":"title_std_std" } GET search_query_test/_search { "query": { "match_phrase": { "title_kor_std" : { "query": "과자 사람", "slop": 3 } } }, "_source":"title_kor_std" } GET search_query_test/_search { "query": { "match_phrase": { "title_std_kor": { "query": "과자 사람", "slop": 2 } } }, "_source":"title_std_kor" } GET search_query_test/_search { "query": { "match_phrase": { "title_kor_kor": { "query": "과자 사람", "slop": 3 } } }, "_source":"title_kor_kor" } GET search_query_test/_search { "query": { "match_phrase": { "title_ngram_std": { "query": "과자 사람", "slop": 6 } } }, "_source":"title_ngram_std" }
반응형'검색 > ElasticSearch' 카테고리의 다른 글
부트스트랩 체크 (0) 2021.08.26 kibana 접속 안될때 (read-only 전환된 상태) (0) 2021.08.26 동의어 등록 테스트 ( nori / Elasticsearch v6.5.4) (0) 2021.08.26 동의어 사전 다중 등록 테스트 (Elasticsearch v6.5.4) (0) 2021.08.26 운영 중인 엘라스틱서치 순차적 재시작 ( Rolling-Restart ) (0) 2021.08.26 - Precision(정밀도)