在windows上使用docker安装ElasticSearch,及使用NEST客户端简单操作

一、关于es的介绍就不多少了,太多了,直接跳过,默认也有docker desktop环境了,参考官网自己安装也可,Elastic Observability and Security — built on Elasticsearch | Elastic

1.1 拉取es的镜像,写这篇的时候用的最新版8.7.0

docker pull docker.elastic.co/elasticsearch/elasticsearch:8.7.0

1.2 创建docker网络

docker network create elastic

1.3 运行容器

docker run -e ES_JAVA_OPTS="-Xms300m -Xmx300m" --name es01 --net elastic -p 9200:9200 -itd docker.elastic.co/elasticsearch/elasticsearch:8.7.0

博主电脑配置不咋地又只是demo,所以设置了jvm堆大小

1.4 这个版本会默认生成密码和证书指纹还有用于Kibana连接的token,当然你也可以重新生成,这些东西会打印在docker日志中,使用docker logs  容器id可查看日志,为了方便查看,可以导出查看 

1.5如果没其他报错就可以通过http请求es的接口,因为默认开启了认证,所以可以在工具配置一下认证

 二、使用.net core的NEST客户端操作es

NEST官方文档:Introduction | Elasticsearch .NET Clients [7.17] | Elastic

2.1 打开项目文件,添加NEST包

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

2.2 新建一个ElasticClientHelper类,用来连接es服务

        private readonly IConfiguration _configuration;
        private readonly ElasticClient _elasticClient;
        public ElasticClientHelper(IConfiguration configuration)
        {
            _configuration=configuration;
            _elasticClient = InitElasticClient();
        }
        private ElasticClient InitElasticClient()
        {
            Uri uri= new Uri("https://localhost:9200");     
            var settings = new ConnectionSettings(uri)
                .CertificateFingerprint("656e023e9a394c670e0b056d55ad12c2b8d0bf6e9b2a7373fbd38fa711f2d460")
                .BasicAuthentication(_configuration.GetSection("EsConfig")["UserName"], _configuration.GetSection("EsConfig")["Pwd"])
                .EnableApiVersioningHeader();

            var client = new ElasticClient(settings);
            return client;
        }
       
        public ElasticClient GetElasticClient()
        {
            return _elasticClient;
        }
    }

2.2 官方文档建议使用单例的客户端,所以我们将ElasticClientHelper注入为单例的

services.AddSingleton<ElasticClientHelper>();

2.3 在控制器注入ElasticClientHelper

        private readonly ElasticClientHelper _elasticClientHelper;
        
        public EsController(
             ElasticClientHelper elasticClientHelper
            
            )
        {
            _elasticClientHelper = elasticClientHelper;
           
        }

 2.4 新增index_product索引并自动配置mapping,AutoMap方法会根据index_product类的属性自动映射为es的对应类型

        /// <summary>
        /// 创建索引
        /// </summary>
        /// <returns></returns>
        [HttpGet("/CreateIndex")]
        public async Task<IActionResult> CreateIndex()
        {
            var esClient = _elasticClientHelper.GetElasticClient();
            var response = await esClient.Indices
                .CreateAsync("index_product", option => option.Map(
                    map => map.AutoMap<index_product>()));

            return Ok(response.IsValid);
        }
    public class index_product
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public int Count { get; set; }

        public bool Enable { get; set; }

        public decimal Price { get; set; }

        public DateTime CreateTime { get; set; }
    }

2.5 调用接口后,使用kibana查看索引和mapping

kibana: GET index_product/_mapping  

可以看到将我们定义的index_product类自动映射了

2.6 新增或修改索引文档

        /// <summary>
        /// 新增或更新文档
        /// </summary>
        /// <returns></returns>
        [HttpPost("/InsertOrUpdateDoc")]
        public async Task<IActionResult> InsertDoc(Product product)
        {
            var esClient = _elasticClientHelper.GetElasticClient();
            var checkProduct =await _productContext.products.AnyAsync(a => a.Id == product.Id);
            if(checkProduct)
            {
                var updateProduct= await _productContext.products.FirstAsync(a => a.Id == product.Id);
                updateProduct = product;
            }
            else
            {
                await _productContext.products.AddAsync(product);
            }
            
            await _productContext.SaveChangesAsync();
            var response = await esClient.IndexAsync(product, p => p.Index("index_product").Id(product.Id));
            return Ok(response.IsValid);     
        }

 这里数据库判断是否是新增或修改,防止出现数据库和Es的数据不一致问题

2.7 删除文档

        /// <summary> 
        /// 删除文档
        /// </summary>
        /// <returns></returns>
        [HttpPost("/DelDoc")]
        public async Task<IActionResult> DelDoc(int productId)
        {
            DeleteRequest<Product> deleteRequest = new DeleteRequest<Product>("index_product", productId);
            var esClient = _elasticClientHelper.GetElasticClient();
            var delResult = await esClient.DeleteAsync(deleteRequest);
            return Ok();
        } 

2.8简单查询

        /// <summary> 
        /// 分页查询
        /// </summary>
        /// <returns></returns>
        [HttpPost("/PageListDoc")]
        public async Task<IActionResult> PageListDoc(int pageSize=10,int currentPage=1)
        {
            List<QueryContainer> querys = new List<QueryContainer>();
            querys.Add(new MatchQuery()
            {
                Field="name",
                Query="小米"
            });
            //querys.Add(new LongRangeQuery()
            //{
            //    Field = "count",
            //    GreaterThan = 100
            //});

            SearchRequest<Product> searchRequest = new SearchRequest<Product>("index_product")
            {
                From = (currentPage - 1) * pageSize,
                Size = pageSize,
                Query =new BoolQuery()
                {
                    Must= querys
                },
                Sort=new List<ISort>()
                {
                    new FieldSort
                    {
                        Field="count",
                        Order=SortOrder.Ascending
                    }
                } 
            };
            var esClient = _elasticClientHelper.GetElasticClient();
            var searchResult = await esClient.SearchAsync<Product>(searchRequest);
            return Ok(searchResult.Documents);
        }

 

上面分页查询name字段包含“小米”,且根据count字段排序排序。

如果要精确匹配text类型,而text默认有会将字段分词的,可以用 字段.keyword来精确匹配,查看name的mapping

 例如:需要精确找出name等于小米手机的数据

使用 querys.Add(new MatchQuery()
            {
                Field="name",
                Query="小米手机"
            });是会将小米手机分词的,只要满足任一分词就会查询出来

 可以改成:

 querys.Add(new MatchQuery()
            {
                Field="name.keyword",
                Query="小米手机"
            })

 

这是最简单的使用了,NEST还有很多API需要去自己使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是在Windows使用Docker安装Linux并配置DolphinScheduler的步骤: 1. 安装Docker Desktop for Windows 首先需要在Windows安装Docker Desktop for Windows,官方网站可以下载到安装包。安装后启动Docker Desktop for Windows。 2. 在Docker安装Linux系统 在Docker Desktop for Windows中,可以通过命令行或者图形界面下载并安装需要的Linux系统。 以Ubuntu 18.04为例,可以使用以下命令拉取Ubuntu 18.04镜像: ``` docker pull ubuntu:18.04 ``` 然后,使用以下命令启动一个Ubuntu 18.04的容器: ``` docker run -it --name mycontainer ubuntu:18.04 /bin/bash ``` 其中,`-it`参数表示使用交互式终端,`--name`参数指定容器名称,`ubuntu:18.04`表示使用的镜像名称和版本,`/bin/bash`表示容器启动后默认执行的命令。 3. 在Ubuntu 18.04中安装Java和MySQL 在容器中,可以按照DolphinScheduler官方文档的步骤安装Java和MySQL。例如,可以使用以下命令安装Java和MySQL: ``` apt-get update apt-get install -y openjdk-8-jdk mysql-server ``` 安装过程中需要设置MySQL的root密码。 4. 下载并安装DolphinScheduler 下载DolphinScheduler的安装包并解压,然后按照官方文档的步骤进行安装和配置即可。 5. 启动DolphinScheduler服务 安装和配置完成后,可以使用以下命令启动DolphinScheduler服务: ``` cd /opt/dolphinscheduler/bin sh dolphinscheduler-daemon.sh start all ``` 启动后,可以通过浏览器访问DolphinScheduler的Web页面,例如:http://localhost:12345。 注意:在使用Docker部署Linux系统时,需要注意一些权限和网络设置的问题。具体操作可以参考Docker官方文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值