CollectionTable Lucene индексация и запрос - PullRequest
0 голосов
/ 24 ноября 2018

Я открываю еще одну тему о 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.Мне нужно индексировать и запрашивать элементы из этой «таблицы».Я знаю, что проблема где-то в этом отображении, потому что я получаю 0 результатов (а не ошибку), когда я сохраняю там аннотацию @Field, но когда я ее удаляю, я получаю ряд результатов о подпорках других сущностей.

Таким образом, он не выдаст ошибку, но ничего не вернет.И я имею в виду, что я использую один и тот же запрос в обоих сценариях, так что это должно быть что-то с этим отображением.

Поэтому мой вопрос заключается в том, как сделать lucene index @CollectionTable?

hibernate-поиск:5.9.3. Финал

Спасибо!

1 Ответ

0 голосов
/ 26 ноября 2018

Чтобы индексировать коллекции «атомарных» элементов (String, integer, enums, ...) в Hibernate Search 5.x, у вас есть два решения:

  1. Положитесь на мост по умолчанию(String bridge в вашем случае) и заставьте Hibernate Search применить мост нескольких типов, указав, что вы не хотите, чтобы коллекция была проиндексирована, но ее элементы: добавьте @IndexedEmbedded к вашей коллекции, и вы должны быть хорошими.
  2. Напишите пользовательский мост , который корректно обрабатывает список, индексируя все его элементы, и ссылается на него в аннотации @Field.

Обратите внимание, что еще раз, вы должны иметьтрассировка стека в ваших журналах, которая могла бы предупредить вас, когда вы оставляете аннотацию @Field;что-то вроде:

org.hibernate.HibernateException: Error while indexing in Hibernate Search (before transaction completion)
...
Caused by: org.hibernate.search.bridge.BridgeException: Exception while calling bridge#set
...
Caused by: java.lang.ClassCastException: org.hibernate.collection.internal.PersistentBag cannot be cast to java.lang.String
...