반응형
Recent Posts
Recent Comments
관리 메뉴

개발잡부

[es] 재현율 개선 본문

ElasticStack/Elasticsearch

[es] 재현율 개선

닉의네임 2023. 6. 20. 18:09
반응형

목표

QueryString 쿼리를 OR 검색조건으로 추가해서 재현율을 개선

작업방향

AS-IS

Query > bool > must > multi_match

에서

Query > bool >must > bool > should > bool > must > multi_match OR Query > bool > must > bool > should > bool > must > query_string

로 변경

쿼리 구조

 

추가 개선 작업

재현율은 올라갔으나 정밀도를 올려야 함

추가 작업

  1. tokenizer 테스트 : 검색결과의 노출기준을 term 의 매칭 수로 판단 정밀도를 올리기 위해 토근 분해의 디테일을 올린다.
  2. analyzer 테스트 : 1번테스트에서 유의미한 결과를 보이는 tokenizer 를 포함한 analyzer 를 세팅, 필드에 맵핑해준다.
  3. 최소매칭텀의 갯수를 조절
  4. sort 에 영향을 미치지 않게 할 경우 score 를 0으로 변경해주는 작업 필요

 

GET hyper-item/_search
{
  "query": {
    "match_phrase": {
      "itemNm": {
        "query": "비피더스 명장 요구르트",
          "analyzer": "index_analyzer",
          "slop": 3
      }
    }
  }
}

GET hyper-item/_search
{
  "query": {
    "match_phrase_prefix": {
      "itemNm": {
        "query": "비피더스 명장 요구르트",
          "analyzer": "index_analyzer",
          "slop": 3
      }
    }
  }
}

GET hyper-item/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "query": "비피더스 명장 요구르트",
            "fields": [
              "itemNm^1.0"
            ],
            "type": "best_fields",
            "default_operator": "OR",
            "minimum_should_match" : 2,
            "max_determinized_states": 10000,
            "enable_position_increments": true,
            "fuzziness": "AUTO",
            "fuzzy_prefix_length": 0,
            "fuzzy_max_expansions": 50,
            "phrase_slop": 0,
            "escape": false,
            "auto_generate_synonyms_phrase_query": true,
            "fuzzy_transpositions": true,
            "boost": 1
          }
        }
      ],
      "filter": [
        {
          "term": {
            "itemStoreInfo.storeId": "37"
          }
        }
      ]
    }
  }
}

GET hyper-item/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_bool_prefix": {
            "itemNm": {
              "query": "비피더스 명장 요구르트",
              "analyzer": "search_analyzer"
            }
          }
        }
      ],
      "filter": [
        {
          "term": {
            "itemStoreInfo.storeId": "37"
          }
        }
      ]
    }
  }
}
더보기
{
   "from":0,
   "size":20,
   "timeout":"60s",
   "query":{
      "bool":{
         "must":{
            "bool":{
               "should":[
                  {
                     "bool":{
                        "must":[
                           {
                              "function_score":{
                                 "query":{
                                    "multi_match":{
                                       "query":"비피더스 명장 요구르트",
                                       "fields":[
                                          "brandNmEng^1.0",
                                          "brandNmKor^1.0",
                                          "category.categorySearchKeyword^1.0",
                                          "category.dcateNm^1.0",
                                          "isbn^1.0",
                                          "itemNo^1.0",
                                          "itemOptionNms^1.0",
                                          "itemStoreInfo.eventInfo.eventKeyword^1.0",
                                          "promoKeyword^1.0",
                                          "searchItemNm^1.0",
                                          "searchKeyword^1.0"
                                       ],
                                       "type":"cross_fields",
                                       "operator":"AND",
                                       "slop":0,
                                       "prefix_length":0,
                                       "max_expansions":50,
                                       "zero_terms_query":"NONE",
                                       "auto_generate_synonyms_phrase_query":false,
                                       "fuzzy_transpositions":true,
                                       "boost":1.0
                                    }
                                 },
                                 "functions":[
                                    {
                                       "filter":{
                                          "match_all":{
                                             "boost":1.0
                                          }
                                       },
                                       "script_score":{
                                          "script":{
                                             "source":"similarity_boost_df",
                                             "lang":"boost_script",
                                             "params":{
                                                "field":[
                                                   "searchItemNm^10.0"
                                                ],
                                                "scorer":{
                                                   "WORD":1.0,
                                                   "UNIT":1.0,
                                                   "RELATEDNYM":0.6,
                                                   "HYPONYM":0.7,
                                                   "KOREAN":1.0,
                                                   "SYNONYM":0.8
                                                },
                                                "proximity_rank":{
                                                   "field":"itemNm",
                                                   "boost":0.1,
                                                   "position_gap":2
                                                },
                                                "tokens":[
                                                   {
                                                      "token":"비피더스 명장 요구르트",
                                                      "type":"KOREAN",
                                                      "startOffset":0.0,
                                                      "endOffset":3.0,
                                                      "position":0.0,
                                                      "positionLength":1.0,
                                                      "isGeneral":false,
                                                      "expansion":[
                                                         {
                                                            "token":"비피더스 명장 요구르트",
                                                            "type":"SYNONYM",
                                                            "startOffset":0.0,
                                                            "endOffset":3.0,
                                                            "position":1.0,
                                                            "positionLength":1.0,
                                                            "isGeneral":false,
                                                            "expansion":[
                                                               
                                                            ]
                                                         },
                                                         {
                                                            "token":"pulmuone",
                                                            "type":"SYNONYM",
                                                            "startOffset":0.0,
                                                            "endOffset":3.0,
                                                            "position":0.0,
                                                            "positionLength":1.0,
                                                            "isGeneral":false,
                                                            "expansion":[
                                                               
                                                            ]
                                                         }
                                                      ]
                                                   }
                                                ]
                                             }
                                          }
                                       }
                                    }
                                 ],
                                 "score_mode":"sum",
                                 "boost_mode":"replace",
                                 "max_boost":3.4028235E38,
                                 "boost":1.0
                              }
                           }
                        ]
                     }
                  },
                  {
                     "bool":{
                        "must":[
                           {
                              "query_string":{
                                 "query":"비피더스 명장 요구르트",
                                 "fields":[
                                    "itemNm^1.0"
                                 ],
                                 "type":"best_fields",
                                 "default_operator":"OR",
                                 "minimum_should_match":2,
                                 "max_determinized_states":10000,
                                 "enable_position_increments":true,
                                 "fuzziness":"AUTO",
                                 "fuzzy_prefix_length":0,
                                 "fuzzy_max_expansions":50,
                                 "phrase_slop":0,
                                 "escape":false,
                                 "auto_generate_synonyms_phrase_query":true,
                                 "fuzzy_transpositions":true,
                                 "boost":1
                              }
                           }
                        ]
                     }
                  }
               ]
            }
         },
         "filter":[
            {
               "range":{
                  "saleStartDt":{
                     "from":null,
                     "to":"now/m",
                     "include_lower":true,
                     "include_upper":true,
                     "boost":1.0
                  }
               }
            },
            {
               "range":{
                  "saleEndDt":{
                     "from":"now/m",
                     "to":null,
                     "include_lower":true,
                     "include_upper":true,
                     "boost":1.0
                  }
               }
            },
            {
               "multi_match":{
                  "query":"Y",
                  "fields":[
                     "docDispYn^1.0",
                     "rsvDocDispYn^1.0"
                  ],
                  "type":"best_fields",
                  "operator":"OR",
                  "slop":0,
                  "prefix_length":0,
                  "max_expansions":50,
                  "zero_terms_query":"NONE",
                  "auto_generate_synonyms_phrase_query":true,
                  "fuzzy_transpositions":true,
                  "boost":1.0
               }
            },
            {
               "bool":{
                  "should":[
                     {
                        "terms":{
                           "itemStoreInfo.storeId":[
                              "37",
                              "20163"
                           ],
                           "boost":1.0
                        }
                     },
                     {
                        "term":{
                           "shipMethod":{
                              "value":"TD_DLV",
                              "boost":1.0
                           }
                        }
                     },
                     {
                        "term":{
                           "storeType":{
                              "value":"DS",
                              "boost":1.0
                           }
                        }
                     }
                  ],
                  "adjust_pure_negative":true,
                  "boost":1.0
               }
            }
         ],
         "adjust_pure_negative":true,
         "boost":1.0
      }
   },
   "_source":{
      "includes":[
         "*"
      ],
      "excludes":[
         
      ]
   },
   "sort":[
      {
         "soldOutSort":{
            "order":"asc"
         }
      },
      {
         "_script":{
            "script":{
               "source":"if(doc['edlp.keyword'].size() > 0 && doc['edlp.keyword'].value == params['searchKeyword'] || (  doc['edlp.addKeyword'].size() > 0 && doc['edlp.addKeyword'].contains(params['searchKeyword']))) {return doc['edlp.ranking'].value; } else { return 100;}",
               "lang":"painless",
               "params":{
                  "searchKeyword":"비피더스 명장 요구르트"
               }
            },
            "type":"number",
            "order":"asc"
         }
      },
      {
         "adultSort":{
            "order":"asc"
         }
      },
      {
         "_score":{
            "order":"desc"
         }
      },
      {
         "itemStoreInfo.weight":{
            "order":"desc"
         }
      },
      {
         "itemStoreInfo.buyerCnt":{
            "order":"desc"
         }
      },
      {
         "itemNo":{
            "order":"desc"
         }
      }
   ]
}
반응형

'ElasticStack > Elasticsearch' 카테고리의 다른 글

[es] Regexp Query  (1) 2023.08.16
[es] collapse  (0) 2023.07.13
신조어 추천  (0) 2023.06.05
[es] min_score  (0) 2023.05.16
[es] N-gram tokenizer  (0) 2023.04.22
Comments