ElasticSearch 쿼리 언어 DSL

7141 단어
elasticSearch에서 두 가지 조회가 있습니다. 1.url 검색 2.DSL 쿼리 언어
  • url 검색은 말 그대로 url 검색의 매개 변수는 모두 url을 통해 전달되기 때문에 일반적인 데이터 보기를 편리하게 할 수 있다. 대략 아래와 같은 형식
        GET twitter/_search?q=user:kimchy
    
  • Request Body 검색은 DSL(Domain Specific Language)을 통해 다음과 같은 검색 언어를 정의합니다.
    이 글은 주로 DSL 조회의 원리와 문법을 설명한다.

    DSL 검색 쿼리


    Elasticsearch는 JSON 기반 전체 질의 DSL(Domain Specific Language[도메인별 언어])을 제공하여 질의를 정의합니다.쿼리 DSL을 쿼리의 AST(Abstract Syntax Tree[추상 구문 트리])로 간주합니다.
    그것은 두 개의 씨앗 문장으로 구성되어 있다.
  • 자구 조회 조건 자구 조회는 특정 필드에서 특정한 값을 찾습니다. 예를 들어 match,term 또는range 조회입니다.이 조회들은 단독으로 사용할 수 있다.
  • 복합 조회 조건 복합 조회는 자구 조회와 다른 복합 조회를 조합하여 복잡한 논리를 실현하는 조회이다.예를 들어 bool 및 dis_max 조회
  • 같은 조회 조건의 결과는 그들의 상하문 환경에 의존한다.elasticSearch의 DSL은 주로 두 가지 상하문 환경을 제공한다:query[상하문 조회]와 filter[필터 상하문].

    filter와query 상하문


    주의, DLS 관건은 filter와query의 차이를 분명히 하는 것이다
  • 관련성 득점 [relevance score]
  • 기본적으로 ElaticSearch는 연관성 점수(질의와 문서의 일치 정도)를 통해 결과를 정렬합니다.관련성 득점은 정부동점수입니다.search API에서 _score 필드가 반환됩니다._score 값이 클수록 관련성이 높다.각 필드는 다른 방식으로 계산됩니다_score, _score의 계산도 검색 조건에 따라 필터나query에서 실행됩니다.
  • 구조화 조회
  • query 상하문에서 하나의 조회 조건이 주로 해결하는 문제는 조건과 문서의 일치 정도가 얼마나 높은지이다.일치도 문제를 해결하는 것 외에 하나의 관련성 정도를 계산합니다. 메타데이터로_score 반환.
  • 구조화 필터
  • filter 상하문에서 검색 조건이 주로 해결되는 문제는 조건과 문서가 일치하는지 여부입니다.일반적인 결과는 일치와 불일치입니다. 이것은 주로 구조화된 데이터를 필터하는 데 사용됩니다.
    필터링 문구는 각 문서의 필드 값에 특정 값이 포함되어 있는지 묻습니다.
  • status 필드에'published'입니까?
  • created의 날짜 범위는 2013~2014입니까?

  • 검색 조건을bool 아래의 필터나must 매개 변수 등에 전달하든지, 집합 중인 필터든지, 필터는 모두 작용한다
  • 성능 차이는 필터 문구를 사용하여 얻은 결과 집합입니다. 간단한 문서 목록으로 신속하게 일치하는 연산을 하고 메모리에 저장하는 것이 매우 편리합니다. 문서당 1바이트만 필요합니다.이러한 캐시의 필터 결과 집합은 후속 요청과 결합하여 사용하면 매우 효율적이다.

  • 검색 문장은 일치하는 문서를 찾아야 할 뿐만 아니라 모든 문서의 관련성을 계산해야 하기 때문에 일반적으로 검색 문장은 필터 문장보다 시간이 더 걸리고 검색 결과도 캐시할 수 없다.
    다행히도 역렬 인덱스가 있어서 소량의 문서만 일치하는 간단한 조회 문장이 백만 개의 문서에서 조회 효율은 캐시를 거친 필터 문장과 비슷하고 심지어 약간 우위를 차지할 것이다.그러나 일반적인 상황에서 캐시를 거친 필터 검색은 검색 문장의 실행 효율보다 훨씬 높다.
    필터 문장의 목적은 일치하는 문서 결과집을 축소하는 것이기 때문에 필터 조건을 꼼꼼히 확인해야 한다.
  • 어떤 상황에서 사용하는지는 원칙적으로 조회 문장을 사용하여 전문본 검색을 하거나 관련성 평가를 해야 할 때 나머지는 모두 필터 문장으로 사용합니다. Usequery clauses inquery context for conditions which should affect the score of matching documents (i.e. how well does the document match), and use all otherquery clauses in filter context.

  • 복합 조회

  • bool 조합 기타 조회의 기본 조회: 예를 들어must,should,must_not, or filter must와should는 score를 통합합니다. 일치할수록 must_not와 filter는 filter 조건에서 실행
  • bootingquery는 정합 조회의 정합 점수를 증가하고 마이너스 정합 조회 점수를 감소합니다.
  • constant_scorequery는 다른 조회를 포함하지만, 모든 문서는 같은 score를 사용하고 필터 상하문에서 실행합니다
  • 전체 텍스트 검색 쿼리

  • commontermsquery는 대략 우선순위 조회로 이해할 수 있다. 예를 들어 nothappy는 해피가 함유된 문서를 우선적으로 조회하거나 구조에서 고주파 단어의 조회 일치를 필터링한다. 보통 the, a, not 등 부사를 필터링하여 검색 효율을 높인다. 이 단어들은 단독으로 의미가 없고 조합하면 빠질 수 없다. 예를 들어 해피와 nothappy,common은 먼저 해피를 검색한다.얻은 결과 중 not happy 계산에 필터링_score.
  • intervalsqueryintervalsquery는 사용자가 검색어가 문서에 나타나는 선후 관계를 정확하게 제어할 수 있도록 하고,terms 순서,terms 간의 거리와 그 관계를 포함하는 유연한 제어를 실현합니다. 이 조회가 my_text에서 "my favorite food is cold porridge.",하지만'it's cold my favorite food is porridge'는 일치하지 않습니다.
  •     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-text 검색의 기본 검색으로 모호한 검색을 포함합니다.match의 문법 구조:
  •     POST _search
    {
      "query": {
        "intervals" : {
          "my_text" : {
            "all_of" : {
              "ordered" : true,
              "intervals" : [
                {
                  "match" : {
                    "query" : "my favorite food",
                    "max_gaps" : 0,
                    "ordered" : true
                  }
                },
                {
                  "any_of" : {
                    "intervals" : [
                      { "match" : { "query" : "hot water" } },
                      { "match" : { "query" : "cold porridge" } }
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    }
    
  • match phrasequery 단어 조회, 조회 조건은 한 단어에 따라 처리한다. 예를 들어'He is'는'He is a student'만 조회할 수 있고'He said that is a monstor'는 조회할 수 없다.

  • -match phrase prefix query
        {
            "query":{
                "match": {
                    : {     // field_name  match   top-level  
                        "query" : ""     //  
                        "analyzer":   "" //  
                        "operator" "OR[ ], AND" //  query bool 
                        ..... 
                    }
                }
            }
        }
    
  • multimatchquerymatch의 확장은 여러 문자열이 일치하도록 규정할 수 있습니다.문법 구조와 match가 약간 다르다
  •  ,  
    
    ```
        GET /_search
        {
            "query": {
                "match_phrase_prefix" : {
                    "message" : {
                        "query" : "quick brown f"
                    }
                }
            }
        }
    
    ```
    

    term-level 조회


    구조화된 데이터의 정확한 값을 조회하고term-level은 검색 텍스트를 분석하지 않으며 정확한 값과 일치합니다.
  • exists
  • fuzzy 자동 모호 조회
  • ids
  • 
    GET /_search
    {
      "query": {
        "multi_match" : {
          "query":      "Will Smith",
          "type":       "best_fields",
          "fields":     [ "first_name", "last_name" ],      // field  
          "operator":   "and" 
        }
      }
    }
    
    
    
  • preix
  •         GET /_search
        {
            "query": {
                "ids" : {
                    "values" : ["1", "4", "100"]
                }
            }
        }
    
  • range
  • GET /_search
    {
        "query": {
            "prefix": {
                "user": {
                    "value": "ki"
                }
            }
        }
    }
    
    
  • regexp
  • term은 특정 필드에서 내용이 완전히 같은 문서를 되돌려줍니다.term은 정확한 값 필드 [가격, 제품 ID 또는 사용자 이름]이 있는 문서를 찾을 수 있습니다.
    형식이 텍스트 필드에서term을 사용하지 마십시오. 사용하려면 match를 사용하십시오.elasticSearch는 text 필드에 analysis를 사용하여term 검색의 어려움을 초래합니다
    
    GET _search
    {
        "query": {
            "range" : {
                "age" : {
                    "gte" : 10,
                    "lte" : 20,
                    "boost" : 2.0
                }
            }
        }
    }
    
    
    
  • termsterms의 다중 필드 형식
  • term_set
  • wildcard
  • 좋은 웹페이지 즐겨찾기