简介
Elasticsearch 使用的查询语言(DSL)拥有一套查询组件,这些组件可以以无限组合的方式进行搭配。这套组件可以在以下两种情况下使用:过滤上下文(filtering context)和查询上下文(query context)。
说明
当使用于过滤上下文时,查询被设置成一个“不评分”或者“过滤”查询。即这个查询只是简单的问一个问题:“这篇文档是否匹配?”。回答也是非常的简单,yes 或者 no ,二者必居其一。
典型用法
created 时间是否在 2013 与 2014 这个区间?
status 字段是否包含 published 这个单词?
lat_lon 字段表示的位置是否在指定点的 10km 范围内?
当使用于查询上下文时,查询就变成了一个“评分”的查询。和不评分的查询类似,也要去判断这个文档是否匹配,同时它还需要判断这个文档匹配的有 多好(匹配程度如何)。
性能差异
过滤查询(Filtering queries)只是简单的检查包含或者排除,这就使得计算起来非常快。考虑到至少有一个过滤查询(filtering query)的结果是 “稀少的”(很少匹配的文档),并且经常使用不评分查询(non-scoring queries),结果会被缓存到内存中以便快速读取,所以有各种各样的手段来优化查询结果。
相反,评分查询(scoring queries)不仅仅要找出匹配的文档,还要计算每个匹配文档的相关性,计算相关性使得它们比不评分查询费力的多。同时,查询结果并不缓存。
语法
query的基础语法
GET movies/_search
{
"query": {
"match": {
"title": {
"query": "beautiful"
}
}
}
}
filter的语法,一般跟着constant_score、bool
GET movies/_search
{
"query": {
"constant_score": {
"filter": {
"term": {
"title": "beautiful"
}
}
}
}
}
GET movies/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"title": "beautiful"
}
},
{
"range": {
"movieId": {
"gte": 94,
"lte": 1000
}
}
}
]
}
}
}
如何选择查询与过滤
通常的规则是,使用查询(query)语句来进行全文搜索或者其它任何需要影响相关性得分的搜索。除此以外的情况都使用过滤(filters)。