休眠搜索-多字段排序

时间:2019-03-01 06:56:31

标签: hibernate-search

我正在使用休眠搜索来搜索附近的商店。每个商店都属于超市。 我们曾经使用休眠搜索来获取附近的所有商店。 搜索结果:

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个字段

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);

排序字段以前被忽略了。