ETC/Elasticsearch

[elasticsearch] 텍스트 검색

seokhyun2 2025. 3. 16. 21:48

색인하는 부분은 어느정도 알아보았으니 오늘은 검색에 대한 내용을 알아보도록 하겠습니다.

Query DSL

DSL은 Domain Specific Language라고 도메인에 특정한 언어라는 뜻입니다.

Elasticsearch는 Query DSL이라고 Elasticsearch만의 특정한 쿼리 언어를 제공합니다.

Elasticsearch의 Query는 Json으로 작성해야 합니다.

이런게 있구나라고만 알고 Elasticsearch는 Json으로 검색 쿼리를 작성하는 것이라고만 생각하시면 됩니다.

Search API

검색 역시 rest API 방식을 지원합니다.

검색은 get, post 모두 지원하고 아래와 같이 Query DSL을 Json으로 구성해서 body에 넣어서 보내면 됩니다.

GET /my-index-000001/_search?from=40&size=20
{
  "query": {
    "term": {
      "user.id": "kimchy"
    }
  }
}

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html

위의 request에서 Json에 대해서 조금 더 자세히 보도록 하겠습니다.

Json이 바로 Query DSL로 구성되어 있는 것인데요.

검색하려는 쿼리를 "query"에 넣어주면 됩니다.

위에서는 "term"쿼리로 "user.id"가 "kimchy"와 완전 일치하는 것을 찾아오겠다는 뜻입니다.

텍스트 검색

텍스트 검색은 아무래도 RDB로는 할 수 없어서 elasticsearch를 사용하게 되다보니, elasticsearch의 꽃은 텍스트 검색이라고 생각이 되는데요. 그러므로 텍스트 검색에 대해서 좀 더 자세하게 알아보도록 하겠습니다.

제일 기본적으로 term 쿼리를 사용할 수 있는데요. https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

term query는 완전 일치하는 경우에만 검색이 됩니다.

이 때 주의할 점은 index의 field도 term이여야 한다는 것입니다.

예를 들어, index의 name이라는 field가 text로 되어있다고 한번 가정해보겠습니다.

name을 "John Legend"라고 색인하게 된다면 elasticsearch는 기본적으로 space 단위로 나눠서 "John", "Legend"로 나눠서 색인을 합니다.

그렇게 되면 term쿼리를 사용하여 "term": {"name": "John Legend"}라고 검색을 하면 실제로 우리가 생각했을 때는 완전 일치라고 생각되지만, elasticsearch는 "John Legend"가 아닌 "John", "Legend"만 가지고 있기 때문에 검색이 안됩니다.

그래서 name을 term으로 설정하면 term query로 검색은 가능하지만, 부분일치에 대한 검색을 할 수 없습니다.

text 필드에서 검색을 하기위해서는 match 쿼리를 사용하는 것을 권장하는데, match 쿼리는 검색할 때 "John Legend" 넣어도 "John", "Legend"로 잘라서 검색을 하기 때문에 검색을 할 수 있습니다. 이 때 알아야 할 것은 "John", "Legend" 중에 하나만 있어도 검색이 되고, 두개 다 있으면 score가 더 높게 검색이 됩니다.

Warp Up

오늘은 elasticsearch에서 검색을 어떻게 하는 지 한 번 알아보았는데요.

텍스트 검색을 할 때는 text field에 match 쿼리를 사용하는 것이 권장 된다는 것을 알아두시면 될 것 같습니다.

'ETC > Elasticsearch' 카테고리의 다른 글

[elasticsearch] 노드 관리 (Node Lifecycle)  (0) 2025.03.02
[elasticsearch] 색인 -2  (0) 2025.02.02
[elasticsearch] 색인 -1  (0) 2025.01.19
[elasticsearch] 클러스터  (0) 2024.11.10
[elasticsearch] 데이터 저장  (1) 2024.10.27