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'