2015-02-09 2 views
1

Недавно я познакомился с API поиска Hibernate. Как получить полный текстовый поиск по объекту, а также отфильтровать результат по одному определенному полю? Например:Объединить полный текст в режиме спящего режима и запрос JPA

final FullTextEntityManager ftem = Search.getFullTextEntityManager(em); 

final QueryBuilder qb = ftem.getSearchFactory() 
     .buildQueryBuilder().forEntity(Item.class).get(); 

final org.apache.lucene.search.Query query = qb 
     .keyword() 
     .onFields(Item_.CONTENT) 
     .matching(match) 
     .createQuery(); 

/* also here I want to filter the results for all the Items in which category equals to 2 */ 

final FullTextQuery persistenceQuery = ftem.createFullTextQuery(query, Item.class); 

final List<Item> result = persistenceQuery.getResultList(); 
+0

У меня точно такая же проблема! К сожалению, я пока не нашел ничего полезного. Также, если вы найдете решение, отправьте ответ. – user1079877

ответ

2

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

http://docs.jboss.org/hibernate/search/5.5/reference/en-US/html/ch05.html#query-filter

Я использую это сам, и это работает тихий хорошо.

+0

Спасибо за ответ. Но я не знаю, правильно ли индексировать, например, поле userId, и применять фильтр на нем! Как будто это возможно, у меня есть 20 000 000 записей, и у 1 000 000 из них есть тот же userId. Является ли он достаточно быстрым, чтобы создать фильтр на userId? – user1079877

+0

Я не уверен, действительно ли это проблема. Если вы используете какой-то простой анализатор для этого поля. Если вы хотите передать в этом поле в SQL DB, вы, вероятно, также будете использовать некоторый индекс для этого поля. –