如何在 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 重新创建它们。
我正在使用配置为 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 重新创建它们。