作为更复杂的查询的一部分,字段上有一个条件:
boolQuery.should(QueryBuilders.matchQuery("myOptionalField", myValue));
这样,具有匹配myValue值的字段myOptionalField的记录获得了得分奖励。这很好。具有不同价值的那些领域不会获得奖金。
我的新要求是也为缺少此字段的记录提供一些要点。它应小于匹配myValue的记录,但大于具有不匹配值的记录。
我发现这是一个非常标准的要求,但无法找到解决方案。有elasticsearch bool query combine must with OR但它有所不同。
根据文档,在ES中"应该"是OR。所以我试着用:
boolQuery.should(new BoolQueryBuilder()
.should(QueryBuilders.matchQuery("myOptionalField", myValue))
.should(new BoolQueryBuilder().mustNot(QueryBuilders.existsQuery("myOptionalField")))
);
现在这改变了(搞砸了)得分。显然,记录不能匹配嵌套的"应该"条件。
至于得分,我可以在各个地方添加.boost(),但没有什么对我有利。以下是接受评分定义的所有可能位置(请参阅.boost(0.2f)):
boolQuery.should(new BoolQueryBuilder()
.should(QueryBuilders.matchQuery("myOptionalField", myValue).boost(0.2f)).boost(0.2f)
.should(new BoolQueryBuilder().mustNot(QueryBuilders.existsQuery("myOptionalField")).boost(0.2f)).boost(0.2f)
);
内部.boost(0.2f)调用被忽略。外部的不是,但我相信增强应用于外部BoolQueryBuilder(),因此它们互相覆盖。无论如何,问题是任何提升定义都会使得没有myOptionalField的记录获得比匹配myValue的记录更高的分数。
这两个问题是:
1)我的语法是嵌套"应该"在ES中写这个的方法?
2)如何提高分数以获得1st =匹配查询,2nd =字段缺席,3rd =不匹配查询?