如何在ASP.NET Core中配置SolrNet实现索引与查询分用不同模型
在ASP.NET Core中配置SolrNet实现同一集合的索引与查询分离模型
1. 创建查询专用模型
定义仅包含需要返回的ID字段的模型,对应Solr中存储的id字段:
using SolrNet.Attributes; public class FolderSearchResult { [SolrUniqueKey("id")] // 映射Solr的唯一键字段 public int Id { get; set; } }
2. 注册查询专用的SolrNet连接
在Startup/Program.cs的DI配置中,为查询模型注册指向同一个Solr集合的SolrNet服务,与已有的索引模型注册共存:
// 原有的索引用注册 services.AddSolrNet<FolderDto>($"{solrEndpoint}/folders"); services.AddScoped<IFolderIndex, FolderIndex>(); // 新增的查询用注册,指向同一Solr集合 services.AddSolrNet<FolderSearchResult>($"{solrEndpoint}/folders");
3. 实现查询服务
创建专门的查询服务,注入ISolrOperations<FolderSearchResult>执行查询并返回ID集合:
public interface IFolderSearchService { Task<IEnumerable<int>> SearchFolderIdsAsync(string searchQuery); } public class FolderSearchService : IFolderSearchService { private readonly ISolrOperations<FolderSearchResult> _solrQueryOperations; public FolderSearchService(ISolrOperations<FolderSearchResult> solrQueryOperations) { _solrQueryOperations = solrQueryOperations; } public async Task<IEnumerable<int>> SearchFolderIdsAsync(string searchQuery) { // 执行Solr查询,仅返回映射的Id字段 var queryResults = await _solrQueryOperations.QueryAsync(new SolrQuery(searchQuery)); return queryResults.Select(result => result.Id); } }
4. 注册查询服务到DI
将查询服务添加到依赖注入容器:
services.AddScoped<IFolderSearchService, FolderSearchService>();
关键说明
- SolrNet通过泛型类型
ISolrOperations<T>区分不同的连接实例,即使指向同一Solr集合,不同泛型参数的服务会被DI视为独立实例,因此可分别用于索引和查询。 - 需确保Solr集合的schema配置中,
id字段设置为stored="true",其他业务字段设置为indexed="true" stored="false",既满足索引需求,又避免存储冗余数据。
内容的提问来源于stack exchange,提问作者sasfrog
相关产品推荐
相关产品推荐

