Elasticsearch search queries

4 분 소요

Elasticsearch에서 특정 키워드로 검색할 때 조건에 따라 적절한 방법을 사용해야합니다. 아래에서 검색할 때 대표적으로 많이 사용되는 term, match, match_phrase, string_query을 설명하겠습니다.

term

term은 온전한 단어를 검색할 때 가장 많이 사용하는 방법입니다. 검색하는 단어 앞뒤로 다른 글자가 없는 document를 검색합니다.

아래 간단한 문장을 검색어 예시로 들어 설명하겠습니다.

{
    "content": "엘라스틱서치로 키워드 검색하기"
}

검색어 예시


위와 같은 문장이 있을 때, 아래와 같이 키워드를 검색하면 해당 document를 검색할 수 있습니다.

{
    "query": {
        "term": {
            "content": "키워드"
        }
    }
}

하지만 엘라스틱서치검색과 같이 단어가 온전히 있지 않은 경우에는 검색이 되지 않습니다. term은 검색어에 대한 분석을 거치지 않기 때문에 tokenizing 과정이 없기 때문입니다.

match

matchterm와 달리 유사한 문서를 검색할 때 많이 사용하는 방법입니다. tokenizer를 통해 분석된 단어가 하나라도 포함된 document를 검색합니다.

동일한 검색어 예시를 들어 설명하겠습니다.

{
    "content": "엘라스틱서치로 키워드 검색하기"
}

검색어 예시


한국어에서의 분석은 주로 형태소분석을 의미합니다. 일반적으로 Elasticsearch에서는 Nori를 사용하는데요. Nori를 통해 tokenizing을 하면 아래와 같은 결과를 얻을 수 있습니다.

[
    {
      "token" : "엘라스틱",
      "start_offset" : 0,
      "end_offset" : 4,
      "type" : "word",
      "position" : 0
    },
    {
      "token" : "서치",
      "start_offset" : 4,
      "end_offset" : 6,
      "type" : "word",
      "position" : 1
    },
    ...
]


때문에 아래와 같이 엘라스틱으로 검색해도 document를 검색할 수 있게 됩니다.

{
    "query": {
        "match": {
            "content": "엘라스틱"
        }
    }
}


또한 match로 검색할 때는 score가 계산되기 때문에 가장 일치하는 document를 우선순위로 검색할 수 있습니다. 위 예시 검색어를 기준으로 아래와 같이 단어를 추가할 경우 더 높은 score를 낼 수 있습니다.

{
    "query": {
        "match": {
            "content": "엘라스틱 키워드"
        }
    }
}

match_phrase

match_phrase는 띄어쓰기가 포함된 문장을 검색할 때 사용하는 방법입니다. match는 띄어쓰기를 넣어서 검색하면 단어의 순서와 상관없이 하나만 포함되도 검색이 되는데, 공백이 포함된 정확한 단어를 검색하고 싶을 경우 match_phrase를 사용해야합니다.

아래 간단한 문장을 검색어 예시로 들어 설명하겠습니다.

{
    "content": "아이스 라떼랑 따뜻한 아메리카노 주세요."
}

검색어 예시


{
    "query": {
        "match": {
            "content": "아이스 아메리카노"
        }
    }
}

위의 검색어 예시를 match를 이용해서 검색할 경우 해당 document가 검색되는 문제가 있습니다. 위 검색어 예시는 아이스 아메리카노가 검색되지 않아야하는데요. match는 문장 내 단어의 위치나 순서와 상관없이 검색하기 때문에 document가 검색되는 문제가 발생합니다.

이러한 문제를 해결할 때 match_phrase를 사용합니다.

{
    "query": {
        "match_phrase": {
            "content": "아이스 아메리카노"
        }
    }
}

검색되지 않는 예시


{
    "query": {
        "match_phrase": {
            "content": "따뜻한 아메리카노"
        }
    }
}

검색되는 예시

query_string

query_string은 tokenizing되지 않는 단어까지 포함해서 검색할 때 사용하는 방법입니다.

match에서는 검색되려면 단어가 반드시 tokenizing되어야하는 단점이 있습니다. query_string을 사용하면 tokenizing되지 않은 단어까지 검색할 수 있는데, 방법이 MySQL의 like와 비슷합니다.

아래 간단한 문장을 검색어 예시로 들어 설명하겠습니다.

{
    "content": "카페라떼너무좋아"
}

검색어 예시

위와 같은 문장이 있을 때, 아래와 같이 query_string을 사용하면 tokenizing되지 않는 단어도 검색이 가능합니다.

{
    "query": {
        "query_string": {
            "fields": ["content"],
            "query": "*라떼*"
        }
    }
}


정리

termmatch, match_phrase, query_string은 상황에 따라 각각 검색되는 document가 다르고 검색 속도 차이가 있기 때문에 상황에 따라 적절한 방법을 선택해서 사용해야합니다. query_string과 같은 방법을 과도하게 사용하기 보다는 keyword type이나 정확한 단어를 검색할 때는 term을 사용하는 것 처럼 적절한 방법을 사용하는 것을 추천합니다.

댓글남기기