如何在spring-data-elasticsearch中的CriteriaQuery中使用“或”运算符

时间:2019-05-16 08:22:47

标签: java elasticsearch spring-data-elasticsearch

最近,我正在尝试在项目中使用spring-data-elasticsearch,遇到了很多问题。昨天我问了一个关于not操作的问题,但我自己解决了。现在,我在尝试使用or运算符。

这就是我想要的:

我想查询一个code不是“ 11”并且其symbol是“ 22”或它的subSymbol是“ 33”的对象。我已经尝试了很多次在很多方面都失败了。看来我无法使其与CriteriaQuery一起使用。我不知道我是否清楚地描述了我的问题。在SQL中,应该这样写,

select from x where x.code!='11' and (x.symbol='22' or x.subSymbol='33')

但是使用CriteriaQuery,如果symbol/subSymbol值匹配并且似乎缺少code条件,我总是会得到结果,其SQL的工作方式如下:

select from x where x.code!='11' or x.symbol='22' or x.subSymbol='33'

这是我尝试的方法:

1.
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and("code").is("11").not()
                .or("symbol").is("22").or("subSymbol").is("33"));
2.
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and("code").is("11").not()
                .or(new Criteria("symbol").is("22").and("subSymbol").is("33")));


3.
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and("code").is("11").not()
                .and(new Criteria("symbol").is("22").or("subSymbol").is("33")));

4.
CriteriaQuery criteriaQuery = new CriteriaQuery(new Criteria()
                .and("code").is("11").not())
                .addCriteria(new Criteria("symbol").is("22").or("subSymbol").is("33"));


List<xx> sampleEntities =
                elasticsearchTemplate.queryForList(criteriaQuery,xx.class);

以上所有方法均失败。

那么有什么办法可以解决我的问题?或者我可能需要尝试NativeSearchQueryBuilder。这真令人沮丧。

1 个答案:

答案 0 :(得分:0)

我认为您需要将您的属性编入术语,因为您将它们用作某些代码(术语)。如果将来需要,可以将现有索引保留为文本。因此,我找到了适合您的案例的本教程。

  

https://www.baeldung.com/spring-data-elasticsearch-queries

因此,如果您在字段上添加@InnerField并使用查询2,但在字段上使用verbatim后缀,则它应该与列表中的查询编号2一起使用。您的字段将类似于code.verbatim,等等...

您还可以考虑移至NativeSearchQueryBuilder