在.NET项目中实现全文检索功能时,Elasticsearch是常用的分布式搜索和分析引擎,搭配官方提供的NEST客户端可以高效完成各类数据操作。本文将以实际可运行的示例,讲解.NET环境下操作Elasticsearch的完整流程。

环境准备
首先需要准备以下环境:
- 安装Elasticsearch服务,确保服务正常运行,默认端口为9200
- 创建.NET项目,本文以.NET 6控制台项目为例
- 通过NuGet安装NEST包,这是Elasticsearch官方提供的.NET客户端
安装NEST包的命令如下:
dotnet add package NEST
创建Elasticsearch客户端
操作Elasticsearch的第一步是创建客户端实例,需要指定Elasticsearch服务的地址。示例代码如下:
using Nest;
// 创建连接设置,指定Elasticsearch服务地址
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.DefaultIndex("user_index"); // 设置默认索引名称
// 创建客户端实例
var client = new ElasticClient(settings);
定义索引和文档模型
在Elasticsearch中,文档需要对应一个实体类,同时可以定义索引的映射规则。这里以用户数据为例,定义如下模型:
// 用户文档模型
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; }
}
如果需要自定义索引的映射规则,可以在模型上使用NEST提供的特性,示例:
using Nest;
public class User
{
[Keyword] // 设置为keyword类型,不参与分词
public int Id { get; set; }
[Text(Analyzer = "standard")] // 设置为text类型,使用标准分词器
public string Name { get; set; }
public int Age { get; set; }
[Keyword]
public string Email { get; set; }
}
创建索引
创建索引时可以指定索引的配置和映射,示例代码如下:
// 创建索引请求
var createIndexResponse = client.Indices.Create("user_index", c => c
.Map<User>(m => m
.AutoMap() // 自动根据模型生成映射
)
);
if (createIndexResponse.IsValid)
{
Console.WriteLine("索引创建成功");
}
else
{
Console.WriteLine($"索引创建失败:{createIndexResponse.DebugInformation}");
}
文档增删改查操作
添加文档
向索引中添加单个文档的示例:
var user = new User
{
Id = 1,
Name = "张三",
Age = 25,
Email = "test@ipipp.com"
};
var indexResponse = client.IndexDocument(user);
if (indexResponse.IsValid)
{
Console.WriteLine("文档添加成功");
}
else
{
Console.WriteLine($"文档添加失败:{indexResponse.DebugInformation}");
}
批量添加文档
批量添加多个文档可以提升操作效率,示例:
var users = new List<User>
{
new User { Id = 2, Name = "李四", Age = 30, Email = "lisi@ipipp.com" },
new User { Id = 3, Name = "王五", Age = 28, Email = "wangwu@ipipp.com" }
};
var bulkResponse = client.Bulk(b => b
.IndexMany(users)
);
if (bulkResponse.IsValid)
{
Console.WriteLine("批量文档添加成功");
}
else
{
Console.WriteLine($"批量文档添加失败:{bulkResponse.DebugInformation}");
}
查询文档
根据文档ID查询单个文档的示例:
var getResponse = client.Get<User>(1, g => g.Index("user_index"));
if (getResponse.IsValid)
{
var user = getResponse.Source;
Console.WriteLine($"查询到用户:{user.Name},年龄:{user.Age}");
}
根据条件查询文档的示例,比如查询年龄大于25岁的用户:
var searchResponse = client.Search<User>(s => s
.Index("user_index")
.Query(q => q
.Range(r => r
.Field(f => f.Age)
.GreaterThan(25)
)
)
);
if (searchResponse.IsValid)
{
foreach (var hit in searchResponse.Hits)
{
var user = hit.Source;
Console.WriteLine($"符合条件的用户:{user.Name},年龄:{user.Age}");
}
}
更新文档
更新已有文档的示例:
var updateResponse = client.Update<User>(1, u => u
.Index("user_index")
.Doc(new User { Age = 26 })
);
if (updateResponse.IsValid)
{
Console.WriteLine("文档更新成功");
}
删除文档
根据文档ID删除文档的示例:
var deleteResponse = client.Delete<User>(1, d => d.Index("user_index"));
if (deleteResponse.IsValid)
{
Console.WriteLine("文档删除成功");
}
注意事项
- Elasticsearch的索引名称必须小写,否则会创建失败
- 生产环境中不要使用默认的连接设置,需要根据实际情况配置超时时间、重试策略等参数
- 如果Elasticsearch服务部署在远程服务器,需要确保防火墙开放了9200端口,并且地址替换为实际的服务地址,比如http://192.168.0.1:9200
- 文档ID如果不手动指定,Elasticsearch会自动生成,但是手动指定ID可以更方便后续更新和删除操作
Elasticsearch.NETC#NEST全文检索修改时间:2026-07-22 05:36:25