找不到类型“Items”的属性“searchSimilar”[带有 Spring Boot 的 ElasticSearch]

问题描述 投票:0回答:1

我正在使用在带有 Spring boot 的 docker 容器上运行的 elasticSearch。

以下是问题的详细信息。

Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract org.springframework.data.domain.Page org.springframework.data.elasticsearch.repository.ElasticsearchRepository.searchSimilar(java.lang.Object,java.lang.String[],org.springframework.data.domain.Pageable); Reason: Failed to create query for method public abstract org.springframework.data.domain.Page org.springframework.data.elasticsearch.repository.ElasticsearchRepository.searchSimilar(java.lang.Object,java.lang.String[],org.springframework.data.domain.Pageable); No property 'searchSimilar' found for type 'Items'

以下是物品表

@Document(indexName = "itemindex")
public class Items{
@Id
@UuidGenerator
  private String id;

    @PrePersist
    public void onPrePersist() {
    
            if (created == null) {
            created = new Date();  // Set creation date
        }
    }
    
    
    @Column
    @Field(type=FieldType.Text,name="title")
    private String title;

    @Column
     @Field(type=FieldType.Text,name="description")
    private String description;

    @Column
      @Field(type=FieldType.Float,name="basePrice")
    private BigDecimal basePrice;

     @OneToMany(
      fetch = FetchType.LAZY,
      cascade = CascadeType.ALL)
    private List<Bid> bids; 

    @Column
    private String currency;

    @ManyToOne
    @Field(type=FieldType.Nested,name="creator")
    private UserModel creator;
    
    @ElementCollection
     private List<String> pictures;
    

    @ManyToOne
     @Field(type=FieldType.Nested,name="organization")
    private Organization organization;

    @Column
    private Date expiryTime;

        @Column
    private String category;

    @Column
    @Field(type=FieldType.Date,name="created")
    private Date created;

     @Column
    private Date updated;


    
    @Column
    @Field(type=FieldType.Boolean,name="isDeleted")
    private boolean isDeleted;



  @PreUpdate
  protected void onUpdate() {
    updated = new Date();
  }


   public Boolean addBid(Bid bid) {
        if (!this.bids.contains(bid)) {
            this.bids.add(bid);
            bid.setItem(this);
            return Boolean.TRUE;
        }
      return Boolean.FALSE;
    }
    
}

下方存储库界面

public interface ItemElasticSearchRepository extends ElasticsearchRepository<Items,String>{
    
}

怎么称呼

    @Autowired
   private ItemElasticSearchRepository itemElasticSearchRepository;
  ...
  @CacheEvict(value = "items", allEntries = true)  
    private Items saveItem(Items item){
        Items savedItem=itemRepository.save(item);
        itemElasticSearchRepository.save(item);
        return savedItem;
    }

我没有直接调用属性 searchSimilar 。我最初的想法是因为我使用 @CacheEvict 并使用弹性存储库的 save 方法,它可能与 itemElasticSearchRepository 内部的方法和扩展 JPARepository 的 itemRepository 内部的方法冲突。

spring-boot elasticsearch spring-data-jpa
1个回答
0
投票
Spring-Data Elasticsearch 中的 searchSimilar 尝试利用 Elasticsearch 的功能来搜索相似性。但必须正确映射实体才能在查询创建中发挥作用。 某些字段或关系,特别是项目中保存的 @OneToMany、@ManyToOne 或 @ElementCollection 是相关的,因此与 Elasticsearch 不兼容(如项目索引所经历的那样),特别是如果与项目所具有的不匹配。有助于搜索相似性相关查询的注释区域可能会丢失或者在我们的索引中映射不正确。让我们考虑改进支持 用于 searchSimilar 以及定义索引映射的方式。否则,事情就可以顺利进行。 如果同时使用“JpaRepository”和“ElasticsearchRepository”,可能会发生冲突。如果这些存储库中实体的生命周期不同,则在保存或搜索时可能会导致错误。因此,保持存储库分离并仅将必要的操作委托给每个存储库是关键。

© www.soinside.com 2019 - 2024. All rights reserved.