[英]Use pagination on query on multiple indices in hibernate search
我們正在實現一個全局搜索,我們可以使用它來查詢我們應用程序中的所有實體,比如汽車、書籍和電影。 這些實體不共享公共領域,例如,汽車有制造商,書籍有作者,電影有導演。
在全局搜索字段中,我想通過一個查詢來搜索我的所有實體,以便能夠使用分頁。 在考慮如何解決這個問題時,我想到了兩個方法:
我現在的問題是:有第三種(更好的)方法嗎? 您如何建議對多個索引實施這樣的全局搜索?
一種方法是創建一個 SQL 視圖(SearchEntry?),它結合了您要搜索的所有表。 這允許您為不同的列名設置別名。 它對性能不是很好,但您也可以只創建一個大字段,它是不同可搜索字段的串聯。 最后,包括一個與實體相關聯的“類型”字段。
現在,您可以查詢 go 中的所有內容,並使用類型/ID 綁定到最初從中提取“搜索”數據的特定實體。
查詢一個又一個索引,手動合並結果。 這意味着我必須自己實現分頁。
我絕對不會那樣做,因為這會表現得很糟糕,尤其是在深度分頁的情況下(第 40 頁等)。
為每個項目添加公共字段,如名稱和創建者(或創建一個界面,如下所示在 Hibernate 搜索中的單一返回類型)。在這種情況下,我只能在我的全局搜索中搜索我 map 到公共字段的字段。
就是這樣做。 您甚至不需要通用接口,因為您可以只針對同一謂詞中的多個字段。 通用接口僅有助於定位所有相關類型:您可以調用.search(MyInterface.class)
而不是.search(Arrays.asList(Car.class, Book.class, Movie.class))
。
您仍然可以將謂詞應用於特定於每種類型的字段; 只是出現在多個類型中的字段必須一致(相同類型等)。 此外,顯然,如果您要求“制造商”(並且沒有其他字段)與“詹姆斯”匹配,則書籍和電影將不再匹配,因為它們沒有制造商。
你試過了嗎? 例如,只要manufacturer
、 author
和director
都是具有相同分析器的文本字段,這應該可以正常工作:
SearchResult<Object> result = searchSession.search( Arrays.asList(
Car.class, Book.class, Movie.class
) )
.where( f -> f.simpleQueryString()
.fields( "manufacturer", "author", "director" )
.matching( "james" ) )
.fetch( 20 );
List<Object> hits = result.hits(); // Result is a mix of Car, Book and Movie.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.