본문 바로가기

목록이 없습니다.

[Elasticsearch] 어떻게 공백을 포함한 문자열을 통째로 검색어로 사용할 수 있을까?

Server/Elastic Search

     

    Elasticsearch는 검색엔진으로 데이터를 저장할 때 키워드 단위 즉, 쉽게 말해서 단어 단위로 쪼개어 저장을 하게 되는데요. 이 때문에 검색어도 마찬가지로 단어 단위로 탐색이 됩니다. 만약에 검색하고자 하는 검색어에 공백이 포함되어 있는 경우 Elasticsearch에서는 기본적으로 default_operator라는 것이 설정 되어 있어서 OR 조건으로 적용되요. 예를 들어서 다음 쿼리를 통해 조회하는 경우에요.

     

    {
    	"query" : {
        	"query_string" : {
            	"field": "name",
                "query": "apple orange"
            }
        }
    }

    이렇게 검색하는 경우 name이라는 필드 안에 apple 또는(OR) orange 라는 키워드(문자)가 들어가있으면 위의 쿼리 결과로 나와요. 하지만 실제로 원하는 값이 "apple orange"가 통째로 그러니까 띄어쓰기를 포함한 전체 문장이 포함되어 있는 결과를 받고 싶다면 아래와 같이 2가지 방법으로 할 수 있어요. (제가 찾은 방법은 현재 2가지입니다. 다른 방법이 있을 수도 있어요!)

     

     

    띄어쓰기 포함 문자열 검색

    query_string \" 으로 감싸서 조회

    {
    	"query": {
        	"query_string": {
            	"field": "name",
                "query": "\"apple orange\""
            }
        }
    }

    원래 쿼리에서 query_string 아래에 있는 query 검색어에 띄어쓰기까지 포함할 문자열을 \"\" 로 감싸주면 "apple orange" 라는 문자열이 포함된 결과만이 조회되요. 원래 쿼리인 위에서 apple 하나만 들어가있는 결과 또는 orange하나만 들어가있는 결과가 나오지 않고 apple orange가 포함된 결과만요.

     

    match_phrase 문을 사용하여 조회

    제공되는 match_phrase 문을 사용해서 조회하면 위와 같은 결과를 받을 수 있어요. phrase라는 단어 자체가 "구절"을 의미하는데 이는 둘 또는 그 이상의 어절로 이루어져 한 덩어리로써 절이나 문장의 성분이 되는 동일한 말의 단위 라고 해요. 쉽게 말해서 2개 이상의 단어로 구성된 문자열을 의미해요. 따라서 match_phrase는 우리가 원하는 것처럼 문자열 통째로 검색을 하는 기능이에요.

     

    {
    	"query": {
        	"match_phrase" : {
         		"name": "apple orange"
          	}
        }
    }

     

    multi_match type "phrase" 설정하여 조회

    또 다른 방법으로는 match 문을 사용하는데 옵션 중에 하나인 type을 phrase로 설정해서 조회하는 방법이에요. type 옵션은 일반 match 문에는 없는 것 같고 여러 필드를 한번에 조회 가능한 multi_match 문에서 사용 가능해요.

     

    {
    	"query": {
        	"multi_match": {
            	"fields": ["name"],
                "query": "apple orange",
                "type": "phrase"
            }
        }
    }

    여러 필드를 조회해야하는데 띄어쓰기(공백)가 포함된 문자열을 검색해야하는 경우에 유용하게 사용할 수 있을 것 같아요.