실전에서 바로 써먹는 Elasticsearch 입문 (검색 최적화편)
✅ 특정 값과 정확하게 일치하는 데이터를 조회하고 싶을 때 (term)
- term 쿼리는 특정 값과 정확히 일치하는 모든 도큐먼트를 조회한다.
- term 쿼리는 text를 제외한 모든 타입에서 사용한다.
(text 타입에서도 사용은 가능하나 의도대로 작동하지 않을 수 있어서 사용하지 않는 걸 권장한다.)
term 쿼리를 직접 사용해보자.
- 인덱스 생성 및 매핑 정의하기
DELETE /boards
PUT /boards
{
"mappings": {
"properties": {
"board_id": {
"type": "long"
},
"category": {
"type": "keyword"
}
}
}
}
- 데이터 삽입하기
POST /boards/_doc
{
"board_id": 1,
"category": "자유 게시판"
}
POST /boards/_doc
{
"board_id": 2,
"category": "익명 게시판"
}
POST /boards/_doc
{
"board_id": 3,
"category": "광고 게시판"
}
- 도큐먼트 검색해보기
데이터가 가진 값과 정확히 일치하게 검색하지 않으면 도큐먼트가 조회되지 않는다.
GET /boards/_search
{
"query": {
"term": {
"category": "자유"
}
}
}
GET /boards/_search
{
"query": {
"term": {
"category": "자유게시판"
}
}
}
GET /boards/_search
{
"query": {
"term": {
"board_id": 13
}
}
}
정확한 값으로 검색하면 도큐먼트가 잘 조회된다.
GET /boards/_search
{
"query": {
"term": {
"category": "자유 게시판"
}
}
}
GET /boards/_search
{
"query": {
"term": {
"board_id": 1
}
}
}
SQL문으로 표현하자면 아래와 같이 표현할 수 있다.
→ SELECT * FROM boards WHERE category = "자유 게시판"
→ SELECT * FROM boards WHERE board_id = 152
✅ 여러 개의 값 중 하나라도 일치하는 도큐먼트 조회 (terms)
- terms 쿼리는 여러 개의 값 중 하나라도 일치하는 모든 도큐먼트를 조회한다.
terms 쿼리를 직접 사용해보자.
SELECT * FROM boards WHERE category IN ("자유 게시판", "익명 게시판")처럼 category가 자유 게시판 또는 익명 게시판인 모든 데이터를 조회하고 싶다고 가정하자.
GET /boards/_search
{
"query": {
"terms": {
"category": ["자유 게시판", "익명 게시판"]
}
}
}
✅ 여러 개의 조건을 동시에 만족하는 데이터를 조회하고 싶을 때
SELECT * FROM boards WHERE category = “자유 게시판” AND board_id = 1과 같이 2가지 이상의 조건을 활용해 검색하고 싶을 수도 있다. 아래와 같이 작성하면 되지 않을까라고 생각할 수 있다.
GET /boards/_search
{
"query": {
"term": {
"category": "자유 게시판",
"board_id": 1
}
}
}
하지만 위와 같이 쿼리를 실행시켜보면 아래와 같이 에러가 발생한다.
👨🏻🏫
그럼 2가지 이상의 조건을 활용해서 데이터를 검색하고 싶을 때는 어떻게 쿼리를 작성해야 할까? 다음 강의에서 알아보자.