Elasticsearch query与filter

Elasticsearch filter与query教程

Elasticsearch 中的查询有 filter 和 query 两种形式,filter,仅仅只是按照搜索条件过滤出需要的数据而已,不计算任何相关度分数,对相关度没有任何影响。query,会去计算每个 document 相对于搜索条件的相关度,并按照相关度进行排序。

Elasticsearch query与filter对比

一般来说,如果你是在进行搜索,需要将最匹配搜索条件的数据先返回,那么用 query。如果你只是要根据一些条件筛选出一部分数据,不关注其排序,那么用 filter。

除非是你的这些搜索条件,你希望越符合这些搜索条件的 document 越排在前面返回,那么这些搜索条件要放在 query 中;如果你不希望一些搜索条件来影响你的 document 排序,那么就放在 filter 中即可。

filter与query性能

filter,不需要计算相关度分数,不需要按照相关度分数进行排序,同时还有内置的自动 cache 最常使用 filter 的数据。

query,相反,要计算相关度分数,按照分数进行排序,而且无法 cache 结果。

案例

query与filter

我们在 Kibana 的控制台上,输入以下代码,新建一个文档

PUT /haicodernet/_doc/1 { "index":"www.haicoder.net", "name" : "javascript", "desc" : "javascript module", "categorys" : 5, "author" : "jobs steven", "tags": [ "javascript", "vue" ] }

输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:

20_Elasticsearch query dsl与filter.png

我们看到,此时我们创建文档成功了,现在,我们再次输入以下代码,再次创建一条文档:

PUT /haicodernet/_doc/2 { "index":"www.haicoder.net", "name" : "server", "desc" : "server module", "categorys" : 10, "author" : "cainiao pei", "tags": [ "server", "python" ] }

输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:

21_Elasticsearch query dsl与filter.png

同样,我们再次创建一条记录,使用如下命令:

PUT /haicodernet/_doc/3 { "index":"www.haicoder.net", "name" : "tools", "desc" : "tools module", "categorys" : 15, "author" : "cainiao pei", "tags": [ "tools", "vim" ] }

即,我们再次成功创建了一个文档,现在,我们使用 DSL 搜索 author 字段必须是 “cainiao pei” 并且 categorys 大于等于 15 的记录,具体命令如下:

GET /haicodernet/_search { "query": { "bool": { "must": [ { "match": { "author": "cainiao pei" } } ], "filter": { "range": { "categorys": { "gte": 15 } } } } } }

输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:

22_Elasticsearch query dsl与filter.png

我们看到,我们查询了满足条件的记录。

Elasticsearch filter与query总结

Elasticsearch 中的查询有 filter 和 query 两种形式,filter,仅仅只是按照搜索条件过滤出需要的数据而已,不计算任何相关度分数,对相关度没有任何影响。

query,会去计算每个 document 相对于搜索条件的相关度,并按照相关度进行排序。