CollectionTable Lucene索引和查询

时间:2018-11-24 19:10:22

标签: lucene hibernate-search

我在这里打开另一个有关Hibernate Search的话题...

现在我正在处理:

@Field
@ElementCollection
@CollectionTable(name = "product_instance", joinColumns = 
@JoinColumn(name = "doc_uuid"))
@Column(name = "productInstance")
@org.hibernate.annotations.Cache(
        usage = CacheConcurrencyStrategy.READ_WRITE
)
private List<String> productInstanceIds;

映射。

这是我构造查询的方式:

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);

        QueryBuilder b = fullTextEntityManager.getSearchFactory()
                .buildQueryBuilder()
                .forEntity(DocVersion.class)
                .get();
builder.add(b.keyword().onField(disjMap.get(...)).matching(...)
                        .createQuery(), BooleanClause.Occur.SHOULD);

List results = fullTextEntityManager.createFullTextQuery(builder.build(), DocVersion.class)
                .getResultList();

,查询就可以了。

现在我的问题主要是@CollectionTable。我需要从该“表”中索引和查询元素。我知道问题出在映射中,因为当我在其中保留@Field批注时,我得到0个结果(不是错误),但是当我删除它时,我得到了关于其他实体道具的许多结果。

因此它不会尖叫错误,但不会返回任何内容。我的意思是,我在两种情况下都使用相同的查询,因此必须与该映射有关。

所以我的问题是如何使Lucene指数@CollectionTable

休眠搜索:5.9.3。最终

谢谢!

1 个答案:

答案 0 :(得分:0)

为了在Hibernate Search 5.x中索引“原子”元素(字符串,整数,枚举等)的集合,您有两种解决方案:

  1. 依靠默认桥(在您的情况下为String桥),并使Hibernate Search通过指定您不希望对集合进行索引而将桥应用于多种类型,而是指定其元素:将var html = element.html(); 添加到集合中,并你应该很好。
  2. Write a custom bridge通过索引列表的所有元素来正确处理列表,并在您的@IndexedEmbedded批注中对其进行引用。

请再次注意,您的日志中应该有一个堆栈跟踪,当您离开@Field批注时,它可能已经提示您了;像这样:

@Field