Hibernate搜索 - 多字段排序

问题描述 投票:0回答:2

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

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

基本上在hibernate搜索中寻找解决方案,我们可以通过距离,id来订购。 - 2个字段

hibernate-search
2个回答
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);

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

排序字段之前被忽略了。

© www.soinside.com 2019 - 2024. All rights reserved.