如何在 HIbernate 搜索中对同一字段进行搜索和排序

How to search and sort on the same field in HIbernate search

我正在使用配置为 elasticsearch 后端的 Hibernate Search 6。

@Indexed
    public class Book extends PanacheEntity{
      @FullTextField
      public String title;
      @GenericField
      public Double price;
    } 

我可以在价格范围内过滤图书的价格字段,如下所示:

  Search.session(entityManager)
                .search(Book.class)
                .predicate(f -> f.bool(b -> {
    b.must(f.range().field("price").lessThan(50));
    }));

我也希望能够按价格对搜索结果进行排序。 为此,我将字段定义更改为

@GenericField(sortable = Sortable.YES)
    private Double price;

我排序如下:

 .sort(f -> f.composite(b -> {
b.add(f.field("price");
 } ) ) 

我收到如下错误,看起来是 Elastic 抛出的

Can\u0027t load fielddata on [offer.price] because fielddata is unsupported on fields of type [double]. Use doc values instead.

我已经看到 Can you sort and search on same field with Hibernate/Lucene? 但我在 Hibernate 搜索 6 中没有看到等效的注释

带有 sortable = Sortable.YES 的代码应该可以按预期工作。

Elasticsearch 返回的错误让我认为您的架构("mapping" 注册到 Elasticsearch 集群)可能已过时。

您可以通过使用 validate lifecycle strategy 启动 Hibernate Search 来检查这一点。 如果出现错误,则表示您的模式已过时。更新它的最简单解决方案是删除 Elasticsearch 索引并让 Hibernate Search 重新创建它们。