我正在尝试使用Hibernate Search 6和Elastic Search
我尝试构建的一个简单示例如下。
我有一个Book
实体,该实体具有title
,authorName
,genre
,price
之类的信息
我有一个Shop
实体,该实体具有shopName
,phone
,email
,location
之类的信息
我有一个“联接表”,可以在角落和商店之间进行多对多映射。 (一本书可以在很多商店中,而一家商店可以有很多书)
我正在尝试按名称和位置进行搜索,最好在距输入内容最近的位置查找一本书。文档中的标准书籍作者示例需要IndexedEmbedded
批注,在我的情况下这实际上是不可能的,因为我正在使用联接表。
是否有解决此问题的替代方法
最佳答案
我的实体
@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;
}
对我来说,关键是要理解,关系表可以被索引并用作搜索的基础
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));
关于elasticsearch - 无需嵌入索引即可在两个实体之间进行休眠搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60192572/