Поиск в спящем режиме - сортировка по нескольким полям - PullRequest
0 голосов
/ 01 марта 2019

Я использую поиск в спящем режиме для поиска ближайших магазинов.Каждый магазин принадлежит супермаркету.Мы использовали для поиска всех близлежащих магазинов с помощью поиска в спящем режиме.Результаты поиска:

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 голосов
/ 05 марта 2019

Я наконец понял это из "https://developer.jboss.org/thread/267686":. Вам нужно добавить аннотацию Fields и SortableField к идентификатору супермаркета:

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

Поле сортировки ранее игнорировалось.

0 голосов
/ 01 марта 2019

В качестве альтернативы вас может заинтересовать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...