Hibernate Search Java Spring,仅搜索具有指定ID的实体

时间:2019-05-27 00:13:35

标签: java spring jpa lucene hibernate-search

当我要搜索具有特定ID的实体时遇到问题。我执行了fullTextQuery,一切正常,我想说

仅在这些实体中进行搜索(提供的ID列表):

+(title:slovakia~2 leadText:slovakia~2 body:slovakia~2 software:slovakia~2) +verified:true +eid:(113 | 112 | 3)

enter image description here

然后我得到0个结果,对这些实体进行索引并对其进行持久化,所有这些都应该工作正常,但是它不返回任何结果。

这里是定义的实体属性:

@Id
@GeneratedValue
@Field(name = "eid")
@FieldBridge(impl = LongBridge.class)
private long id;

我尝试了在没有字段桥的情况下使用TermVector.YES,并且也没有任何其他@Field ..批注。所有结果要么例外,要么无结果。

搜索特定ID的正确方法是什么?

例如,这是工作查询: enter image description here

查询创建如下:

    return Optional.of(getQueryBuilder()
            .keyword()
            .onField("eid")
            .matching(stringBuilder.toString())
            .createQuery());

2 个答案:

答案 0 :(得分:1)

在这种情况下,您尝试使用的语法(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()作为其子句之一的另一个联结。

答案 1 :(得分:0)

从我在休眠搜索方面的少量经验来看,只有Ranges似乎适用于整型和长型字段。在您的示例中,我希望以下查询可以正常工作:

QueryBuilder qb = getQueryBuilder();
BooleanJunction<?> idJunction = qb.bool();
 bool.must(NumericRangeQuery.newLongRange("eid", Long.valueOf(eid), Long.valueOf(eid), true, true).createQuery();

在这种情况下,如果提供的值已经是Long值,则装箱的Long.valueOf()是可选的。