elasticsearch - 无需嵌入索引即可在两个实体之间进行休眠搜索

标签 elasticsearch hibernate-search quarkus

我正在尝试使用Hibernate Search 6和Elastic Search
我尝试构建的一个简单示例如下。

我有一个Book实体,该实体具有titleauthorNamegenreprice之类的信息
我有一个Shop实体,该实体具有shopNamephoneemaillocation之类的信息
我有一个“联接表”,可以在角落和商店之间进行多对多映射。 (一本书可以在很多商店中,而一家商店可以有很多书)

我正在尝试按名称和位置进行搜索,最好在距输入内容最近的位置查找一本书。文档中的标准书籍作者示例需要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/

相关文章:

python - 如何过滤非空值elasticsearch?

java - 多个应用程序的相同 Hibernate Search Lucene 索引

java - hibernate 搜索 : Searching by multiple equal words

Quarkus 原生图像大小

elasticsearch - 在java elasticsearch上设置字段数据= true

docker - 使用Docker配置Kibana监控

elasticsearch - Redisearch中的多边形查询

java - hibernate搜索中的OnFields方法接受什么数据类型

Quarkus RestClient close()

java - RestAssured 不遵守 Quarkus 中的 ObjectMapper 配置