如何过滤 Hibernate Search 结果以仅包含排序期间具有特殊字段值的对象之后的对象?
How to filter Hibernate Search results to include only that objects which are after object with special field value during sort?
我的存储库中有当前方法:
List<Record> getSortedByDate(int limit, int lastId){
FullTextSession fullTextSession = fullTextSession();
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Record.class).get();
// some extra matching
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(finalQuery, Record.class);
fullTextQuery.setMaxResults(limit);
fullTextQuery.setSort(new Sort(new SortField("created", SortField.Type.LONG, false)));
// ??? here I have to restrict results to include all records with id
// which is after lastId in context of current sort
return fullTextQuery.list();
}
我有当前实体:
@Entity
@Indexed
public class Record{
@Id
@GeneratedValue
private int id;
@Field
@SortableField
@DateBridge(resolution = DAY)
private Date created;
***
}
我正在使用 "created" 字段对我的搜索结果进行排序:
我只需要 return 对象,在这种排序的上下文中,这些对象位于具有给定 "id" 字段值的对象之后。例如,如果我在索引中有 3 条记录:
{"id": 3, "created": "27.04.13"},
{"id": 1, "created": "29.04.15"},
{"id": 4, "created": "7.10.15"}
并且我的方法收到 lastId
1 它必须 return 最后一条记录。
我需要这样做,因为我必须通过排序实现正确的分页。
更新
此外,将来我不仅需要按日期排序,还需要按其他字段排序,例如 rating
(整数)和 reviewsCount
(整数),因此按范围限制结果可能不是解决方案,因为多条记录可能具有相同的评级或相同的评论数量。
更新 2
我将@Gunnar 的回答与这种过滤相结合,看起来很有效。
Date limitValue = session().get(Record.class, lastId).getCreated();
mainJunction.must(queryBuilder.range().onField("created").above(limitValue).createQuery());
mainJunction.must(queryBuilder.phrase().onField("id").sentence(String.valueOf(lastId)).createQuery()).not();
..其中 session()
是 Hibernate DB 会话。现在我可以安全地使用 rating
或 reviewsCount
排序。
您可以使用给定的 ID 加载 Record
,然后将查询结果限制为在该日期之后创建的记录:
Record lastRecord = ...;
QueryBuilder queryBuilder = fullTextSession
.getSearchFactory()
.buildQueryBuilder()
.forEntity(Record.class).get();
Query query = queryBuilder.range()
.onField( "created" )
.above( lastRecord.getCreated() )
.createQuery();
FullTextQuery fullTextQuery = fulllTextSession.createFullTextQuery(
query, Record.class
);
您可能只需要选择比 DAY
更精细的日期分辨率,以便在同一天创建的多个记录中包装页面时获得正确的排序。
我的存储库中有当前方法:
List<Record> getSortedByDate(int limit, int lastId){
FullTextSession fullTextSession = fullTextSession();
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Record.class).get();
// some extra matching
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(finalQuery, Record.class);
fullTextQuery.setMaxResults(limit);
fullTextQuery.setSort(new Sort(new SortField("created", SortField.Type.LONG, false)));
// ??? here I have to restrict results to include all records with id
// which is after lastId in context of current sort
return fullTextQuery.list();
}
我有当前实体:
@Entity
@Indexed
public class Record{
@Id
@GeneratedValue
private int id;
@Field
@SortableField
@DateBridge(resolution = DAY)
private Date created;
***
}
我正在使用 "created" 字段对我的搜索结果进行排序:
我只需要 return 对象,在这种排序的上下文中,这些对象位于具有给定 "id" 字段值的对象之后。例如,如果我在索引中有 3 条记录:
{"id": 3, "created": "27.04.13"},
{"id": 1, "created": "29.04.15"},
{"id": 4, "created": "7.10.15"}
并且我的方法收到 lastId
1 它必须 return 最后一条记录。
我需要这样做,因为我必须通过排序实现正确的分页。
更新
此外,将来我不仅需要按日期排序,还需要按其他字段排序,例如 rating
(整数)和 reviewsCount
(整数),因此按范围限制结果可能不是解决方案,因为多条记录可能具有相同的评级或相同的评论数量。
更新 2 我将@Gunnar 的回答与这种过滤相结合,看起来很有效。
Date limitValue = session().get(Record.class, lastId).getCreated();
mainJunction.must(queryBuilder.range().onField("created").above(limitValue).createQuery());
mainJunction.must(queryBuilder.phrase().onField("id").sentence(String.valueOf(lastId)).createQuery()).not();
..其中 session()
是 Hibernate DB 会话。现在我可以安全地使用 rating
或 reviewsCount
排序。
您可以使用给定的 ID 加载 Record
,然后将查询结果限制为在该日期之后创建的记录:
Record lastRecord = ...;
QueryBuilder queryBuilder = fullTextSession
.getSearchFactory()
.buildQueryBuilder()
.forEntity(Record.class).get();
Query query = queryBuilder.range()
.onField( "created" )
.above( lastRecord.getCreated() )
.createQuery();
FullTextQuery fullTextQuery = fulllTextSession.createFullTextQuery(
query, Record.class
);
您可能只需要选择比 DAY
更精细的日期分辨率,以便在同一天创建的多个记录中包装页面时获得正确的排序。