.Net Core中使用NEST简单操作Elasticsearch

.Net Core中使用NEST简单操作Elasticsearch
C#中访问Elasticsearch主要通过两个包NEST和Elasticsearch.Net,NEST用高级语法糖封装了Elasticsearch.Net可以通过类Linq的方式进行操作,而Elasticsearch.Net相比之下更为原始直接非常自由。
注意:ES的8.X以上的版本有新的包Elastic.Clients.Elasticsearc支持。
此处使用NEST,我们通过Nuget安装,如下图:

1、准备结构
准备以下实体
public class Company
{ public string Id { get; set; } public string Name { get; set; } public string Description { get; set; } public User User { get; set; }
} public class User
{ public string Name { get; set; } public int Gender { get; set; }
}2、连接ES
如果是单机连接如下代码,可以直接在Uri上指定账号密码,也可以使用ConnectionSettings的BasicAuthentication来配置账号密码:
var singleNode = new Uri(== new ElasticClient(connSettings);
如果是多个节点集群则如下代码:
var nodes = new Uri[]
{
new Uri("http://esNode1:9200"),
new Uri("http://esNode2:9200"),
new Uri("http://esNode3:9200")
};
var pool = new StaticConnectionPool(nodes);
var settings = new ConnectionSettings(pool);
var client = new ElasticClient(settings);3、创建索引
索引名称必须符合规则否则创建会失败,比如索引只能小写,具体代码如下:
var indexName = "my_index1";//索引名称 var res = await esClient.Indices.CreateAsync(indexName, o => o.Map(g => g.AutoMap<Company>()));//映射结构
也可以在向索引插入数据的时候自动判断是否存在索引,不存在会自动创建。索引结构字段映射一但创建就无法修改,可以通过新建索引然后转移数据的方式修改索引结构,但是可以往里面新增字段映射,比如修改了实体结构新的字段将会被映射。
4、插入数据
使用IndexDocumentAsync方法插入单条数据需要在ConnectionSettings的DefaultIndex方法设置默认索引。使用IndexAsync插入单条数据时需要选择指定索引,如下:
var singleNode = new Uri("http://localhost:9200"); var connSettings = new ConnectionSettings(singleNode);
connSettings.BasicAuthentication("elastic", "123456"); var esClient = new ElasticClient(connSettings.DefaultIndex("my_index1")); var indexName = "my_index1"; var company = new Company()
{
Name = "超级公司bulk",
Description = "超级描述bulk",
}; var res1 = await esClient.IndexDocumentAsync(company); var res2 = await esClient.IndexAsync(company, g => g.Index(indexName)) 如果需要批量插入需要用BulkDescriptor对象包裹,然后使用BulkAsync方法插入,或者不要包裹直接用IndexManyAsync方法插入,具体如下:
var company = new Company()
{
Name = "超级公司bulk",
Description = "超级描述bulk"
});
BulkDescriptor descriptor = new BulkDescriptor();
descriptor.Index<Company>(op => op.Document(company).Index(indexName)); var res = await esClient.BulkAsync(descriptor); //var list = new List<Company>(); //list.Add(company); //var res = await esClient.IndexManyAsync(list, indexName); 如果实体有Id则会使用Id的值做为_id的索引文档唯一值,或者可以通过手动指定如await esClient.IndexAsync(company, g => g.Index(indexName).Id(company.Id)),如果id相同执行插入操作则为更新不会重复插入。在新增后是会返回id等信息可以加以利用。
5、删除数据
删除指定单条数据需要知道数据的id,如下两种方式:
DocumentPath<Company> deletePath = new DocumentPath<Company>(Guid.Empty); var delRes = await esClient.DeleteAsync(deletePath, g => g.Index(indexName)); //或者 IDeleteRequest request = new DeleteRequest(indexName, "1231"); var delRes = await esClient.DeleteAsync(request);
多条删除使用DeleteByQueryAsync方法进行匹配删除,下面两种方式等价,删除Description字段模糊查询有描述的数据(最多10条):
var req = new DeleteByQueryRequest<Company>(indexName)
{
MaximumDocuments = 10,//一次最多删几条
Query = new MatchQuery()
{
Field = "description",
Query = "描述"
}
}; var result = await esClient.DeleteByQueryAsync(req); //等价于
var result = await esClient.DeleteByQueryAsync<Company>(dq =>
dq.MaximumDocuments(10).Query(
q => q.Match(tr => tr.Field(fd => fd.Description).Query("描述"))).Index(indexName)
);6、更新数据
除了上述插入数据时自动根据id进行更新外还有以下的主动更新。
根据id更新单条数据以下代码等价,可以更新部分字段值,但是_id是确定就不会更改的虽然对应的Id字段已被修改:
DocumentPath<Company> deletePath = new DocumentPath<Company>("1231"); var res = await esClient.UpdateAsync(deletePath ,(p) => p.Doc(company).Index(indexName)); //等价于
IUpdateRequest<Company, Company> request = new UpdateRequest<Company, Company>(indexName, "1231")
{
Doc = new Company()
{
Id = "888",
Description = "11111",
}
}; var res = await esClient.UpdateAsync(request); 如果有多个id更新多条数据可以用如下方法:
var res = esClient.Bulk(b => b.UpdateMany(new List<Company>() { new Company()
{
Id="1231",
} }, (b, u) => b.Id(u.Id).Index(indexName).Doc(new Company { Name = "我无语了" })));通过条件批量更新如下,
var req = new UpdateByQueryRequest<Company>(indexName)
{
Maximum.Net Core中使用NEST简单操作Elasticsearch
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。




