当我要搜索具有特定ID的实体时遇到问题。我执行了fullTextQuery,一切正常,我想说
仅在这些实体中进行搜索(提供的ID列表):
+(title:slovakia~2 leadText:slovakia~2 body:slovakia~2 software:slovakia~2) +verified:true +eid:(113 | 112 | 3)
然后我得到0个结果,对这些实体进行索引并对其进行持久化,所有这些都应该工作正常,但是它不返回任何结果。
这里是定义的实体属性:
@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());
答案 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()
是可选的。