【问题标题】:Fetch @ClassbBridge field values获取 @ClassbBridge 字段值
【发布时间】:2016-09-30 11:27:31
【问题描述】:

我创建了一个基于 Spring Data JPA 和 Hibernate Search 的应用程序。在我的索引实体中,我创建了一个 ClassBridge,它根据实体添加一个额外的字段,但我不知道如何获取这个额外的字段。

这是我的实体:

@Indexed
@ClassBridge(name="Image_url",
impl = ImageUrlClassBridge.class)
@Entity
@Table(name="PRODUCTS")
public class ProductModel {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    @Field(analyzer=@Analyzer(definition="ngram"))
    private String name;
...
}

这是我的classBridge:

public class ImageUrlClassBridge implements FieldBridge,ParameterizedBridge {

    private  ProductsService productsService;



    @Override
    public void set(String name, Object value, Document document, LuceneOptions luceneOptions) {
        ProductModel product=(ProductModel) value;
        productsService=ApplicationContextProvider.getApplicationContext().getBean(ProductsService.class);
        ImageModel image=productsService.findImageByProduct(product.getId());

        if(!ObjectUtils.isEmpty(image)){
            Logger.getAnonymousLogger().info("\nIMAGE FOUND : "+image.getId() );
            Field field = new Field( name,image.getUrl(), luceneOptions.getStore(),
                    luceneOptions.getIndex(), luceneOptions.getTermVector() );
                    field.setBoost( luceneOptions.getBoost() );
                    document.add( field );
            }
        }
...
}

这里是产品型号的搜索方法:

@SuppressWarnings("unchecked")
public List<ProductModel> search(String keyword) {
    FullTextEntityManager ftem = org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager);
    QueryBuilder queryBuilder = ftem.getSearchFactory().buildQueryBuilder().forEntity(ProductModel.class).get();
    Query query =queryBuilder.keyword().onField("name").matching(keyword).createQuery();
    FullTextQuery jpaQuery =ftem.createFullTextQuery(query, ProductModel.class);
    List<ProductModel> results = jpaQuery.getResultList();
    return results;
}

【问题讨论】:

    标签: java indexing lucene hibernate-search


    【解决方案1】:

    您使用默认名称(在 set 方法的 name 参数中传递的名称)将字段添加到文档中,因此您的字段具有您在 ClassBridge 注释中指定的名称(即“Image_url”)。

    只需在搜索查询中使用此字段名称即可。

    如果你想获取它,你必须使用投影:

    FullTextQuery jpaQuery = ftem.createFullTextQuery(query, ProductModel.class);
    jpaQuery.setProjection( FullTextQuery.THIS, "Image_url" );
    List results = jpaQuery.list();
    Object[] firstResult = (Object[]) results.get(0);
    ProductModel productModel = firstResult[0];
    String imageUrl = firstResult[1];
    

    参考https://docs.jboss.org/hibernate/search/3.2/reference/en/html/search-query.html#projections

    【讨论】:

    • 我不想使用该字段进行搜索,但我想获取它的值
    • 更新了答案。
    • 为什么它会抛出这个异常:Projecting an unstored field: Image_url。 ...请注意,我已完成索引,并且已成功完成
    • 嗯,错误信息说明了一切:您需要将字段存储在索引中才能投影它。将 store = Store.YES 添加到您的 @ClassBridge 注释中。
    猜你喜欢
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2018-07-07
    • 2010-10-20
    • 2011-03-12
    相关资源
    最近更新 更多