2010-04-16 91 views
2

我正在使用Hibernate Search(使用Lucene)來搜索某些已在目錄中編入索引的數據。它工作正常,但我需要做一個反向搜索。通過反向搜索,我的意思是我有一個存儲在我的數據庫中的查詢列表,我需要在每次創建數據對象時檢查這些查詢中的哪一個與數據對象匹配。我需要它在數據對象與他創建的查詢匹配時提醒用戶。所以我需要索引這個剛剛創建的單個數據對象,並查看我的列表中哪些查詢將此對象作爲結果。在Hibernate搜索中進行反向搜索

我見過的Lucene MemoryIndex類在內存中創建一個索引,所以我可以在列表中的每個查詢這樣做例子(儘管在查詢中的一個Java迭代名單不會是非常有效的):

//Iterating over my list<Query> 
MemoryIndex index = new MemoryIndex(); 
//Add all fields 
index.addField("myField", "myFieldData", analyzer); 
... 
QueryParser parser = new QueryParser("myField", analyzer); 
float score = index.search(query); 
if (score > 0.0f) { 
    System.out.println("it's a match"); 
} else { 
    System.out.println("no match found"); 
} 

這裏的問題是,這個數據類有幾個Hibernate搜索註釋@字段,@ IndexedEmbedded,...這表明字段應該如何索引,所以當我調用FullTextEntityManager實例上的index()方法時,它使用這些信息索引目錄中的對象。有沒有類似的方式來使用這些信息在內存中索引它?

有沒有一個更有效的方法來做這種反向搜索?

回答

4

只是指數的新對象(如果您使用自動索引你沒有做任何事情,除了提交當前的事務),然後檢索要運行和運行所有的人都在布爾查詢的查詢,結合存儲的查詢與新對象的ID。這樣的事情:

... 
BooleanQuery query = new BooleanQuery(); 
query.add(storedQuery, BooleanClause.Occur.MUST); 
query.add(new TermQuery(ProjectionConstants.ID, id), BooleanClause.Occur.MUST); 
... 

如果你得到一個結果,你知道查詢匹配。

0

由於MemoryIndex是一個完全獨立的組件,不擴展或實現Lucene的目錄或的IndexReader,我不認爲有你可以插入到這個Hibernate Search的註解的方式。我猜如果你選擇使用MemoryIndex,你需要編寫你的addField()調用,它們基本上反映了你在註釋中做什麼。

我們在這裏討論了多少個查詢?取決於你可以通過在Hibernate所維護的主索引上運行查詢來獲得多少個查詢,以確保將搜索限制爲剛剛添加的文檔ID。或者,對於添加的每個文檔,使用RAMDirectory創建一個單文檔內存索引並通過它運行查詢。