首页 > 解决方案 > 如何在 spring-data-elasticsearch 中将“或”运算符与 CriteriaQuery 一起使用

问题描述

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

这是我想要的:

我想查询一个code不是“11”并且它symbol是“22”或它subSymbol是“33”的对象。我以多种方式尝试了很多次但失败了。似乎我无法让它工作条件查询。我不知道我是否清楚地描述了我的问题。而在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。这太令人沮丧了。

标签: javaelasticsearchspring-data-elasticsearch

解决方案


我认为您需要将您的属性索引为术语,因为您将它们用作一些代码(命名法)。如果将来需要,您可以将现有索引保留为文本。所以我发现这个教程看起来很容易为你的案例实现。

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

因此,如果您在字段上添加 @InnerField 并使用查询 2。但verbatim在字段上使用后缀,它应该与列表中的查询号 2 一起使用。你的领域会像code.verbatim,等等......

你也可以考虑搬到NativeSearchQueryBuilder.


推荐阅读