Elasticsearch query和filter的区别
1、关于Query context和filter context
查询语句的表现行为取决于使用了查询上下文方式还是过滤上下文方式。
- Query context:查询上下文,回答了“文档是如何被查询语句匹配的”,此外,也决定了文档是否被匹配上,查询语句也通过计算_score的值来说明文档的匹配度。query context查询方式是通过传递query参数来实现。
- Filter context:过滤上下文,回答了“文档是不是匹配?”,答案一般都是简单的是和否,并不计算_scores的值,过滤上下文查询方式大多用于过滤结构化数据,例如:
- 时间戳(timestamp)是否在2015到2016之间?
- 状态(status)是否是(确切)“published”?
- 过滤上下文通过在bool查询中传递filter或must_not参与来起作用,或者在constant_score查询,或在filter聚合中起作用。
- 例如:
GET /_search { "query": { #query参数说明是query上下文 "bool": { #bool和两个match子句在query上下文中,意味着他们使用score来计算如何与文档匹配。 "must": [ { "match": { "title": "Search" }}, { "match": { "content": "Elasticsearch" }} ], "filter": [ #filter参数说明是filter上下文 { "term": { "status": "published" }}, # term和range应用于filter上下文,它们将过滤不匹配的文档,但不会影响匹配文档的score值。 { "range": { "publish_date": { "gte": "2015-01-01" }}} ] } } }
tip:所以,在需要用score来匹配文档的情况下使用query context,其他情况使用filter context。