我在一个Hibernate搜索Java应用程序中工作,该应用程序的实体具有索引的数字字段:
@Field
@NumericField
private Long orgId;
我想获取与此属性的Long值列表匹配的实体列表。我使用了“ simpleQueryString”,因为它允许对char |使用“ OR”逻辑。为几个客观价值。我有这样的东西:
queryBuilder.simpleQueryString().onField("orgId").matching("1|3|8").createQuery()
运行mi应用程序后,我得到:
指定的查询'+(orgId:1 orgId:3 orgId:8)'包含基于字符串的子查询,该子查询的目标是数字编码字段'orgId'。检查您的查询或尝试限制目标实体。
所以,有人可以告诉我这段代码有什么问题吗?,还有其他方法可以满足我的需要吗?
================================= 更新1:
yrodiere的答案解决了这个问题,但是我还有另一个疑问,我想验证实体是否与其他字段匹配,我知道我可以使用BooleanJuntion,但是然后我需要混合使用“ must”和“ should”用法对吗?即:
BooleanJunction<?> bool = queryBuilder.bool();
for (Integer orgId: orgIds) {
bool.should( queryBuilder.keyword().onField("orgId").matching(orgId).createQuery() );
}
bool.must(queryBuilder.keyword().onField("name").matching("anyName").createQuery() );
然后,我正在验证实体必须匹配“名称”,并且它们也匹配给定的orgId之一,对吗?
答案 0 :(得分:0)
错误消息显示:
指定的查询[...]包含一个基于字符串的子查询,该子查询以数字编码字段'orgId'为目标。
simpleQueryString
仅可用于定位文本字段。不支持数字字段。
如果您的字符串是通过编程方式生成的,并且具有整数列表,则需要执行以下操作:
List<Integer> orgIds = Arrays.asList(1, 3, 8);
BooleanJunction<?> bool = queryBuilder.bool();
for (Integer orgId: orgIds) {
bool.should( queryBuilder.keyword().onField("orgId").matching(orgId).createQuery() );
}
LuceneQuery query = bool.createQuery();
query
将匹配orgId
字段包含1
,3
或8
的文档。
请参见https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#_combining_queries
编辑:如果需要其他子句,建议不要在相同的布尔连接中混合必须和应该的内容,而应嵌套布尔连接。
例如:
BooleanJunction<?> boolForOrgIds = queryBuilder.bool();
for (Integer orgId: orgIds) {
boolForOrgIds.should(queryBuilder.keyword().onField("orgId").matching(orgId).createQuery());
}
BooleanJunction<?> boolForWholeQuery = queryBuilder.bool();
boolForWholeQuery.must(boolForOrgIds.createQuery());
boolForWholeQuery.must(queryBuilder.keyword().onField("name").matching("anyName").createQuery());
// and add as many "must" as you need
LuceneQuery query = boolForWholeQuery.createQuery();
从技术上讲,您可以 混合“必须”和“应该”,但是效果不会达到您的期望:“应该”子句将变为可选,并且仅在它们出现时才提高得分比赛。因此,这里不是您需要的。