Hibernate Search java spring,仅搜索具有指定 ID 的实体
Hibernate Search java spring, searching only entities that have ids as specified
当我想在具有特定 ID 的实体中搜索时遇到问题。我有我执行的 fullTextQuery,它工作正常,当我想说
仅在这些实体中搜索(提供的 ID 列表):
+(title:slovakia~2 leadText:slovakia~2 body:slovakia~2 software:slovakia~2) +verified:true +eid:(113 | 112 | 3)
然后我得到 0 个结果,这些实体已编入索引并持久化,一切都应该正常工作,但它没有 return 任何结果。
这是实体 属性 定义的:
@Id
@GeneratedValue
@Field(name = "eid")
@FieldBridge(impl = LongBridge.class)
private long id;
我已经尝试过,没有场桥,有 TermVector.YES 也没有任何额外的 @Field.. 注释。所有结果要么异常,要么就是没有结果。
在特定 ID 中搜索的正确方法是什么?
例如,这里是工作查询:
查询的创建如下所示:
return Optional.of(getQueryBuilder()
.keyword()
.onField("eid")
.matching(stringBuilder.toString())
.createQuery());
您尝试使用的语法 (113 | 112 | 3)
在此上下文中不正确。不解释 keyword
查询的参数,特别是不支持运算符。
改用与任何提供的 ID 匹配的布尔连接:
List<String> eids = ...;
QueryBuilder qb = getQueryBuilder();
BooleanJunction<?> idJunction = qb.bool();
for (String eid : eids) {
idJunction.should(
qb.keyword()
.onField("eid")
.matching(eid)
.createQuery()
);
}
return idJunction.createQuery();
请注意,如果要添加其他查询,则不应使用相同的连接点。使用另一个包含 idJunction.createQuery()
作为其子句之一的联结。
根据我对 hibernate-search 的一点经验,似乎只有 Ranges 可以很好地处理整数和长字段。在此处的示例中,我希望以下查询可以正常工作:
QueryBuilder qb = getQueryBuilder();
BooleanJunction<?> idJunction = qb.bool();
bool.must(NumericRangeQuery.newLongRange("eid", Long.valueOf(eid), Long.valueOf(eid), true, true).createQuery();
在这种情况下,如果提供的值已经是 Long 值,则 Boxed Long.valueOf()
是可选的。
当我想在具有特定 ID 的实体中搜索时遇到问题。我有我执行的 fullTextQuery,它工作正常,当我想说
仅在这些实体中搜索(提供的 ID 列表):
+(title:slovakia~2 leadText:slovakia~2 body:slovakia~2 software:slovakia~2) +verified:true +eid:(113 | 112 | 3)
然后我得到 0 个结果,这些实体已编入索引并持久化,一切都应该正常工作,但它没有 return 任何结果。
这是实体 属性 定义的:
@Id
@GeneratedValue
@Field(name = "eid")
@FieldBridge(impl = LongBridge.class)
private long id;
我已经尝试过,没有场桥,有 TermVector.YES 也没有任何额外的 @Field.. 注释。所有结果要么异常,要么就是没有结果。
在特定 ID 中搜索的正确方法是什么?
例如,这里是工作查询:
查询的创建如下所示:
return Optional.of(getQueryBuilder()
.keyword()
.onField("eid")
.matching(stringBuilder.toString())
.createQuery());
您尝试使用的语法 (113 | 112 | 3)
在此上下文中不正确。不解释 keyword
查询的参数,特别是不支持运算符。
改用与任何提供的 ID 匹配的布尔连接:
List<String> eids = ...;
QueryBuilder qb = getQueryBuilder();
BooleanJunction<?> idJunction = qb.bool();
for (String eid : eids) {
idJunction.should(
qb.keyword()
.onField("eid")
.matching(eid)
.createQuery()
);
}
return idJunction.createQuery();
请注意,如果要添加其他查询,则不应使用相同的连接点。使用另一个包含 idJunction.createQuery()
作为其子句之一的联结。
根据我对 hibernate-search 的一点经验,似乎只有 Ranges 可以很好地处理整数和长字段。在此处的示例中,我希望以下查询可以正常工作:
QueryBuilder qb = getQueryBuilder();
BooleanJunction<?> idJunction = qb.bool();
bool.must(NumericRangeQuery.newLongRange("eid", Long.valueOf(eid), Long.valueOf(eid), true, true).createQuery();
在这种情况下,如果提供的值已经是 Long 值,则 Boxed Long.valueOf()
是可选的。