1. es单个条件查询和组合查询
es的query DSL(Domain Specific Language),都是json格式,一般分为两大类
1.单个条件查询
这种一般是针对index中的某一个field进行个别value的查询,比如 mathc,term,range 查询等等。这些查询一般可以独立使用。
2.组合查询
这种查询一般是将单个条件的查询组合起来,只是起到组合的作用,比如bool, dis_max 查询,或者是修改查询的一些查询比如constant_score查询
2.query和filter context
默认情况下,Elasticsearch按相关性得分对匹配的搜索结果进行排序,以衡量每个文档与查询的匹配程度。
相关性分数是一个正浮点数,在搜索API的_score元字段中返回。 _score越高,文档越相关。尽管每种查询类型可以用不同的方式地计算相关性分数,但是分数计算还取决于查询子句是在query context中还是在filter context中运行。
1. query context
在query context中,查询子句回答以下问题:“此文档与该查询子句的匹配程度如何?”除了确定文档是否匹配之外,查询子句还计算_score元字段中的相关性得分。
只要将查询子句传递到query
参数(例如搜索API中的query
参数),query context就有效。
2. filter context
在filter context中,查询子句回答问题“此文档是否与此查询子句匹配?”答案是简单的“是”或“否”,即不计算分数。filter context主要用于过滤结构化数据,例如下面的过滤:
- timestamp 字段是否在2015年至2016年的范围内?
- status 状态字段设置为“已发布”吗?
常用过滤器将由Elasticsearch自动缓存,以提高性能。
只要将查询子句传递到过滤器参数(例如bool查询中的filter
或must_not
参数,constant_score查询中的filter参数或过滤器聚合),filter context即有效。这一句也说明了filter context的使用场景。
3.使用样例
GET /_search
{
"query": { # 对应的query标识了一个query context
"bool": { # bool和对应的math都是对应了query context
"must": [
{ "match": { "title": "Search" }},
{ "match": { "content": "Elasticsearch" }}
],
"filter": [ # 这里filter标识了一个filter context,下面的term,range都是在filter context中,不会影响score的计算
{ "term": { "status": "published" }},
{ "range": { "publish_date": { "gte": "2015-01-01" }}}
]
}
}
}
这个查询要求下面的条件都要满足
- tiele field中有 “Search” 单词
- content field中有 Elasticsearch 单词
- status field 严格等于published
- publish_date 的日期大于 “2015-01-01”