java - 如何在 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。这太令人沮丧了。
解决方案
我认为您需要将您的属性索引为术语,因为您将它们用作一些代码(命名法)。如果将来需要,您可以将现有索引保留为文本。所以我发现这个教程看起来很容易为你的案例实现。
因此,如果您在字段上添加 @InnerField 并使用查询 2。但verbatim
在字段上使用后缀,它应该与列表中的查询号 2 一起使用。你的领域会像code.verbatim
,等等......
你也可以考虑搬到NativeSearchQueryBuilder
.
推荐阅读
- azure - 您如何明确放弃从主题消息/订阅触发的 azure 函数中的消息?
- python - 用平均值减去矩阵的每个元素,而不导入模块
- typescript - 如何使用 Admin-TS 从 Firebase DB 中检索值
- f# - 如何在 F# 中没有窗口的情况下在屏幕上绘制像素?
- php - 从多维数组中删除每个元素,其中第二个键等于一个变量
- javascript - 是否可以使用 for 循环生成反应道具?
- heroku - 我的免费 webapp dyno 是否有博客,如果有,我如何查看它?
- javascript - 身份验证将我带到个人资料编辑页面
- automationanywhere - 在任何地方以自动化方式杀死谷歌浏览器进程的正确方法
- python - 访问类内常量全局范围变量的 Pythonic 方式?