반응형

mysql이나 오라클에서 like검색기능을 엘라스틱서치에서 구현하려면 어떻게 해야할까?

 

일반적인 sql문은 select * from test where subject like '%테스트%'; 이런식이 될 것이다. 이런 검색을 엘라스틱서치에서도 해보려고 한다.

 

우선 일반적으로 엘라스틱서치에서 검색을 할때 어떻게 하는지 알아보자.

 

첫번째

 

{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "multi": "soccer"
          }
        }
      ]
    }
  }
}

 

multi가 soccer인 글들을 모두 검색한다. 자 여기서 soccer로 시작하는 즉 'soccer%'는 어떻게 구현할까?

 

{
  "query": {
"query_string" : {
"fields" : ["subject", "username"],
"query" : "soccer*"
}
}
}

 

이렇게 해주면 subject와 username에서 모두 soccer로 시작하는 글들을 찾아준다. 

 

{
  "query": {
"query_string" : {
"fields" : ["subject", "username"],
"query" : "손* 메*"
}
}
}

 

이렇게 하면 "손"과 "메"로 시작하는 모든 글들을 찾아준다.

 

당연하게도 

 

{
  "query": {
"query_string" : {
"fields" : ["subject", "username"],
"query" : "*메*"
}
}
}

 

이렇게 와일드카드를 양쪽에 붙일 수도 있다. like '%메%' 와 같은 결과가 나온다. 

 

query_string에 조건을 붙여보자. 기간 조건인 range를 써볼거다.

 

{
  "query": {
    "bool": {
      "must": [
        {
          "query_string": {
            "fields" : ["subject", "username"],
            "query" : "test"
          }
        },
        {
          "range": {
            "regdate": {
              "gte": "2023-09-12"
            }
          }
        }
      ]
    }
  }
}

 

regdate가 2023-09-12보다 크거나 같고 subject나 username이 test인 게시물을 찾는다. 위 쿼리는 다시 query_string을 이용해서 다음과 같이 단순화 시킬 수 있다.

 

{
  "query": {
    "query_string": {
      "query": "(subject:test OR username:test) AND gamedate:>=2023-09-12"
    }
  }
}

위의 결과와 같은 결과가 나온다.

 

이번엔 와일드 카드를 써보자.

 


  "query": { 
            "bool": { 
                "must": [ 
                    {
                      "wildcard": {
                        "subject": "*메*"
                      }
                    }
                ]
            }
        },
  "size": 50, 
  "from": 0, 
  "sort": {
    "site_reg_date":"desc"
  }
}

이렇게 "bool"연산이 들어가게 되면 앞에 했던 검색방식은 적용되지 않으니까 이렇게 바꿔주어야 한다. 

 


  "query": { 
            "bool": { 
                "must": [ 
                    {
                      "wildcard": {
                        "username": "축*"
                      }
                    },
                    {
                      "wildcard": {
                        "subject": "축*"
                      }
                    }
                ]
            }
        },
  "size": 50, 
  "from": 0, 
  "sort": {
    "site_reg_date":"desc"
  }
}

이렇게 와일드 카드를 2개 쓰면 and 검색이 된다. username에도 들어가고 subject에도 있어야 검색이 된다. or로 검색하려면

 


  "query": { 
            "bool": { 
                "should": [ 
                    {
                      "wildcard": {
                        "username": "축*"
                      }
                    },
                    {
                      "wildcard": {
                        "subject": "축*"
                      }
                    }
                ]
            }
        },
  "size": 50, 
  "from": 0, 
  "sort": {
    "site_reg_date":"desc"
  }
}

must대신에 should로 바꿔주면 된다. 쉽다.

 

각각의 경우로 몇가지 테스트를 해봤는데 검색 속도는 크게 차이가 없었다.

반응형

+ Recent posts