为了账号安全,请及时绑定邮箱和手机立即绑定

Hibernate-search 按数字列表搜索

Hibernate-search 按数字列表搜索

大话西游666 2023-09-20 17:24:46
我正在 Hibernate 搜索 Java 应用程序中工作,该应用程序具有一个具有索引数字字段的实体:@Field@NumericFieldprivate Long orgId;我想获取与此属性的 Long 值列表匹配的实体列表。我使用“simpleQueryString”,因为它允许使用“OR”逻辑与 char | 对于几个客观价值。我有这样的事情:queryBuilder.simpleQueryString().onField("orgId").matching("1|3|8").createQuery()运行 mi 应用程序后我得到:指定的查询“+(orgId:1 orgId:3 orgId:8)”包含基于字符串的子查询,其目标是数字编码字段“orgId”。检查您的查询或尝试限制目标实体。那么,有人可以告诉我这段代码有什么问题吗?还有其他方法可以满足我的需要吗?===================================更新1:yrodiere'的答案解决了这个问题,但我还有另一个疑问,我想验证实体是否与其他字段匹配,我知道我可以使用BooleanJuntion,但是我需要混合“必须”和“应该”用法,对吧?IE: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 之一匹配,我说得对吗?
查看完整描述

1 回答

?
烙印99

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”子句将成为可选的,并且只会在匹配时提高文档的分数。所以,这不是您需要的。


查看完整回答
反对 回复 2023-09-20
  • 1 回答
  • 0 关注
  • 56 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信