2011-12-16 25 views
0

我喜歡使用Hibernate Search在網頁上的多個輸入字段上實現複雜的自動建議功能。 每個輸入字段都用於它自己的實體,比如CountryCity。兩個實體 (國家包含城市)之間存在多對一的關係。Hibernate搜索:如何查詢嵌入實體

自動暗示功能應該能夠在輸入時一個國家名稱前綴和城市字段已填寫, 您只能爲擁有此類城市的國家/地區提供建議(反之亦然)。

服務器端自動建議服務應返回呈現在輸入字段(下拉列表,任何內容)中的投影列表 (entityId,entityName)。

據模式和在閱讀後我嘗試以下索引模式手動:

SearchMapping mapping = new SearchMapping(); 

    mapping.analyzerDef(... 
    .entity(City.class).indexed().indexName("MyIndex") 
     .property("cityId", ElementType.FIELD) 
      .documentId() 
      .name("id") 
    .property("name", ElementType.FIELD) 
      .documentId() 
      .name("id") 
     .property("country", ElementType.METHOD) 
      .indexEmbedded() 
    .entity(Country.class).indexed() 
     .property("id", ElementType.FIELD) 
      .documentId() 
      .name("id") 
     .property("name", ElementType.METHOD) 
      .field() 
      .name("name") 

此映射定義City是主要的實體,是嗎?
我已索引所有城市,並能夠查詢他們(也結合這兩個領域)。但是,在查詢城市時我只會得到匹配。 即查詢如 fullTextSession.getSearchFactory()。buildQueryBuilder()。forEntity(City.class).get();

當我輸入「西班牙」時,這對國家字段的原因沒有用,我爲每個西班牙城市獲得一行。 (西班牙,西班牙,西班牙,西班牙,... ;-))

問題是:如何搜索國家實體?改變索引結構?索引程序?或者如何查詢?

我發現的唯一方法是爲country設置一個Facet,並將不同的可能方面設置爲自我暗示。然而,這也不是完美的 ,因爲它是不可能按字母順序排列分面的。

當然,在這個例子中,我可以在映射中切換兩個實體,但假設有更復雜的實體圖的情景。

UPDATE:在評論

對於建築的查詢請求添加查詢,我聘請QueryBuilder的。下面產生的結果在西班牙例如設置,如:

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(City.class).get(); 

與查詢:

country.name:Spain 

如果我嘗試使用國家

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Country.class).get(); 

和查詢的查詢生成器:

name:Spain 

我沒有得到任何結果。

回答

1

您沒有顯示您的實際查詢。您不必使用查詢DSL,但您也可以編寫本地Lucene查詢。在這兩種情況下(DSL或本地Lucene),您都可以通過布爾邏輯組合查詢。嵌入式實體遵循java bean符號。國家名稱例如在城市查詢中可以達到country.name。再次,沒有你的實際查詢,很難給出更具體的反饋。

最後但並非最不重要的一點是,分面也可以按字母順序排序。檢查FacetSortOrder.COUNT_DESC。

+0

哦,我明白了,我監督了特定的排序選項(我想你會說FacetSortOrder.FIELDVALUE)。 關於您的評論的第一部分:我的問題不是在一個查詢中組合標準,而是獲取我想要的實體。所有返回的行都符合條件,但我希望獲得匹配的國家/地區,而不是匹配「西班牙」國家/地區的城市。我會更新這個問題。 – rainer198 2011-12-19 08:12:31