2014-11-21 21 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

是它正確的使用條件過濾信息? /何時使用它有用?

編號Hibernate搜索Lucene不應與Hibernate ORM Criteria查詢混合使用。這不被支持。您可以通過標準API設置的所有內容都是關聯的獲取模式。

我應該使用@Field索引屬性「age」嗎?

是。

我應該索引所有我需要用來過濾的實體屬性嗎?

絕對。在使用Hibernate Search時搜索最有效的方法是確保搜索所需的所有信息通過Lucene索引進行索引和搜索。然後,您可以使用布爾查詢來組合不同的搜索條件。您也可能想要考慮如何索引某些屬性。例如,如果您有數字,您可以將它們索引爲數字字段(請參閱@NumericField)。這將加快對這些字段的範圍查詢。在某些情況下,您甚至可能想使用自定義橋接。這一切都取決於你的用例以及你想要搜索的內容。

性能如何,使用索引值還是不?

如果您需要全文搜索功能,並且您將要使用Hibernate Search,那麼最好的方法就是使用Hibernate Search查詢。

如何選擇哪些值必須由lucene索引?

你最瞭解你的域模型。你應該知道你現在需要搜索哪些字段。這些是您現在需要索引的最小字段。如果以後可能還需要其他字段,請添加它們,除非您真的擔心索引大小。但是,這通常不是問題。即使你弄錯了,並且以後需要對字段進行索引,但這只是添加所需註釋並重建索引的問題。爲了這個特定的目的,搜索提供了一個非常強大的質量索引API。

我希望這會有所幫助。

+0

非常感謝您的回答。但是,爲什麼你說「Hibernate Search Lucene不應該和Hibernate ORM Criteria查詢混在一起,這是不被支持的。」? 在我的例子中,我正在使用Criteria和它的工作。我正在獲得結果。 – devops85 2014-11-25 13:16:20

+0

它不被支持,你可能會得到錯誤的結果。檢查Hibernate Search文檔它包含一個關於這個的警告。 – Hardy 2014-11-25 13:38:30

+0

哦,好的。 Thankss! – devops85 2014-11-25 15:37:17