最近,我尝试在我的项目中使用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条答案
按热度按时间ih99xse11#
我认为你需要索引你的属性作为术语,因为你使用他们作为一些代码(nomenclatures)。你可以保持现有的索引作为文本,如果你需要它在未来。所以我发现这个教程,它看起来很容易实现为您的情况。
https://www.baeldung.com/spring-data-elasticsearch-queries
因此,如果您在字段上添加@InnerField并使用查询2,但在字段上使用
verbatim
后缀,则它应与列表中的查询2一起工作。您的字段将类似于code.verbatim
,等等...您也可以考虑迁移到
NativeSearchQueryBuilder
。