3

前言

Domain Specific Language
领域专用语言
Elasticsearch provides a full Query DSL based on JSON to define queries
  • Elasticsearch 提供了基于 JSON 的 DSL 来定义查询。
  • DSL 由叶子查询子句复合查询子句两种子句组成。
  • 本文适配 Elasticsearch 7.x 版本
  • 推荐学习阮一鸣《Elasticsearch 核心技术与实战
  • Elasticsearch 查询层级图

ES查询层级图

Query 上下文和 Filter 上下文

  • 在 query 上下文和 filter 上下文中,查询子句的行为会有所不同。(Query and filter context)
  • filter context 有缓存、不算分,查询速度更快

叶子查询子句

Leaf query clauses,叶子查询子句

全文查询

Full text queries,全文查询

全文查询关键字

intervals
match
match_bool_prefix
match_phrase
match_phrase_prefix
multi_match
query_string
simple_query_string

match 查询示例

  • 示例
GET /_search
{
  "query": {
    "match": {
      "message": {
        "query": "this is a test"
      }
    }
  }
}

term 级查询

term 级查询关键字

exists
fuzzy
ids
prefix
range
regexp
term
terms
terms_set
type
wildcard

term 查询示例

  • 示例
GET my_index/_search?pretty
{
  "query": {
    "term": {
      "full_text": "Quick Brown Foxes!"
    }
  }
}

range 查询示例

  • 示例
GET _search
{
  "query": {
    "range": {
      "age": {
        "gte": 10,
        "lte": 20,
        "boost": 2
      }
    }
  }
}

复合查询子句

Compound query clauses,复合查询子句

bool query

  • 布尔查询的子句类型有四种: must、filter、should、must_not
must
算分
返回的文档必须满足 must 子句的条件
多个查询条件的完全匹配,相当于 AND
filter
不算分的 must
should
算分
在一个 bool 查询中,如果没有 must 或者 filter,
有一个或者多个should子句,那么只要满足一个就可以返回。
minimum_should_match 参数定义了至少满足几个子句
至少有一个查询条件匹配,相当于 OR
must_not
不算分
返回的文档必须不满足 must_not 定义的条件
多个查询条件的相反匹配,相当于 NOT
  • 示例
POST _search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user" : "kimchy" }
      },
      "filter": {
        "term" : { "tag" : "tech" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 10, "lte" : 20 }
        }
      },
      "should" : [
        { "term" : { "tag" : "wow" } },
        { "term" : { "tag" : "elasticsearch" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

boosting query

  • 示例
GET /_search
{
  "query": {
    "boosting": {
      "positive": {
        "term": {
          "text": "apple"
        }
      },
      "negative": {
        "term": {
          "text": "pie tart fruit crumble tree"
        }
      },
      "negative_boost": 0.5
    }
  }
}

constant_score query

  • 示例
GET /_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "user": "kimchy"
        }
      },
      "boost": 1.2
    }
  }
}

dis_max query

  • 示例
GET /_search
{
  "query": {
    "dis_max": {
      "queries": [
        {
          "term": {
            "title": "Quick pets"
          }
        },
        {
          "term": {
            "body": "Quick pets"
          }
        }
      ],
      "tie_breaker": 0.7
    }
  }
}

function_score query

  • 示例
GET /_search
{
  "query": {
    "function_score": {
      "query": {
        "match_all": {}
      },
      "boost": "5",
      "random_score": {},
      "boost_mode": "multiply"
    }
  }
}
本文出自 qbit snap

qbit
268 声望279 粉丝