ElasticSearch ‐ 자주 사용하는 검색 기능 - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 검색 키워드가 포함된 데이터를 조회하고 싶을 때

❗The match query analyzes any provided text before performing a search. This means the match query can search text fields for analyzed tokens rather than an exact term. -> text 타입에서만 가능하다.

{
  "query": {
    "match": {
      "message": {
        "query": "this is a test"
      }
    }
  }
}

📚 특정 값과 정확하게 일치하는 데이터를 조회하고 싶을 때

  • term 쿼리는 특정 값과 정확히 일치하는 모든 도큐먼트를 조회한다.
  • 그렇기 때문에 text를 제외한 모든 타입에서 사용한다.

❗실제로 text 타입에서도 사용은 가능하나 의도대로 동작하지 않을 수 있기 때문에 사용하지 않는 것을 권장한다.

{
  "query": {
    "term": {
      "user.id": {
        "value": "kimchy",
        "boost": 1.0
      }
    }
  }
}
{
  "query": {
    "terms": {
      "user.id": [ "kimchy", "elkbee" ],
      "boost": 1.0
    }
  }
}

📚 2가지 이상의 조건을 만족시키는 데이터를 조회하고 싶을 때

스크린샷 2025-06-21 00 52 23

  • must : SQL문에서의 AND
  • filter : SQL문에서의 AND
  • must_not : SQL문에서의 NOT
  • should : 조건을 만족하면 Good, 아니면 말고

filter vs must

  • filter와 must의 가장 큰 차이는 filter는 점수에 영향을 주지 않고 must는 점수에 영향을 준다.
  • 여기서 언급하는 점수는 검색을 할 때 관련도가 얼마나 높은가를 나타내는 수치이다.
  • 점수를 활용하는 쿼리는 text 타입을 기반으로 검색을 유연하게 해주는 쿼리(match, match_phrase, multi_match) 뿐이다.
  • 즉, 정확하게 일치하지 않더라도 관련성이 있는 데이터까지도 같이 조회하는 쿼리에 대해서만 must를 사용하면 된다.

[결론]

  • 유연한 검색이 필요하다.

-> text 타입, match 쿼리 -> bool의 must

  • 정확한 검색이 필요하다.

-> text 이외의 타입, term 쿼리 -> bool의 filter

📚 특정 조건을 만족하지 않는 데이터를 조회하고 싶을 때

📚 숫자/날짜의 값에 대해 범위 조건으로 데이터를 조회하고 싶을 때

📚 특정 조건을 만족하는 데이터 위주로 상위 노출시키고 싶을 때

📚 오타가 있더라도 유사한 단어를 포함한 데이터를 조회하고 싶을 때

📚 여러 필드에서 검색 키워드가 포함된 데이터를 조회하고 싶을 때

📚 검색한 키워드를 하이라이팅 처리하고 싶을 때

📚 페이지네이션

📚 정렬

📚 하나의 필드에 text와 keyword 타입을 동시에 사용하고 싶을 때

📚 검색 키워드를 일부 입력했을 때 검색어를 추천하는 자동 완성 기능

❗The search_as_you_type field type is a text-like field that is optimized to provide out-of-the-box support for queries that serve an as-you-type completion use case. It creates a series of subfields that are analyzed to index terms that can be efficiently matched by a query that partially matches the entire indexed text value. Both prefix completion (i.e matching terms starting at the beginning of the input) and infix completion (i.e. matching terms at any position within the input) are supported.

  • ElasticSearch에서 자동 완성 기능을 쉽게 구현할 수 있도록 설계된 데이터 타입이다.
  • text타입처럼 애널라이저를 거쳐서 토큰으로 분리된다.

[ _2gram , _3gram ]

  • _2gram은 두 단어씩 묶어서 토큰을 만든다.
  • _3gram은 세 단어씩 묶어서 토큰을 만든다.