elasticsearch 弹性数据搜索中CriteriaQuery与“or”运算符使用

db2dz4w8  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(1)|浏览(396)

最近,我尝试在我的项目中使用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?这太令人沮丧了。

ih99xse1

ih99xse11#

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

相关问题