![[ElasticSearch] 오타 허용 검색, 하이라이팅, 페이지네이션 및 정렬](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCdtSM%2FbtsOlBR8NiU%2F48K6TsP3tM4NhZTwl7bs30%2Fimg.png)
[ElasticSearch] 오타 허용 검색, 하이라이팅, 페이지네이션 및 정렬Back-End/ElasticSearch2025. 6. 1. 15:21
Table of Contents
이 글은 인프런의 지식 공유자 박재성님의 강의를 듣고 개인적으로 정리하는 글임을 알립니다.
fuzziness(오타 허용 검색)
- 오타를 어느 정도 허용해서 검색하고 싶을 때 fuzziness를 활용하면 된다.
인덱스 생성 및 데이터 삽입
// 인덱스 생성 PUT /boards { "mappings": { "properties": { "title": { "type": "text" } } } } // 데이터 삽입 POST /boards/_doc { "title": "elasticsearch 사용법" } |
오타 허용 검색
GET /boards/_search { "query": { "match": { "title": { "query": "elastiksearch", "fuzziness": "AUTO" } } } } |
- fuzziness : AUTO : 단어 길이에 따라 오타 허용 개수를 자동으로 설정
highlight(검색어 하이라이팅)
- 구글이나 쿠팡에서 검색을 해보면 검색한 키워드가 하이라이팅 처리가 되있는 걸 확인할 수 있다. 이 기능을 ElasticSearch로 구현할 수 있다.
인덱스 생성 및 데이터 삽입
// 인덱스 생성 PUT /boards { "mappings": { "properties": { "title": { "type": "text", "analyzer": "nori" }, "content": { "type": "text", "analyzer": "nori" } } } } // 데이터 삽입 POST /boards/_doc { "title": "엘라스틱서치 적용 후기", "content": "회사 프로젝트에 엘라스틱서치를 적용한 후기를 공유합니다." } POST /boards/_doc { "title": "엘라스틱서치를 사용해보니", "content": "검색 엔진 도입 후 성능이 향상되었습니다." } POST /boards/_doc { "title": "검색엔진 도입 사례", "content": "이번 프로젝트에 엘라스틱서치를 적용한 후 많은 개선 효과가 있었습니다." } POST /boards/_doc { "title": "레디스 캐시 사용기", "content": "서비스 속도 개선을 위해 캐시 시스템을 사용했습니다." } |
검색
GET /boards/_search { "query": { "multi_match": { "query": "엘라스틱서치 적용 후기", "fields": ["title", "content"] } }, "highlight": { "fields": { "title": { "pre_tags": ["<mark>"], "post_tags": ["</mark>"] }, "content": { "pre_tags": ["<b>"], "post_tags": ["</b>"] } } } } |
검색 결과에 HTML 태그로 감싼 뒤 결과값을 반환했다. 이 결과값을 활용해서 웹 페이지에서 하이라이팅 처리를 하면 된다.
페이지네이션 및 정렬
페이지네이션
서버의 과부하를 방지하기 위해 데이터 조회 시 필수적으로 적용해야 하는 기능이 페이지네이션(Pagination)이다.
Elasticsearch에서 페이지네이션(Pagination)을 활용해 데이터 조회하는 방법은 아래와 같다.
인덱스 생성
PUT /boards { "mappings": { "properties": { "title": { "type": "text", "analyzer": "nori" }, "likes": { "type": "long" } } } } |
데이터 삽입
POST /boards/_doc { "title": "1번 글", "likes": 12 } POST /boards/_doc { "title": "2번 글", "likes": 35 } POST /boards/_doc { "title": "3번 글", "likes": 1 } POST /boards/_doc { "title": "4번 글", "likes": 11 } POST /boards/_doc { "title": "5번 글", "likes": 72 } POST /boards/_doc { "title": "6번 글", "likes": 10 } POST /boards/_doc { "title": "7번 글", "likes": 5 } |
페이지네이션 적용
- size : 한 페이지에 불러올 데이터 개수 (SQL문의 LIMIT과 동일)
- from : 몇 번째 데이터부터 불러올 지 (SQL문의 OFFSET과 동일, 0부터 시작)
- from = (페이지 수 - 1) x size
// 1 페이지 GET /boards/_search { "query": { "match": { "title": "글" } }, "size": 3, "from": 0 } // 2 페이지 GET /boards/_search { "query": { "match": { "title": "글" } }, "size": 3, "from": 3 } // 3 페이지 GET /boards/_search { "query": { "match": { "title": "글" } }, "size": 3, "from": 6 } |
정렬
좋아요 수(likes)를 내림차순으로 정렬
GET /boards/_search { "query": { "match": { "title": "글" } }, "sort": [ { "likes": { "order": "desc" } } ] } |
'Back-End > ElasticSearch' 카테고리의 다른 글
[ElasticSearch] 검색어 추천 기능(search_as_you_type) (0) | 2025.06.02 |
---|---|
[ElasticSearch] 멀티 필드(Multi Field) (0) | 2025.06.02 |
[ElasticSearch] match, term, bool (3) | 2025.06.01 |
[ElasticSearch] 한글 검색 최적화(Nori Analyzer) (0) | 2025.06.01 |
[ElasticSearch] 데이터 타입(data type)과 매핑(mapping) (0) | 2025.05.31 |