2012-10-10 28 views
0

我有一個看起來像這樣一個Hibernate Search的實體類:Hibernate Search可以使用嵌入式收集字段實現Lucene FullTextFilter嗎?

@Entity 
@Indexed 
@FullTextFilterDefs({ 
    @FullTextFilterDef(name="myFilter", impl=MyFilterFactory.class) 
}) 
public class Parent { 
    ... 
    @Column 
    @Field 
    private String name; 

    @ManyToMany 
    @IndexedEmbedded 
    private Set<Child> children; 
    ... 
} 

相關的enity同樣簡單:

@Entity 
@Indexed 
public class Child { 
    ... 
    @Column 
    @Field 
    private String name; 

    @ManyToMany(mappedBy="children") 
    @ContainedIn 
    private Set<Parent> parents; 
    ... 
} 

如果MyFilterFactory.getFilter()方法正在與Parent這樣一個簡單的領域(硬編碼以便於說明):

... 
Term term = new Term("name", "daddy"); 
Query query = new TermQuery(term); 
return new CachingWrapperFilter(new QueryWrapperFilter(query)); 
... 

...然後FullTextQuery的此過濾器啓用按預期工作。

不過,如果我更改過濾器使用嵌入式領域的領域

... 
Term term = new Term("children.name", "Junior"); 
Query query = new TermQuery(term); 
return new CachingWrapperFilter(new QueryWrapperFilter(query)); 
... 

...然後我每次都遇到0命中,儘管搜索表達式children.name:parent=junior工程只是在盧克罰款。

有什麼我在這裏失蹤?很明顯,因爲我可以在盧克搜索它,所以信息就在那裏。有沒有什麼特別的,你必須做Hibernate搜索實施FullTextFilter這樣的嵌入式領域,而不是一個簡單的領域?

+0

好吧,看起來你缺少了你的例子中的一個重要部分,即名稱字段上的_ @ Indexed_。如果這只是你身邊的一個疏忽,它應該真的有效。如果你可以在單元測試中重現問題,我建議你在這裏提出問題 - https://hibernate.onjira.com/browse/HSEARCH – Hardy

+0

順便說一句,你是什麼意思與'children.name:parent=junior作品'?這個查詢沒有意義。什麼是父母=部分的交易? – Hardy

+0

只有這個類本身是不是'@索引'?我已經在兩個類上都有@ @索引了,並且我分別用'@ IndexedEmbedded'和'@ ContainedI'n註釋了相關的字段。但是,我忽略將@Field放在可搜索字段上,所以我更新了上面的代碼片段。只要我能打包一個適當的單元測試,我就會創建一個JIRA票據。 –

回答

1

雖然彙總了一個簡單的單元測試,提交一個錯誤票,我發現了真正的問題。問題不是簡單的領域與複雜領域的問題。問題是對資本化的一個令人沮喪的愚蠢誤解。

通常,當Hibernate Search構建Lucene索引時,標準分析器會將所有字段值轉換爲小寫。當你主要使用Hibernate Search DSL進行查詢時,你習慣於不區分大小寫。但是,當您直接使用Lucene API進行查詢時,您有責任使您的搜索條件小寫以匹配索引。

我最初看到的行爲是由於我的搜索條件的情況。當我在一個簡單的字段上過濾時,我偶然使用了一個全小寫的字符串。當我在一個複雜的領域過濾時,我碰巧使用了一個大寫字母的字符串。

確認過濾參數轉換爲小寫後,問題就解決了。

+0

正確。當使用原生Lucene查詢時,一個重要的事情就是爲查詢應用與索引過程相同的分析器。搜索DSL試圖爲您做出正確的選擇。 – Hardy

相關問題