Elasticsearch Query DSL

By | 2022년 8월 17일
Table of Contents

Elasticsearch Query DSL

사용하는 툴

Multi Elasticsearch Head 를 사용합니다.

키바나 없이 쿼리결과를 확인할 수 있어 편리합니다.

Full Text Query

match_all

모든 문서가 매칭됩니다.
아무 검색조건을 넣지 않으면 자동으로 match_all 로 검색됩니다.

API 로 호출될 경우 match_all 이 자동으로 포함되지 않습니다.
명시적으로 넣어주어야 하며, 넣지 않으면 어떤 문서도 반환되지 않습니다.

GET my_index/_search

{
  "query":{
    "match_all":{ }
  }
}

match

특정 단어를 검색합니다.
text 필드를 제외하고, 모두 정확히 일치하는 데이타만 반환합니다.
text 필드의 경우, 형태소 분석된 단어가 정확히 일치할 때만 반환합니다.

GET my_index/_search

{
  "query": {
    "match": {
      "message": "dog"
    }
  }
}

두개 이상의 단어를 검색할 수 있습니다.
operator 는 and 또는 or 가 가능하며, 생략시 or 조건으로 검색됩니다.

각 단어는 match 와 동일하게 검색결과를 반환하며,
순서는 상관없습니다.

GET my_index/_search

{
  "query": {
    "match": {
      "message": {
        "query": "quick dog",
        "operator": "and"
      }
    }
  }
}

match_phrase

단어의 순서까지 검색조건에 포함되며,
중간에 다른 단어의 존재도 허용하지 않습니다.

GET my_index/_search

{
  "query": {
    "match_phrase": {
      "message": "lazy dog"
    }
  }
}

slop 이라는 옵션으로,
중간에 끼어들 수 있는 단어의 수를 정할 수 있습니다.

GET my_index/_search

{
  "query": {
    "match_phrase": {
      "message": {
        "query": "lazy dog",
        "slop": 1
      }
    }
  }
}

Bool Query

  • filter

    매칭여부만 판단하고 score 를 매기지 않습니다.
    cache 가 되므로 다른 검색조건에 앞서 배치합니다.

  • must

    일치하는 문서만 반환합니다.

  • must_not

    일치하지 않는 문서만 반환합니다.

  • should

    일치하는 문서의 score 를 높여줍니다.

GET my_index/_search

{
  "query": {
    "bool": {
      "filter": [
        { <쿼리> }, …
      ],
      "must": [
        { <쿼리> }, …
      ],
      "must_not": [
        { <쿼리> }, …
      ],
      "should": [
        { <쿼리> }, …
      ]
    }
  }
}

GET my_index/_search

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "message": "quick"
          }
        },
        {
          "match_phrase": {
            "message": "lazy dog"
          }
        }
      ]
    }
  }
}

Bool Query 예제

GET my_index/_search

{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "message": {
              "query": "dog"
            }
          }
        },
        {
          "bool": {
            "must_not": [
              {
                "match": {
                  "message": "fox"
                }
              }
            ]
          }
        }
      ],
      "must": [
        {
          "match": {
            "message": {
              "query": "lazy dog"
            }
          }
        }
      ],
      "should": [
        {
          "match_phrase": {
            "message": "lazy dog"
          }
        }
      ]
    }
  }
}

Range

Data Type 이 keyword, numeric, date 인경우,
검색조건에 부합하는지 true/false 만 존재합니다.

이런 조건들은 Bool : Filter 에서 사용하는 것이 좋습니다.

GET my_index/_search

{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "isUsing": "Y"
          }
        },
        {
          "match": {
            "sellStatus": "Y"
          }
        },
        {
          "range": {
            "sellCash": {
              "gte": 10000,
              "lt": 20000
            }
          }
        },
        {
          "range": {
            "regDate": {
              "gte": "2022-05-30"
            }
          }
        }
      ]
    }
  }
}

Function Score Query

검색엔진이 적용되는 분야에 따라 가중치를 커스터마이징 해야 하는 경우가 있습니다.

이럴 때는 Function Score Query 가 사용됩니다.

참조

참조

특정 조건에 부합하는 문서의 가중치를 각각 다르게 부여해서,
리스트에 표시되는 순서를 보정할 수 있습니다.

function_score 는 하나의 query 와 하나 이상의 function 으로 구성됩니다.
min_score 를 부여해서 불필요한 문서들이 목록에 등장하는 것을 제거할 수 있습니다.

{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "boost": "1",
      "functions": [
        {
          "filter": {
            "match": {
              "search_string.ngram": {
                "query": "아이폰 케이스",
                "operator": "AND",
                "analyzer": "my_ngram_analyzer3"
              }
            }
          },
          "weight": 50
        },
        {
          "filter": {
            "match": {
              "search_string.ngram": {
                "query": "아이폰 케이스",
                "operator": "AND",
                "analyzer": "my_ngram_analyzer2"
              }
            }
          },
          "weight": 40
        },
        {
          "filter": {
            "match": {
              "search_string.ngram": {
                "query": "아이폰 케이스",
                "operator": "AND",
                "analyzer": "my_ngram_analyzer"
              }
            }
          },
          "weight": 30
        },
        {
          "filter": {
            "match": {
              "search_string.ngram": {
                "query": "아이폰 케이스",
                "operator": "OR",
                "analyzer": "my_ngram_analyzer3"
              }
            }
          },
          "weight": 5
        },
        {
          "filter": {
            "match": {
              "search_string.ngram": {
                "query": "아이폰 케이스",
                "operator": "OR",
                "analyzer": "my_ngram_analyzer2"
              }
            }
          },
          "weight": 4
        },
        {
          "filter": {
            "match": {
              "search_string.ngram": {
                "query": "아이폰 케이스",
                "operator": "OR",
                "analyzer": "my_ngram_analyzer"
              }
            }
          },
          "weight": 3
        }
      ],
      "score_mode": "sum",
      "boost_mode": "multiply",
      "min_score": 42
    }
  }
}

답글 남기기