Как получить объект, связанный со списком результатов поиска в спящем режиме? - PullRequest
0 голосов
/ 21 мая 2019

Мне нужно выполнить поиск по нескольким документам, проиндексированным наasticsearch. Поиск работает, но мне нужно знать тип объекта, который возвращает поиск.

поиск в публичном списке (строковые термины) {

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
    QueryBuilder authorQB = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
            .forEntity(Author.class).get();
    QueryBuilder postQB = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
            .forEntity(Post.class).get();
    QueryBuilder commentQB = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
            .forEntity(Comment.class).get();

    Query authorLQ = authorQB
            .keyword().fuzzy().withEditDistanceUpTo(1).withPrefixLength(1)
            .onFields(AUTHOR_FIELDS).matching(terms)
            .createQuery();

    Query postLQ = postQB
            .keyword().fuzzy().withEditDistanceUpTo(1).withPrefixLength(1)
            .onFields(POST_FIELDS).matching(terms)
            .createQuery();

    Query commentLQ = commentQB
            .keyword().fuzzy().withEditDistanceUpTo(1).withPrefixLength(1)
            .onFields(COMMENT_FIELDS).matching(terms)
            .createQuery();

    Query luceneQuery = authorQB.bool()
            .should(authorLQ)
            .should(postLQ)
            .should(commentLQ)
            .createQuery();

    javax.persistence.Query jpaQuery = fullTextEntityManager.
            createFullTextQuery(luceneQuery, Author.class, Post.class, Comment.class);

    List<Object> result; // need to know object type

    try {
        result = jpaQuery.getResultList();
    } catch (NoResultException nre) {
        throw new NoResultException("The search for " + terms + " did not get any results");
    }

    return result;
}

Это дает мне список всех объектов, но мне нужно точно знать, какой это тип (Автор, Пост или Комментарий). Это возможно сделать, спасибо.

1 Ответ

1 голос
/ 21 мая 2019

Вы можете просто использовать instanceof ... но если вы действительно хотите, чтобы Hibernate Search возвращал это, вы можете использовать проекции:

    FullTextQuery jpaQuery = fullTextEntityManager.
            createFullTextQuery(luceneQuery, Author.class, Post.class, Comment.class);
    jpaQuery.setProjection( ProjectionConstants.OBJECT_CLASS, ProjectionConstants.THIS );

    List<Object[]> results = jpaQuery.list();
    for ( Object[] result : results ) {
         Class<?> resultClass = result[0];
         Object resultObject = result[1];
         // ... do stuff ...
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...