一、Filter DSL
### --- Filter DSL
~~~ Elasticsearch中的所有的查询都会触发相关度得分的计算。
~~~ 对于那些不需要相关度得分的场景下,Elasticsearch以过滤器的形式提供了另一种查询功能,
~~~ 过滤器在概念上类似于查询,但是它们有非常快的执行速度,
~~~ # 执行速度快主要有以下两个原因:
~~~ 过滤器不会计算相关度的得分,所以它们在计算上更快一些。
~~~ 过滤器可以被缓存到内存中,这使得在重复的搜索查询上,其要比相应的查询快出许多。
~~~ 为了理解过滤器,可以将一个查询(像是match_all,match,bool等)和一个过滤器结合起来。
~~~ 我们以范围过滤器为例,它允许我们通过一个区间的值来过滤文档。
~~~ 这通常被用在数字和日期的过滤上。
~~~ 下面这个例子使用一个被过滤的查询,其返回price值是在200到1000之间(闭区间)的书。
### --- 示例
POST /book/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"range": {
"price": {
"gte": 200,
"lte": 1000
}
}
}
}
}
}
~~~ 分解上面的例子,被过滤的查询包含一个match_all查询(查询部分)和一个过滤器(filter部分)。
~~~ 可以在查询部分中放入其他查询,在filter部分放入其它过滤器。
~~~ 在上面的应用场景中,由于所有的在这个范围之内的文档都是平等的(或者说相关度都是一样的),
~~~ 没有一个文档比另一个文档更相关,所以这个时候使用范围过滤器就非常合适了。
~~~ 通常情况下,要决定是使用过滤器还是使用查询,你就需要问自己是否需要相关度得分。
~~~ 如果相关度是不重要的,使用过滤器,否则使用查询。
~~~ 查询和过滤器在概念上类似于SELECT WHERE语句。
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor