簡體   English   中英

在 hibernate 搜索中對多個索引的查詢使用分頁

[英]Use pagination on query on multiple indices in hibernate search

我們正在實現一個全局搜索,我們可以使用它來查詢我們應用程序中的所有實體,比如汽車書籍電影 這些實體不共享公共領域,例如,汽車制造商書籍作者電影導演

在全局搜索字段中,我想通過一個查詢來搜索我的所有實體,以便能夠使用分頁。 在考慮如何解決這個問題時,我想到了兩個方法:

  1. 查詢一個又一個索引,手動合並結果。 這意味着我必須自己實現分頁。
  2. 為每個項目添加公共字段,如名稱創建者(或創建一個界面,如下所示Hibernate Search 中的單一返回類型)。在這種情況下,我只能在我的全局搜索中搜索我 map 到公共字段的字段。

我現在的問題是:有第三種(更好的)方法嗎? 您如何建議對多個索引實施這樣的全局搜索?

一種方法是創建一個 SQL 視圖(SearchEntry?),它結合了您要搜索的所有表。 這允許您為不同的列名設置別名。 它對性能不是很好,但您也可以只創建一個大字段,它是不同可搜索字段的串聯。 最后,包括一個與實體相關聯的“類型”字段。

現在,您可以查詢 go 中的所有內容,並使用類型/ID 綁定到最初從中提取“搜索”數據的特定實體。

查詢一個又一個索引,手動合並結果。 這意味着我必須自己實現分頁。

我絕對不會那樣做,因為這會表現得很糟糕,尤其是在深度分頁的情況下(第 40 頁等)。

為每個項目添加公共字段,如名稱和創建者(或創建一個界面,如下所示在 Hibernate 搜索中的單一返回類型)。在這種情況下,我只能在我的全局搜索中搜索我 map 到公共字段的字段。

就是這樣做。 您甚至不需要通用接口,因為您可以只針對同一謂詞中的多個字段 通用接口僅有助於定位所有相關類型:您可以調用.search(MyInterface.class)而不是.search(Arrays.asList(Car.class, Book.class, Movie.class))

您仍然可以將謂詞應用於特定於每種類型的字段; 只是出現在多個類型中的字段必須一致(相同類型等)。 此外,顯然,如果您要求“制造商”(並且沒有其他字段)與“詹姆斯”匹配,則書籍和電影將不再匹配,因為它們沒有制造商。

你試過了嗎? 例如,只要manufacturerauthordirector都是具有相同分析器的文本字段,這應該可以正常工作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM