Hibernate搜索关于标准的性能建议

时间:2014-11-21 20:58:47

标签: java performance hibernate hibernate-search

我第一次使用Hibernate Search,我有些疑惑。如果你能告诉我一些建议,我感激不尽。

我有以下实体:

@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. 使用Criteria过滤信息是否正确? /什么时候有用呢?
  2. 我应该索引该物业"年龄"使用@Field?
  3. 我应该索引我需要用来过滤的所有实体属性吗?
  4. 使用索引值的性能如何?
  5. 如何选择lucene必须索引哪些值?
  6. 提前致谢

1 个答案:

答案 0 :(得分:1)

  

使用Criteria过滤信息是否正确? /什么时候有用呢?

没有。 Hibernate Search Lucene不应与Hibernate ORM Criteria查询混合使用。那是不支持的。您可以通过条件API设置的所有内容都是关联的获取模式。

  

我应该使用@Field索引属性“age”吗?

  

我应该索引我需要用来过滤的所有实体的属性吗?

绝对。使用Hibernate Search时最有效的搜索方法是确保搜索所需的所有信息都可以通过Lucene索引进行索引和搜索。然后,您可以使用例如布尔查询来组合不同的搜索条件。您还可能想要考虑如何索引某些属性。例如,如果您有数字,则可以将它们编入数字字段(请参阅@NumericField)。这将加快针对这些字段的范围查询。在某些情况下,您甚至可能希望使用自定义网桥。这一切都取决于您的用例以及您想要搜索的内容。

  

性能如何,使用索引值?

如果您需要全文搜索功能并且您将使用Hibernate Search,最好的方法是使用Hibernate Search查询。

  

如何选择lucene必须索引哪些值?

您最了解您的域名模型。您应该知道您现在需要搜索哪些字段。这些是您现在需要索引的最小字段。如果您以后可能需要其他字段,也可以添加它们,除非您真的担心索引大小。但是,这通常不是问题。即使你弄错了并且稍后需要索引字段,这只是添加所需注释然后重建索引的问题。出于特定目的,Search提供了一个非常强大的质量索引器API。

我希望这会有所帮助。