我正在使用休眠搜索来搜索附近的商店。每个商店都属于超市。 我们曾经使用休眠搜索来获取附近的所有商店。 搜索结果:
Supermaket 1 - Shop 1 (0.5 km)
Supermaket 2 - Shop 1 (1 km)
Supermaket 2 - Shop 2 (1.1 km)
Supermaket 1 - Shop 2 (2 km)
但是最近的需求出现了,我们需要按超级市场对搜索进行分组并在应用上显示出来。
Supermaket 1
Shop 1 (0.5 km)
Shop 2 (2 km)
Supermaket 2
Shop 1 (1 km)
Shop 2 (1.1 km)
@Indexed
@Entity
class Shop {
@Id
@Column(name = "Id")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@ManyToOne
@JoinColumn(name = "SuperMarketId")
@IndexedEmbedded
private SuperMarket superMarket;
@Column(name = "Latitude")
@Latitude(of = "location")
private double latitude;
@Column(name = "Longitude")
@Longitude(of = "location")
private double longitude;
}
@Indexed
@Entity
class SuperMarket {
@Id
@Column(name = "Id")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
}
我正在使用排序字段:
Sort sort = new Sort(
new DistanceSortField(lat, lng, "location"));
query.setSort(sort);
我必须按距离分类并购买我该怎么做。
我尝试过:
Sort sort = new Sort(
new DistanceSortField(lat, lng, "location"),
new SortField("superMarket.id", SortField.Type.STRING, true));
query.setSort(sort);
通常在休眠搜索中寻找解决方案,我们可以按距离,id进行排序。 -2个字段
答案 0 :(得分:0)
或者,您可能对faceting感兴趣,它试图解决相同的问题,但不受订购问题的影响。
如果您真的想要分组...您似乎已经知道了,但是您将需要对数据进行一些后处理。
类似的东西:
List<Shop> shops = fullTextQuery.getResultList();
Map<Supermarket, List<Shop>> results =
shops.stream().collect( Collectors.groupingBy( Shop::getSupermarket, LinkedHashMap::new, Collectors.toList() ) ;
现在有关订单...这取决于您想要什么。假设您的结果是分页的,如果超市1的商店先前位于第2页,您是否希望它出现在第1页而不考虑其距离?即您要先按超级市场排序,然后按距离排序吗?如果是这样,只需执行以下操作:
Sort sort = new Sort(
new SortField("superMarket.id", SortField.Type.STRING, true),
new DistanceSortField(lat, lng, "location")
);
query.setSort(sort);
还是您希望它停留在第二页上,并可能在同一页上显示同一家超市?如果是这样,请使用与问题相同的排序方式:
Sort sort = new Sort(
new DistanceSortField(lat, lng, "location"),
new SortField("superMarket.id", SortField.Type.STRING, true));
query.setSort(sort);
答案 1 :(得分:0)
我终于从“ https://developer.jboss.org/thread/267686”中得出了答案: 您需要将Fields和SortableField批注添加到超市ID:
@Indexed
@Entity
class SuperMarket {
@Id
@Column(name = "Id")
@GeneratedValue(strategy = GenerationType.AUTO)
@Fields({
@Field(name = "id_sort", analyze = Analyze.NO, store = Store.NO, index = Index.NO) })
@SortableField(forField = "id_sort")
private int id;
}
Sort sort = new Sort(
new DistanceSortField(lat, lng, "location"),
new SortField("superMarket.id_sort", SortField.Type.INT, true));
query.setSort(sort);
排序字段以前被忽略了。