背景
我正在使用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包?
答案 0 :(得分:1)
您基本上已经掌握了所有内容。您所缺少的只是StaticPagedList<T>
。由于分页已由Elasticsearch处理 ,因此您只需定义一个静态分页设置,即:
var pagedResults = new StaticPagedList<Foo>(results, PageNumber, PageSize, total);