如何将X.PagedList与ElasticSearch Nest结合使用?

时间:2018-08-01 09:26:56

标签: elasticsearch asp.net-core .net-core pagedlist

背景

我正在使用ElasticSearch作为我正在研究的新ASP.Net Core 2.1网站的搜索引擎。我正在使用Nest API与其集成。我想使用X.PagedList为我处理分页。

我在其他ASP.Net Core项目中使用了此方法,并且在MS SQL Server中查询数据效果很好。

代码

ISearchResponse<Foo> searchResponse = 
        _elasticSearchClient.Search<Foo>(s => s
                    .Query(q => q
                        .Bool(b => b.Filter(distanceFilters))
                        )
                    .Source(src => src
                                .Includes(i => i
                                        .Fields(
                                                f => f.Field1,
                                                f => f.Field2,
                                                f => f.Field3
                                                )
                                            )
                            )
                    .From(options.From)
                    .Size(options.Size)
                );

var hitsMD = searchResponse.HitsMetadata;
var results = hitsMD?.Hits.Select(s => new Hit()
{
    Index = s.Index,
    Id = s.Id,
    Score = s.Score,
    Job = s.Source
}
).ToPagedList(PageNumber, PageSize);

问题

当我在ElasticSearch返回的搜索结果上调用.ToPagedList时,它仅显示一页结果。

问题在于,ElasticSearch具有自己的分页机制,因此仅返回匹配的一页。

我有一个想法,因为ElasticSearch传回命中总数,所以我可以通过设置PagedList.TotalItemCount属性来告诉PagedList列表中有多少个项目。但是,我不能这样做,因为它是私有集。

我尝试删除from和size,但这会返回10个匹配结果,这是ElasticSearch的默认大小,出于性能原因,它们显然已放置在该位置。

问题

在使用Nest API集成到ElasticSearch时如何使用X.PagedList包?

1 个答案:

答案 0 :(得分:1)

您基本上已经掌握了所有内容。您所缺少的只是StaticPagedList<T>。由于分页已由Elasticsearch处理 ,因此您只需定义一个静态分页设置,即:

var pagedResults = new StaticPagedList<Foo>(results, PageNumber, PageSize, total);