FunctionScore主要是在原始查询的基础上去修改一下算分的。
而BooleanQuery布尔查询,它不会去修改算分,而是把多个查询语句组合在一起形成新查询。这些被组合的查询语句,我们都称之为叫子查询了,这些子查询,它的组合方式有下面四种,分别是:
·Must:必须、必须成立,必须匹配 比如说你有两到三个字查询,每个都要成立
·should 选择性匹配。比方说你有两个或三个子查询,只要任意匹配一个就行了
·must_not 相反,不能成立
·filter,从字面来看,它也是必须匹配,Must也是必须匹配,确实它俩都是必须匹配,都是”与”的意思。
must not和filter不参与算分
must not和filter不参与算分它们在做搜索过滤时不参与算分。大家都知道ES在做搜索的时候,它不仅仅是判断你这个文档是否匹配,它还要看你这个文档跟关键字之间的相关度,给你打个分儿,分最高要靠前,这个打分我们有非常复杂的一个算分函数BM25;因此每做一次算分,其实是会消耗一些资源的。如果子查询比较多,每一个都参与算分,是不是查询性能就会受到影响,而如果你在使用的时候,你用的是filter查询和must not查询,它们是不参与算分的。
虽然BooleanQuery复合查询里面有这么四种组合关系,但是除了跟算分相关的,一般就是关键字:用户输入的个关键字,除了用户输入的个关键字以外,剩下的过滤条件都应该放在must_not 或者filter里边,尽可能的减少算分,提高查询的效率。
用户输入的关键字,其实你可以放到Must里,因为他要参与算分,
但是下边这些过滤条件品牌也好,价格也好,最好放到 must not或者filter当中。因为放到must_not或者filter里,不存算分,性能更好:
举例子:
must not和filter不参与算分:
放到must里面:
must参与算分,现在我的must里边就有两个条件了,我们来再运行一次,结果依然是三条。同样还是刚才的这几个,但是让大家看算分是不是变了,变成二点多分了,刚才是不是一点几分
如果说你再把must_not也加进去,算分还是会受影响:
所以放到must里面的,或者是should里面的,都会影响算分,都会参与算分。
参与算分的条件越多,性能就会越差,所以这些过滤条件大家一定要根据你自己的需求看是应该放在哪里合适