2014-11-21 2 views
0

Я работаю с Hibernate Search в первый раз, и у меня есть некоторые сомнения. Я ценю, если вы можете сказать мне несколько предложений.Hibernate Поиск по предложению о критериях

У меня есть следующий объект:

@Entity 
public class User { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@Field(name = FIELD_LASTNAME, analyze = Analyze.YES, index = Index.YES) 
private String name; 

private int age; 

..... 

Таким образом, для пользователей поиска, которые их возраст 25 я следующее:

QueryBuilder qb = fullTextEntityManager.getSearchFactory() 
    .buildQueryBuilder().forEntity(User.class).get(); 

Query luceneQuery = qb.keyword().onFields("name").matching("Geor").createQuery(); 

Query jpaQuery = fullTextEntityManager 
       .createFullTextQuery(luceneQuery, User.class)        
       .setCriteriaQuery(fullTextEntityManager 
            .createCriteria(User.class) 
            .add(Restrictions.eq("user.age", 25))); 

Мой вопрос являются:

  1. ли Правильно ли использовать критерии для фильтрации информации?/Когда полезно использовать его?
  2. Должен ли я индексировать свойство «возраст» с помощью @Field?
  3. Должен ли я индексировать все свойства объекта, которые необходимо использовать для фильтрации?
  4. Как насчет производительности, используя индексированные значения или нет?
  5. Как выбрать, какие значения должны быть проиндексированы lucene?

Заранее спасибо

ответ

1

Правильно ли использовать критерии для фильтрации информации?/Когда полезно использовать его?

No. Hibernate Поиск Lucene не следует смешивать с запросами на запрос IRM для спящего режима. Это не поддерживается. Все, что вы можете установить через API критериев, - это режим выборки для ассоциаций.

Следует ли указывать свойство «возраст» с помощью @Field?

Да.

Следует ли индексировать все свойства объекта, которые необходимо использовать для фильтрации?

Абсолютно. Самый эффективный способ поиска при использовании Hibernate Search - убедиться, что вся информация, необходимая для поиска, индексируется и доступна для поиска через индекс Lucene. Затем вы используете, например, логические запросы для объединения разных критериев поиска. Вы также можете подумать о том, как индексировать определенные свойства. Например, если у вас есть номера, вы можете индексировать их как числовые поля (см. @NumericField). Это ускорит запросы диапазона к этим полям. В некоторых случаях вы даже можете использовать собственный мост. Все зависит от вашего прецедента и того, что вы хотите найти.

Как насчет производительности, используя индексированные значения или нет?

Если вам нужны возможности полнотекстового поиска, и вы собираетесь использовать Hibernate Search, лучший подход - просто использовать запросы поиска Hibernate.

Как выбрать, какие значения должны быть проиндексированы lucene?

Вы знаете свою модель домена лучше. Вы должны знать, какие поля вам нужно искать прямо сейчас. Это минимальные поля, которые нужно индексировать сейчас. Если есть другие поля, которые вам могут понадобиться позже, добавьте их, если вы действительно не обеспокоены размером индекса. Однако это часто не проблема. И даже если вы ошибаетесь и вам нужно индексировать поля позже, это просто вопрос добавления требуемых аннотаций и последующего восстановления индекса. Для этой цели Search предлагает очень мощный API-интерфейс индексации.

Надеюсь, это поможет.

+0

Большое спасибо за ваш ответ. Но почему вы говорите, что «Hibernate Search Lucene не следует смешивать с запросами на запросы Hibernate ORM Criteria. Это не поддерживается».? В моем примере я использую критерии, и он работает. Я получаю результаты. – devops85

+0

Не поддерживается, и вы можете получить неправильные результаты. Проверьте документацию Hibernate Search, содержащую предупреждение об этом. – Hardy

+0

О, хорошо. Thankss! – devops85

Смежные вопросы