Elasticsearch DSL 질의 상세 정보

10395 단어 ElasticStack
Elasticsearch에서는 매우 풍부하고 다양한 표현 형식의 조회 언어인 DSL 조회를 제공합니다.
DSL 쿼리는 JSON 형식의 요청체와 Elasticsearch를 사용하여 다양한 쿼리 요구를 실현할 수 있습니다.
DSL 질의에는 다음과 같은 두 가지 유형의 질의 문구가 포함됩니다.
  • 잎 조회 문장: 특수 필드의 특수 값을 조회하는 데 사용됩니다. 예를 들어 match,term,range 등..
  • 복합 조회 문장: 다른 잎 조회나 복합 조회를 통합하여 매우 복잡한 조회 논리를 실현할 수 있다

  • 쿼리 문장의 실행 결과는 쿼리 언어에 사용될 것인지, 필터 언어에 사용될 것인지에 의존한다.

    기본 문법


    DSL 쿼리를 사용하려면 query 매개 변수를 사용해야 합니다.
    기본 구문 형식:
    GET /_search
    {
        "query": 
    }
    

    빈 질의


    조회 조건이 없는 조회는 빈 조회입니다.모든 문서와 일치합니다.
    GET /_search
    {
        "query": {}
    }
    

    ... 과 같다
    GET /_search
    

    ... 과 같다
    GET /_search
    {
        "query": {
            "match_all": {}
        }
    }
    

    기본 조회


    예를 들어, match 쿼리를 사용하여 full_name 필드에john 기록이 포함되어 있습니다.
    GET /_search
    {
        "query": {
            "match": {
                "full_name": "john"
            }
        }
    }
    

    조회 및 필터링


    DSL 질의는 사용 목적에 따라 두 가지 유형으로 나뉩니다.
  • 컨텍스트 쿼리(Query context), 약칭 쿼리
  • 필터(Filter context), 필터라고 약칭합니다

  • 쿼리(Query)


    컨텍스트 질의 환경에서 질의 문장은 문서와 질의 문장의 일치 정도를 묻고, 문서의 일치 여부를 판단하고 관련성 평점 (_score) 의 값을 계산합니다.

    필터(Filter)


    상하문 필터 언어 환경에서 조회 문장은 주로 문서의 일치 여부를 해결하고 일치 정도(관련성 평점)에 신경 쓰지 않는다.필터는 주로 구조화된 데이터에 쓰인다.
    예:
    status 필드의 값은 어떤 매거 값이나 볼 값입니까?
    age 필드의 값은 20-35 범위 내에 있습니까?
    date 필드의 값은 2016-2019 사이입니까?
    일반적으로 필터 문장은 조회 문장보다 실행 효율이 높다. 왜냐하면 문서의 관련성 평점 (score) 을 계산하지 않기 때문이다.
    잦은 필터 문구를 사용한 결과 집합은 Elasticsearch에 의해 자동으로 캐시되어 성능을 향상시킵니다.
    필터의 목적은 일치하는 결과집을 난폭하게 빠르게 축소하는 것이다.
    일반적으로 전체 텍스트 검색이나 관련성 평점 (score) 을 사용해야 하는 장면은 검색 (query) 을 사용하고 다른 것은 모두 필터 (filter) 를 사용합니다.
    검색을 할 때, 우리는 종종 검색 문장에서 검색과 필터를 결합하여 우리의 검색 목적을 달성한다.
    다음은 예입니다.
    GET /_search
    {
      "query": { 
        "bool": { 
          "must": [
            { "match": { "title":   "Search"        }}, 
            { "match": { "content": "Elasticsearch" }}  
          ],
          "filter": [ 
            { "term":  { "status": "published" }}, 
            { "range": { "publish_date": { "gte": "2015-01-01" }}} 
          ]
        }
      }
    }
    

    전체 텍스트 조회


    전체 텍스트 검색 문장은 일반적으로 전체 텍스트 필드의 검색에 사용됩니다.

    match


    match 조회는 텍스트, 수치, 날짜 유형의 데이터를 조작하여 분석하고 조회 문장을 구축할 수 있습니다.
    예: 쿼리 full_name 필드에 John 또는 Smith 문서가 들어 있습니다.
    GET /_search
    {
        "query" : {
            "match" : {
                "full_name" : "John Smith"
            }
        }
    }
    

    설명: Elasticsearch는 먼저 분석기를 사용하여 "John Smith"를 두 개의 독립된 항목인 "John"과 "Smith"로 분석한 다음에 조회를 구축합니다.
    여기 full_name 필드는 검색하고 싶은 필드로 바꿀 수 있습니다. 심지어는_all 필드.
    match는 boolean의 유형에 속한다. 즉, 분석기는 제공하는 검색 텍스트를 분석하고 boolean 검색 문장을 구축한다.
    match에서 구축된boolean 검색 문장의 기본값은 논리 또는 (or)입니다. 물론,operator 매개 변수를 통해 이 기본 행동을 바꿀 수 있습니다.
    예: 쿼리 full_name 필드에는 John 및 Smith 문서가 들어 있습니다.
    GET /_search
    {
        "query": {
            "match" : {
                "full_name" : {
                    "query" : "John Smith",
                    "operator" : "and"
                }
            }
        }
    }
    

    설명: full_name는 필드 이름이고query 매개 변수의 값은 검색 텍스트를 제공하며,operator 매개 변수는 match의 논리 (or 또는 and) 를 설정하는 데 사용됩니다.

    match_phrase


    match_phrase, 즉 단어 (어구) 가 일치합니다. 이것은 제공된 검색 텍스트를 분석하고 phrase 검색을 구축합니다.
    match_phrase는 정확한 phase 일치에 사용됩니다.
    예: 쿼리 full_name 필드에 "John Smith"구문이 포함된 문서입니다.
    GET /_search
    {
        "query" : {
            "match_phrase" : {
                "full_name" : "John Smith"
            }
        }
    }
    

    또한 제공된 검색 텍스트에 analyzer (분석기) 를 지정할 수 있습니다. 지정되지 않으면 필드의 현식 맵핑에 대한 정의나 기본적인search analyzer를 사용합니다.
    GET /_search
    {
        "query": {
            "match_phrase" : {
                "full_name" : {
                    "query" : "John Smith",
                    "analyzer" : "standard"
                }
            }
        }
    }
    

    match_phrase_prefix


    match_phrase_prefix 및 match_phrase 유사하지만 match_phrase_prefix는 정확한 일치가 아니라 접두사 일치입니다. 텍스트의 마지막 문자를 조회한 후의 내용을 어댑터로 검색합니다.
    예: 쿼리 full_name 필드에서 "John Smi"구문으로 시작하는 문서입니다.
    GET /_search
    {
        "query" : {
            "match_phrase_prefix" : {
                "full_name" : "John Smi"
            }
        }
    }
    

    multi_match


    multi_match는 여러 필드가 일치하는 조회에 사용됩니다.
    GET /_search
    {
        "query" : {
            "multi_match": {
              "query": "John Smith",
              "fields": ["first_name", "full_name"]
            }
        }
    }
    

    Term-level 쿼리


    우리는 전문 조회가 조회를 실행하기 전에 제공된 조회 텍스트를 먼저 분석한다는 것을 안다.
    그러나 Term-level 조회는 역렬 인덱스의 정확한 값을 직접 조회합니다.
    Term-level 조회는 일반적으로 텍스트(text)가 아닌 수치, 날짜, 열거 값, 키워드 등 구조화된 데이터에 사용됩니다.

    term


    term은 지정한 필드를 조회하는 데 사용되는 역렬 인덱스에 정확한 값을 포함하는 기록을 포함합니다.
    POST /_search
    {
      "query": {
        "term" : { "first_name" : "john" } 
      }
    }
    

    terms


    terms는term과 유사하지만 정확한 값은 그룹입니다.ySQL과 유사한 in 조건입니다.
    POST /_search
    {
      "query": {
        "terms" : { "full_name" : ["john", "john2"] } 
      }
    }
    
    POST /_search
    {
      "query": {
        "constant_score": {
          "filter": { "terms" : { "full_name" : ["john", "john2"] }}
        }
      }
    }
    

    range


    범위 조회에 사용됩니다.
    GET /_search
    {
        "query": {
            "range" : {
                "info.age" : {
                    "gte" : 28,
                    "lt" : 60,
                    "boost" : 2.0
                }
            }
        }
    }
    

    설명: boost 매개 변수는 관련성 평점 (score) 의 값을 조정하는 데 사용할 수 있습니다.
    GET /_search
    {
        "query": {
            "range" : {
                "date" : {
                    "gt" : "now-3d/d",
                    "lt" :  "now"
                }
            }
        }
    }
    

    exists


    exists 반환 필드 값은null의 기록이 아닙니다.
    GET /_search
    {
        "query": {
            "exists" : { "field" : "user" }
        }
    }
    

    prefix


    prefix는 필드의term을 되돌려줍니다. 정확한 접두사 (접두사는 분석되지 않습니다) 로 시작하는 기록입니다.
    GET /_search
    {
        "query": {
            "prefix" : { "full_name" : "joh" }
        }
    }
    

    wildcard


    wildcard는 어댑터 조회를 가리킨다.
    지원되는 와일드카드는 다음과 같습니다.
  • * 0 개 이상의 문자와 일치합니다
  • ? 임의의 문자와 일치합니다
  • GET /_search
    {
        "query": {
            "wildcard" : { "full_name" : "john*" }
        }
    }
    

    regexp


    regexp는 정규 조회를 가리킨다.
    GET /_search
    {
        "query": {
            "regexp" : { "full_name" : "jo.*" }
        }
    }
    

    fuzzy


    fuzzy는 용차 조회를 가리킨다. 즉, 정확한 값과 역렬 인덱스의term 사이에 오차가 있는 것을 용인할 수 있다.
    GET /_search
    {
        "query": {
            "fuzzy" : { "full_name" : "joh" }
        }
    }
    
    GET /_search
    {
        "query": {
            "fuzzy" : {
                "full_name" : {
                    "value" :         "joh",
                    "fuzziness" :     2,
                    "prefix_length" : 0,
                    "max_expansions": 100
                }
            }
        }
    }
    

    type


    type 조회는 문서의 type에 따라 조회하는 것을 가리킨다.
    이 type은 MySQL과 유사한 데이터 테이블을 가진 문서의 범주(논리적 그룹)입니다.
    GET /_search
    {
        "query": {
            "type" : {
                "value" : "user"
            }
        }
    }
    

    ids


    ids 조회는 문서의 id에 따라 조회하는 것을 가리킨다.
    GET _search
    {
        "query": {
            "ids" : { "values" : ["1", "2", "60"] }
        }
    }
    

    복합 조회


    constant_score


    constant_score 복합 조회는 필터 상하문에서 조회 문장만 실행하고 되돌아오는 모든 기록의_score 값은 상수입니다.
    GET /_search
    {
        "query": {
            "constant_score" : {
                "filter" : {
                    "term" : { "full_name" : "john"}
                },
                "boost" : 1.5
            }
        }
    }
    

    bool


    bool 복합 조회는 잎 조회 문장이나 복합 조회 문장을 조합하는 데 사용됩니다.예: must,should,must_not, or filter.
  • must가 일치해야 합니다.
  • should는 최소한 하나의 문서와 일치합니다..
  • filter는 일치해야 하며 관련성 평점은 무시해야 합니다..
  • must_not 일치하지 않아야 합니다. 관련성 평점은 무시합니다.

  • 설명:must와should는 조회 상하문에서 실행됩니다.must_not와 filter는 필터 상하문에서 실행됩니다.
    POST /_search
    {
        "query": {
            "bool" : {
                "must" : {
                  "term" : { "last_name" : "smith" }
                },
                "filter": {
                  "term" : { "info.interests" : "musics" }
                },
                "must_not" : {
                  "range" : {
                    "info.age" : { "gte" : 10, "lte" : 25 }
                  }
                },
                "should" : [
                  { "term" : { "full_name" : "john" } },
                  { "term" : { "full_name" : "smith" } }
                ],
                "minimum_should_match" : 1,
                "boost" : 2.0
            }
        }
    }
    

    참고 문헌
    [1] https://www.elastic.co/guide/en/elasticsearch/reference/5.2/index.html

    좋은 웹페이지 즐겨찾기