ElasticSearch学习第二篇:.net core中使用ES

前言

在上一篇文章《ElasticSearch学习第一篇:windows环境下安装使用》,我已经简单介绍了关于ES的安装部署及一些概念性的东西,还有一些简单的增删改查操作。本文主要也是做一些增删改查操作,不同的是,我们要通过代码来实现。

.net关于ES的客户端

在.net客户端中,官网给我们提供了两个客户端Elasticsearch.Net和NEST
Elasticsearch.Net是一个低级别、无依赖的客户端,它对您如何构建和表示您的请求和响应没有任何意见。它已经足够抽象,因此所有Elasticsearch API 端点都表示为方法,但不会太多妨碍您构建 json/request/response 对象的方式。它还带有内置的、可配置/可覆盖的集群故障转移重试机制。Elasticsearch 是有弹性的,那么为什么不是您的客户呢?

NEST是一个高级客户端,将所有请求和响应映射为类型,并带有一个强类型查询 DSL,它使用 Elasticsearch 查询 DSL 映射 1 到 1。它利用特定的 .NET 功能来提供更高级别的抽象,例如CLR 类型的自动映射。在内部,NEST 使用并且仍然公开低级Elasticsearch.Net客户端,提供对 NEST 功能的访问,并允许用户在需要时下拉到低级客户端。
----来自官网的介绍

在.net core 5使用ES

这里我选择的是NEST,首先我创建了一个webapi的项目,将Nest的Nuget包添加进来。

<PackageReference Include="NEST" Version="7.16.0" />

然后在Startup将服务注册进来,并将ES的配置信息放在appsetting,json文件中

public void ConfigureServices(IServiceCollection services)
{
var url = Configuration["Elasticsearch:Url"] ?? "http://localhost:9200";
var defaultIndex = Configuration["Elasticsearch:DefaultIndex"] ?? "news";

var settings = new ConnectionSettings(new Uri(url))
   .DefaultIndex(defaultIndex)
   .BasicAuthentication(Configuration["Elasticsearch:UserName"], Configuration["Elasticsearch:PassWord"]);
var client = new ElasticClient(settings);
services.AddSingleton<IElasticClient>(client);

services.AddControllers();
services.AddSwaggerGen(c =>
{
   c.SwaggerDoc("v1", new OpenApiInfo { Title = "ElasticsearchDemo", Version = "v1" });
});
}

appsetting,json

  "Elasticsearch": {
    "Uri": "http://localhost:9200",
    "DefaultIndex": "stdtrainning",
    "UserName": "elastic",
    "PassWord": "123456"
  }

这时候我们已经可以使用NEST客户端了,直接创建个控制器,然后构造函数,在写简单的CURD操作

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Nest;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace ElasticsearchDemo.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ESController : ControllerBase
    {
        private readonly IElasticClient _elasticClient;
        private readonly IConfiguration _configuration;

        public ESController(IElasticClient elasticClient, IConfiguration configuration)
        {
            _elasticClient = elasticClient;
            _configuration = configuration;
        }
        /// <summary>
        /// 新增
        /// </summary>
        /// <param name="param"></param>
        [HttpPost("IndexAsync")]
        public async Task<dynamic> IndexAsync([FromBody] News param)
        {
            var response = await _elasticClient.IndexAsync(param, x => x.Index(_configuration["Elasticsearch:DefaultIndex"]));
            return response.IsValid ? Ok(response.Id) : StatusCode(500);
        }
        /// <summary>
        /// 查询单个
        /// </summary>
        /// <param name="param"></param>
        [HttpGet("GetAsync")]
        public async Task<dynamic> GetAsync(string id)
        {
            var response = await _elasticClient.GetAsync<News>(id, x => x.Index(_configuration["Elasticsearch:DefaultIndex"]));
            return response.IsValid ? Ok(response.Source) : NotFound();
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="id"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        [HttpPut("UpdateAsync")]
        public async Task<dynamic> UpdateAsync(string id, [FromBody] News value)
        {
            var response = await _elasticClient.UpdateAsync<News>(id, x => x.Index(_configuration["Elasticsearch:DefaultIndex"]).Doc(value));
            return response.IsValid ? Ok(response.Id) : StatusCode(500);
        }

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("DeleteAsync")]
        public async Task<dynamic> DeleteAsync(string id)
        {
            var response = await _elasticClient.DeleteAsync<News>(id, x => x.Index(_configuration["Elasticsearch:DefaultIndex"]));
            return response.IsValid;
        }
        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="param"></param>
        [HttpPost("SearchAsync")]
        public async Task<dynamic> SearchAsync(string keyword)
        {
            var request = new SearchRequest
            {
                From = 0,
                Size = 20,
                Query = new MatchQuery { Field = "title", Query = keyword } ||
                        new MatchQuery { Field = "content", Query = keyword }
            };
            var response = await _elasticClient.SearchAsync<News>(request);
            return Ok(response.Documents);
        }
    }
    public class News 
    {
        public string Id { get; set; }
        public string Title { get; set; }
        public string Column { get; set; }
        public string Content { get; set; }
    }
}

测试

先直接在postman查询看看news索引库,一共有三条数据

{
    "took": 859,
    "timed_out": false,
    "_shards": {
        "total": 3,
        "successful": 3,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "news",
                "_type": "_doc",
                "_id": "2",
                "_score": 1.0,
                "_source": {
                    "id": "2",
                    "title": "娱乐新闻2",
                    "column": "娱乐栏目",
                    "content": "娱乐内容2"
                }
            },
            {
                "_index": "news",
                "_type": "_doc",
                "_id": "3",
                "_score": 1.0,
                "_source": {
                    "id": "3",
                    "title": "体育新闻1",
                    "column": "体育栏目",
                    "content": "体育内容1"
                }
            },
            {
                "_index": "news",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0,
                "_source": {
                    "id": "1",
                    "title": "娱乐新闻1",
                    "column": "娱乐栏目",
                    "content": "娱乐内容1"
                }
            }
        ]
    }
}

调用查询接口,模糊查询出来一条数据,没问题
在这里插入图片描述
简单的操作就到这里了,后续我会将完整的一套ES仓储层实现代码上传github

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于在.NET Core使用Elasticsearch,您可以使用官方提供的Elasticsearch .NET客户端库。这个库为您提供了一个简单而强大的方式来与Elasticsearch进行交互。 首先,您需要在.NET Core项目安装Elasticsearch .NET客户端库。您可以通过NuGet包管理器或通过命令行来执行安装。在安装完成后,您可以在代码导入所需的命名空间。 接下来,您需要与Elasticsearch建立连接。您可以使用`ConnectionSettings`类来配置连接参数,例如Elasticsearch服务器的URL、索引名称等。然后,使用`ElasticClient`类创建一个客户端实例来执行各种操作,如索引创建、文档插入、搜索等。 以下是一个简单的示例代码,演示如何在.NET Core使用Elasticsearch进行基本操作: ``` using Elasticsearch.Net; using Nest; class Program { static void Main(string[] args) { var settings = new ConnectionSettings(new Uri("http://localhost:9200")) .DefaultIndex("your_index_name"); var client = new ElasticClient(settings); // 创建索引 var createIndexResponse = client.Indices.Create("your_index_name", c => c .Map<Document>(m => m.AutoMap()) ); // 插入文档 var document = new Document { Id = 1, Title = "Hello World", Content = "This is a sample document" }; var indexResponse = client.IndexDocument(document); // 搜索文档 var searchResponse = client.Search<Document>(s => s .Query(q => q .Match(m => m .Field(f => f.Title) .Query("Hello") ) ) ); // 输出搜索结果 foreach (var hit in searchResponse.Hits) { Console.WriteLine($"Id: {hit.Source.Id}, Title: {hit.Source.Title}, Content: {hit.Source.Content}"); } } } public class Document { public int Id { get; set; } public string Title { get; set; } public string Content { get; set; } } ``` 这只是一个简单的示例,您可以根据自己的需求扩展和定制。希望对您有所帮助!如果您有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello,Mr.S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值