我喜歡使用Hibernate Search在網頁上的多個輸入字段上實現複雜的自動建議功能。 每個輸入字段都用於它自己的實體,比如Country
和City
。兩個實體 (國家包含城市)之間存在多對一的關係。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
我沒有得到任何結果。
哦,我明白了,我監督了特定的排序選項(我想你會說FacetSortOrder.FIELDVALUE)。 關於您的評論的第一部分:我的問題不是在一個查詢中組合標準,而是獲取我想要的實體。所有返回的行都符合條件,但我希望獲得匹配的國家/地區,而不是匹配「西班牙」國家/地區的城市。我會更新這個問題。 – rainer198 2011-12-19 08:12:31