一、概述
Elasticsearch提供基于JSON的完整查询DSL来定义查询。将Query DSL视为查询的AST,由两种类型的子句组成:
叶子查询子句
叶子查询子句在特定字段中查找特定值,例如匹配,词条或范围查询。这些查询可以自己使用。
复合查询子句
复合查询子句包装其他叶或复合查询,并用于以逻辑方式(例如bool或dis_max查询)组合多个查询,或者改变它们的行为(如constant_score查询)。
查询子句的行为有所不同,具体取决于它们是在查询上下文还是过滤器上下文中使用。
二、查询过滤上下文
查询子句的行为取决于它在查询上下文中还是在过滤器上下文中使用:
查询上下文
在查询上下文中使用的查询子句回答了“这个文档如何与此查询子句匹配?”的问题。除了决定文档是否匹配之外,查询子句还会计算一个_score,表示文档与其他文档的匹配程度。
过滤上下文
在过滤器上下文中,查询子句回答“这个文档是否匹配这个查询子句”这个问题?答案是一个简单的是或否 - 没有计算分数。过滤器上下文主要用于过滤结构化数据,例如
此时间戳记是否在2015至2016年范围内?
状态字段是否设置为“已发布”?
经常使用的过滤器将被Elasticsearch自动缓存,以提高性能。 过滤器上下文在查询子句传递给过滤器参数时生效,如bool查询中的filter或must_not参数,constant_score查询中的filter参数或过滤器聚合。
以下是搜索API中查询和过滤器上下文中使用的查询子句的示例。此查询将匹配满足以下所有条件的文档:
标题字段包含单词Search。
内容字段包含单词elasticsearch。
状态字段包含published单词。
publish_date字段包含从2015年1月1日起的日期。
GET /_search { //查询参数指示查询上下文。 "query": { //在查询上下文中使用bool和两个匹配子句,这意味着它们用于评估每个文档的匹配程度。 "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], //过滤器参数指示过滤器上下文。 "filter": [ //term和range范围子句用于过滤器上下文中。他们会过滤掉不匹配的文件,但不会影响匹配文件的分数。 { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
在查询上下文中使用查询子句来处理会影响匹配文档分数(即文档匹配程度如何)的条件,并在过滤器上下文中使用所有其他查询子句。
三、匹配所有查询
3.1、match_all
最简单的查询,匹配所有文档,给他们所有的1.0的_score。
GET /_search { "query": { "match_all": {} } }
_score可以用boost参数改变:
GET /_search { "query": { "match_all": { "boost" : 1.2 } } }
3.2、match_none
这是match_all查询的逆过程,它不匹配任何文档。
GET /_search { "query": { "match_none": {} } }