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로 바꿔주면 된다. 쉽다.
각각의 경우로 몇가지 테스트를 해봤는데 검색 속도는 크게 차이가 없었다.
'엘라스틱서치' 카테고리의 다른 글
엘라스틱서치, 데이터를 업데이트하는 다양한 방법 (0) | 2023.09.13 |
---|---|
엘라스틱서치, 필드의 타입을 변경할때는 그냥 reindex 해서 인덱스를 다시 만들자 (0) | 2023.09.05 |
엘라스틱서치에서 날짜별로 group by 하기 - aggs (0) | 2023.07.27 |
엘라스틱서치에서 group by 사용하기 - aggs (0) | 2023.07.25 |
Logstash의 활용 - 새롭게 등록되거나 수정된 데이터만 등록 (0) | 2023.07.03 |