Elasticsearch Query DSL概述与查询、过滤上下文

时间:2020-12-04 16:44:43   收藏:0   阅读:16
从本节开始,先详细介绍Elasticsearch Query DSL语法,该部分是SearchAPI的核心基础之一。

Elasticsearch提供了一个基于JSON的完整查询DSL(领域特定语言)来定义查询。把查询DSL看作是查询的AST(抽象语法树),由两种类型的子句组成:

查询子句的行为取决于它是在查询上下文中使用还是在过滤上下文中使用:

经常使用的过滤器(filter context)会被Elasticsearch自动缓存,以提高性能。每当一个查询子句被传递给过滤器参数(filter)时,过滤器上下文就会生效,例如bool查询中的filter或must_not参数、或filter查询中的常量查询(constant_score)或filter查询。

举例如下:

GET /_search
{
  "query": {         // @1
        "bool": {     // @2
              "must": [   
                        { "match": { "title":   "Search"        }},                              // @3
                     { "match": { "content": "Elasticsearch" }}                        // @4
              ],
              "filter": [     // @5
                    { "term":  { "status": "published" }},                                  // @6                   
                                { "range": { "publish_date": { "gte": "2015-01-01" }}}       // @7
                 ]
          } // end bool
    }  // end query
}

代码@1:query参数定义查询上下文,query参数为elasticsearch的查询上下文。

代码@2:使用elasticsearch的bool查询表达式,会在后续详细介绍。

代码@3:查询上下文,使用关键字match,表示title字段中包含"Search"字符即认为匹配。(可以类比关系型数据库 a.title like ‘%Search%‘)

代码@4:查询上下文,使用关键字match,表示content字段中包含"Elasticsearch"字符即认为匹配。

代码@5:定义过滤上下文。

代码@6:使用term(完整匹配),即status字段的值是否是“published”。(相当于关系型数据库的 a.status = ‘published‘)

代码@7:使用range,代表范围匹配,即publish_date字段的值是否大于等于2015-01-01。(相当于a.publish_date >= 2015-01-01‘)。

本文就介绍到这里了,整个系列将进入到ES DSL查询语法的学习中来。接下来将从如下方面详细介绍ES DSL查询语法:


更多文章请关照微信公众号:
技术分享图片

原文:https://blog.51cto.com/15023237/2559601

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!