休眠搜索按数字列表进行搜索

时间:2019-10-04 00:02:37

标签: java lucene hibernate-search

我在一个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之一,对吗?

1 个答案:

答案 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字段包含138的文档。

请参见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();

从技术上讲,您可以 混合“必须”和“应该”,但是效果不会达到您的期望:“应该”子句将变为可选,并且仅在它们出现时才提高得分比赛。因此,这里不是您需要的。