1 回答
TA贡献1829条经验 获得超13个赞
正如错误消息所说:
指定的查询 [...] 包含基于字符串的子查询,其目标是数字编码字段“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, 3OR的文档8。
请参阅https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#_combining_queries
编辑:如果您需要其他子句,我建议不要在同一个布尔连接中混合“must”和“should”,而是嵌套布尔连接。
例如:
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();
从技术上讲,你可以混合使用“must”和“should”,但效果不会是你所期望的:“should”子句将成为可选的,并且只会在匹配时提高文档的分数。所以,这不是您需要的。
添加回答
举报