如何将 X.PagedList 与 ElasticSearch Nest 一起使用?

How can I use X.PagedList with ElasticSearch Nest?

背景

我正在使用 ElasticSearch 作为我正在开发的新 ASP.Net Core 2.1 网站的搜索引擎。我正在使用 Nest API 与它集成。我想用 X.PagedList 为我处理寻呼。

我在其他 ASP.Net 核心项目中使用过它,它在 MS SQL 服务器中查询数据时运行良好。

代码

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 但是这个 returns 10 次点击是 ElasticSearch 的默认大小,他们显然是出于性能原因而设置的。

问题

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

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

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