ES 搜索(4)——Query DSL及query context VS filter context
Elasticsearch提供基于JSON的完整查询DSL(Domain Specific Language)来定义查询。
Query DSL 由两种子句构成:
1.叶子查询子句:
在特定field中查询特定的值,如match、term、range查询等,这些叶子查询子句可以单独使用。
2.复合查询子句:
复合查询子句包裹叶子查询子句,也可以嵌套复合查询子句,按逻辑组合查询结果,如bool、dis_max,或者改变查询规则,如constant_score 查询。
Query上下文 VS Filter上下文:查询子句的行为取决于query还是filter。
1.query context:query要做的事情是判断该文档如何匹配查询语句,这样的查询语句会计算一个得分(_score)表示该文档与其他文档的匹配度。查询语句传入query参数时查询有效。
GET /_search { "query" : { "term" : { "user" : "kimchy" } } }
2.filter context :filter要做的事情是判断该文档是否匹配该查询语句,要么是,要么否,不计算得分,通常用来过滤结构化数据,如是否在2016-2018时间范围内,status是否是published状态等。过滤查询的结果通常会自动缓存,加快查询。传入filter参数时,查询有效,如:bool查询中的filter或must_not参数,constant_score中的filter参数,filter aggregation等。
#query 指定是query context;bool中的两个match查询相关内容,决定文档的匹配度;filter过滤掉不符合条件的文档,但是不影响匹配文档的得分。
curl -XGET 'localhost:9200/_search?pretty' -H 'Content-Type: application/json' -d' { "query": { "bool": { "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ { "term": { "status": "published" }}, { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } } '