본문 바로가기

Elastic Search

[Elastic Search]Query 스터디-2편 Term 쿼리, Multi-match 쿼리

반응형

용어 쿼리

용어 쿼리는 완벽하게 매칭되는 단어 혹은 문구를 가져온다. 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*"
        ]
    }
  }
}

 

반응형