elasticsearch的查询器query与过滤器filter

Query查询器 与 Filter 过滤器

尽管我们之前已经涉及了查询DSL,然而实际上存在两种DSL:查询DSL(query DSL)和过滤DSL(filter DSL)。

过滤器(filter)通常用于过滤文档的范围,比如某个字段是否属于某个类型,或者是属于哪个时间区间

* 创建日期是否在2014-2015年间?

* status字段是否为success?

* lat_lon字段是否在某个坐标的10公里范围内?

查询器(query)的使用方法像极了filter,但query更倾向于更准确的查找。

* 与full text search的匹配度最高

* 正则匹配

* 包含run单词,如果包含这些单词:runs、running、jog、sprint,也被视为包含run单词

* 包含quick、brown、fox。这些词越接近,这份文档的相关性就越高

查询器会计算出每份文档对于某次查询有多相关(relevant),然后分配文档一个相关性分数:_score。而这个分数会被用来对匹配了的文档进行相关性排序。相关性概念十分适合全文搜索(full-text search),这个很难能给出完整、“正确”答案的领域。

query filter在性能上对比:filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。

如果你的查询是范围和类型比较粗大的,用filter;如果是那种精准的,就用query来查询。 

个人理解:如果需要全文搜索相关度评分排序的,用query,需要类型过滤,精确匹配,用filter。另外,由于过滤是对检索后的结果进行过滤,所以查询需要尽量使用索引或者关键字段。