ElasticSearch匹配字段或字段不存在(评分,不过滤)

时间:2017-01-23 10:19:57

标签: elasticsearch

作为更复杂的查询的一部分,字段上有一个条件:

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 =不匹配查询?

0 个答案:

没有答案