1. 程式人生 > >ElasticSearch DSL結構的一些說明

ElasticSearch DSL結構的一些說明

基本結構
{
    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}
}
在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
}
關於 聚合
"aggregations[aggs]" : {
    "<aggregation_name>" : {
        "<aggregation_type>" : {
            <aggregation_body>
        }
        [,"meta" : {  [<meta_data_body>] } ]?
        [,"aggregations" : { [<sub_aggregation>]+ } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*
}
關於 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.

通常情況,由於filter在查詢時不進行評分,並附快取,效率上比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查詢children
has_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'