在没有嵌入式索引的情况下跨两个实体进行 Hibernate 搜索
Hibernate search across two entities without an embedded index
我正在尝试使用 Hibernate Search 6 和弹性搜索
我正在尝试构建的一个简单示例如下。
我有一个 Book
实体,它包含 title
、authorName
、genre
、price
等信息
我有一个 Shop
实体,其中包含 shopName
、phone
、email
、location
等信息
我有一个 "joining table" 可以在角落和商店之间进行多对多映射。 (一本书可以在很多店,一个店可以有很多书)
我正在尝试按名称和位置进行搜索,最好是在距离输入最近的位置查找一本书。文档中的标准书籍作者示例需要一个 IndexedEmbedded
注释,这在我的情况下是不可能的,因为我使用的是连接 table。
有没有其他方法可以解决这个问题
我的实体
@Indexed
public class Book extends PanacheEntity{
public String title;
public String authorName;
@OneToMany(mappedBy = "book", fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE })
public List<BookShopRelation> bookShopRelation = new ArrayList<>();
}
@Indexed
public class Shop extends PanacheEntity{
public String name;
public String city;
@OneToMany(mappedBy = "shop", fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE })
private List<BookShopRelation> bookShopRelation = new ArrayList<>();
}
@Indexed
public class BookShopRelation extends PanacheEntity{
@JoinColumn(name = "shop_id")
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@IndexedEmbedded
private Shop shop;
@JoinColumn(name = "offer_id")
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@IndexedEmbedded
private Book book;
}
对我来说关键是要理解,关系 table 可以被索引并用作搜索的基础
List<BookShopRelation> result = Search.session(entityManager)
.search(BookShopRelation.class) .predicate(f ->
pattern == null || pattern.trim().isEmpty() ?
f.matchAll() :
f.simpleQueryString()
.fields("book.title").matching(pattern)
)
.fetchHits(size.orElse(20));
我正在尝试使用 Hibernate Search 6 和弹性搜索 我正在尝试构建的一个简单示例如下。
我有一个 Book
实体,它包含 title
、authorName
、genre
、price
等信息
我有一个 Shop
实体,其中包含 shopName
、phone
、email
、location
等信息
我有一个 "joining table" 可以在角落和商店之间进行多对多映射。 (一本书可以在很多店,一个店可以有很多书)
我正在尝试按名称和位置进行搜索,最好是在距离输入最近的位置查找一本书。文档中的标准书籍作者示例需要一个 IndexedEmbedded
注释,这在我的情况下是不可能的,因为我使用的是连接 table。
有没有其他方法可以解决这个问题
我的实体
@Indexed
public class Book extends PanacheEntity{
public String title;
public String authorName;
@OneToMany(mappedBy = "book", fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE })
public List<BookShopRelation> bookShopRelation = new ArrayList<>();
}
@Indexed
public class Shop extends PanacheEntity{
public String name;
public String city;
@OneToMany(mappedBy = "shop", fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE })
private List<BookShopRelation> bookShopRelation = new ArrayList<>();
}
@Indexed
public class BookShopRelation extends PanacheEntity{
@JoinColumn(name = "shop_id")
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@IndexedEmbedded
private Shop shop;
@JoinColumn(name = "offer_id")
@ManyToOne(fetch = FetchType.EAGER, optional = false)
@IndexedEmbedded
private Book book;
}
对我来说关键是要理解,关系 table 可以被索引并用作搜索的基础
List<BookShopRelation> result = Search.session(entityManager)
.search(BookShopRelation.class) .predicate(f ->
pattern == null || pattern.trim().isEmpty() ?
f.matchAll() :
f.simpleQueryString()
.fields("book.title").matching(pattern)
)
.fetchHits(size.orElse(20));