[英]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.