繁体   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