ElasticSearch DSL 구조에 대한 설명

6249 단어 elasticsearch
elasticsearch(계내약칭es)를 처음 접하는 아동화에 대해 말하자면 DSL은 매우 난해하고 이해하기 어렵다. 왜 이렇게 끼워 넣었는지 모르겠다. 스스로 쓰면 자꾸 실수가 생길 수 있다. 다음에 DSL을 읽을 수 있는 아이디어를 줄게. 신은 뛰어넘을 수 있다.
공식 문서:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html https://www.elastic.co/guide/en/elasticsearch/reference/current/search.html
기본 구조
{
    QUERY_NAME: {
        ARGUMENT: VALUE,
        ARGUMENT: VALUE,...
    }
}
 
{
    QUERY_NAME: {
        FIELD_NAME: {
            ARGUMENT: VALUE,
            ARGUMENT: VALUE,...
        }
    }
}


GET /_search?pretty
{"explain":true,
 "version":true,
 "from":0,
 "size":10,
 "stored_fields":["field1","field2"],
 "query":{QUERY_CLAUSE},
 facets:{FACETS_CLAUSE},
 "_source": {},
 "script_fields":{},
 "post-filter":{},
 "highlight":{},
 "track_scores":true,
 "sort":{SORT_CLAUSE}
}

참고:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-stored-fields.html
Top Level query에서 가능한 조합입니다.
{term:{TERM_QUERY} 자세한 내용은
| terms: {TERMS_QUERY} 자세한 내용은
| terms_set: {TERMS_SET_QUERY} 자세한 내용은
| range: {RANGE_QUERY} 자세한 내용은
| prefix: {PREFIX_QUERY} 자세한 내용은
| exists:{EXISTS_QUERY} 자세한 내용은
| wildcard: {WILDCARD_QUERY} 자세한 내용은
| match_all:{MATCH_ALL_QUERY} 자세한 내용은
| match_none: {MATCH_NONE_QUERY} 자세한 내용은
| match: {MATCH_QUERY} 자세한 내용은
| match_phrase: {MATCH_PHRASE_QUERY} 자세한 내용은
| match_phrase_prefix: {MATCH_PHRASE_PREFIX_QUERY} 자세한 내용은
| multi_match: {MULTI_MATCH_QUERY} 자세한 내용은
| common: {COMMON_TERM_QUERY} 자세한 내용은
| queryString: {QUERY_STRING_QUERY} 자세한 내용은
| simple_query_string: {SIMPLE_QUERY_STRING_QUERY} 자세한 내용은
| bool: {BOOLEAN_QUERY} 자세한 내용은
| dis_max: {DISMAX_QUERY} 자세한 내용은
| constant_score:{CONSTANT_SCORE_QUERY} 자세한 내용은
| nested: {NESTED_QUERY} 자세한 내용은
returns the parent doc that have child doc matches the query

| has_child:{HAS_CHILD_QUERY} 자세한 내용은
returns the child documents which associated parents have matched

| has_parent: {HAS_PARENT_QUERY} 자세한 내용은
| parent_id: {PARENT_ID_QUERY} 자세한 내용은
| boosting: {BOOSTING_QUERY} 자세한 내용은
| function_score:{FUNCTION_SCORE_QUERY} 자세한 내용은
| fuzzy: {FUZZY_QUERY} 자세한 내용은
| regexp: {REGEXP_QUERY} 자세한 내용은
| type: {TYPE_QUERY} 자세한 내용은
| ids:{IDS_QUERY} 자세한 내용은
| more_like_this:{MORE_LIKE_THIS_QUERY} 자세한 내용은
| percolate: {PERCOLATE_QUERY} 자세한 내용은
| Span_queries 자세한 내용은
}
FILTER_ 정보CLAUSE의 조합
{ query:{QUERY_CLAUSE}
| term:{TERM_FILTER}
| range:{RANGE_FILTER}
| prefix:{PREFIX_FILTER}
| wildcard:{WILDCARD_FILTER}
| bool:{BOOLEAN_FILTER}
| constantScore:{CONSTANT_SCORE_QUERY}
}

FACETS_ 정보CLAUSE의 조합
{ $FACET_NAME_1:
 {filter_clause},
 $FACET_NAME_2:
 {filter_clause},
 ...
}

BOOLEAN_ 정보FILTER 조합
{
   must:
    {FILTER_CLAUSE}
  | [{filter_clause},...],
   should:
    {FILTER_CLAUSE}
  | [{filter_clause},...],
   mustnot:
    {FILTER_CLAUSE}
  | [{filter_clause},...],
   minimum_should_match
}

BOOLEAN_ 정보QUERY의 조합
{
    must:{QUERY_CLAUSE}| [{QUERY_CLAUSE},...],
  should:{QUERY_CLAUSE}|[{QUERY_CLAUSE},...],
 mustnot:{QUERY_CLAUSE}|[{QUERY_CLAUSE},...],
   boost:FLOAT,
   minimum_should_match
}

집합 정보
참조:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html
"aggregations[aggs]" : {
    "" : {
        "" : {
            
        }
        [,"meta" : {  [] } ]?
        [,"aggregations" : { []+ } ]?
    }
    [,"" : { ... } ]*
}

query와 filter 사용 장면
As a general rule, use query clauses for full-text search or for any condition that should affect the relevance score, and use filters for everything else.
통상적으로 필터는 조회할 때 점수를 매기지 않고 캐시를 첨부하기 때문에query보다 효율이 높다.
모/자 관계 예
branch가employee의 부모 문서라고 가정합니다
children을 통해 parents has_ 찾기child 조회와 필터는children의 내용에 따라parent 문서를 찾을 수 있습니다.
1980년에 태어난 직원을 포함한 모든 지부
GET /company/branch/_search
{
  "query": {
    "has_child": {
      "type":       "employee",
      "score_mode": "max",  --none( ) max,min,avg,sum.  。
      "query": {
        "match": {
          "name": "Alice Smith"
        }
      }
    }
  }
}

parent를 통해 childrenhas_ 조회parent 조회는parents의 데이터를 바탕으로children을 되돌려줍니다.
GET /company/employee/_search
{
  "query": {
    "has_parent": {
      "type": "branch", 
      "query": {
        "match": {
          "country": "UK"
        }
      }
    }
  }
}

has_parent 필터의 결과는 캐시되지 않습니다. 일반적인 캐시 메커니즘은has_parent 필터의 내부 filter에 있습니다.parent-child 지원children 집합parent 집합은 지원되지 않습니다.
국가에 따라 직원들이 가장 좋아하는 취미를 확정하다.
GET /company/branch/_search?search_type=count
{
  "aggs": {
    "country": {
      "terms": {  
        "field": "country"    
      },
      "aggs": {
        "employees": {
          "children": {   -- children   parent   children   employee。
            "type": "employee"
          },
          "aggs": {
            "hobby": {
              "terms": {  
                "field": "employee.hobby"  -- employee child   hobby  。
              }
            }
          }
        }
      }
    }
  }
}

es-sql의 사용법http://localhost:9200/_sql/_explain?sql=select member_id as a from label_20180205 where mobile = '13627182930'
“`http://localhost:9200/_sql?sql=select * from indexName limit 10““
자세한 내용은 다음을 참조하십시오.https://github.com/NLPchina/elasticsearch-sql/wiki

좋은 웹페이지 즐겨찾기