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() 是可选的。