获取@ClassbBridge 字段值
Fetch @ClassbBridge field values
我已经创建了一个基于 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;
}
您使用默认名称(在 set 方法的名称参数中传递的名称)将字段添加到文档中,因此您的字段具有您在 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。
我已经创建了一个基于 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;
}
您使用默认名称(在 set 方法的名称参数中传递的名称)将字段添加到文档中,因此您的字段具有您在 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。