Elastic Search

[Elastic Search]Query ์Šคํ„ฐ๋””-2ํŽธ Term ์ฟผ๋ฆฌ, Multi-match ์ฟผ๋ฆฌ

Tempo 2022. 1. 29. 12:58

์šฉ์–ด ์ฟผ๋ฆฌ

์šฉ์–ด ์ฟผ๋ฆฌ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ๋งค์นญ๋˜๋Š” ๋‹จ์–ด ํ˜น์€ ๋ฌธ๊ตฌ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. match ์ฟผ๋ฆฌ์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฌธ์žฅ์— ๋Œ€ํ•œ full-text-match ๊ฒ€์ƒ‰์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์žฅ ์ „์ฒด๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

๊ธฐ์กด review ์ธ๋ฑ์Šค์—์„œ review ๋ฐ์ดํ„ฐ๊ฐ€ text ํƒ€์ž…์œผ๋กœ ๋˜์–ด ์žˆ์–ด term ์ฟผ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ƒˆ๋กญ๊ฒŒ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

"mappings": {
    "properties": {
        "prd_id": {
            "type": "text"
        },
        "review_id": {
            "type": "text"
        },
        "review": {
            "type": "text",
            "fields": {
                "full": {
                    "type": "keyword"
                },
// nori ํ•„ํ„ฐ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‹คํŒจํ•˜์˜€๋‹ค.. ๋‹ค์Œ์— ๋‹ค์‹œ!
                "nori_mixed": {
                    "type": "text",
                    "analyzer": "nori_analyzer",
                    "search_analyzer": "standard"
                }
            }
        },
        "genders": {
            "type": "rank_features"
        }
    }
}

์ด๋ฒˆ ์ธ๋ฑ์Šค์—์„œ๋Š” review ํ•˜์œ„์— fields ๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  keyword ํƒ€์ž…์œผ๋กœ ํ•„๋“œ ์ƒ์„ธ ๋‚ด์šฉ์„ ์ •์˜ํ•˜์˜€๋‹ค.

Elastic search ๊ณต์‹ ๋ฌธ์„œ - https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

Term ์ฟผ๋ฆฌ ์˜ˆ์‹œ

GET review_nlp/_search
{
  "query":{
    "term": {
      "review.keyword": {
        "value": "๋งจํˆฌ๋งจ ๋ญ์‚ด์ง€ ๊ณ ๋ฏผํ•˜์‹ ๋‹ค๋ฉด ์ด ๋งจํˆฌ๋งจ ์ถ”์ฒœ๋“œ๋ ค์š”" 
      }
    }
  }
}

์—ฌ๋Ÿฌ ํ•„๋“œ์— ์ฟผ๋ฆฌ ์š”์ฒญํ•˜๊ธฐ

๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์šฉ์–ด๋‚˜ ๊ตฌ์ ˆ์ด ์ •ํ™•ํžˆ ์–ด๋–ค ํ•„๋“œ์— ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์ธ๋ฑ์Šค ๊ตฌ์„ฑ

"properties": {
        "prd_id": {
            "type": "text"
        },
        "title": {
            "type": "text"
        },
        "url": {
            "type": "text"
        },
        "brand": {
            "type": "text"
        },
        "hashtag": {
            "type": "text"
        },
        "category1": {
            "type": "text"
        },
        "category2": {
            "type": "text"
        }
    }

์ฟผ๋ฆฌ ๊ฒ€์ƒ‰

GET product/_search
{
  "query": {
    "multi_match": {
      "query": "๋งจํˆฌ๋งจ",
      "fields": [
        "title",
        "hashtag"
        ]
    }
  }
}

์ œ๋ชฉ ๋ฐ ํ•ด์‹œํƒœ๊ทธ ํ•„๋“œ์— ๊ด€๋ จ ํ‚ค์›Œ๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

์›๋ฆฌ๋Š” โ€œ๋งจํˆฌ๋งจโ€์ด๋ผ๋Š” ์šฉ์–ด๋ฅผ ๋งค์น˜ ์ฟผ๋ฆฌ๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ฐ ํ•„๋“œ๋ณ„ ์Šค์ฝ”์–ด๋ฅผ ๊ตฌํ•˜๊ณ  ๊ทธ์ค‘ ๊ฐ€์žฅ ํฐ ๊ฐ’์„ ๋Œ€ํ‘œ ์Šค์ฝ”์–ด๋กœ ๊ณ„์‚ฐํ•œ๋‹ค.

๋˜ํ•œ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ•„๋“œ์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

// category1, category2์— ๋Œ€ํ•ด ๊ฒ€์ƒ‰
GET product/_search
{
  "query": {
    "multi_match": {
      "query": "๋งจํˆฌ๋งจ",
      "fields": [
        "category*"
        ]
    }
  }
}

 

๋ฐ˜์‘ํ˜•