程序员的资源宝库

网站首页 > gitee 正文

.NET 操作ES .net 操作influxdb2.0 封装

sanyeah 2024-03-29 17:12:12 gitee 6 ℃ 0 评论

一、查找ES客户端库

打开ES官网,选择学习-》文档,一般选择NEST客户端工具

 新建一个项目,并添加NEST包

    public class Person
    {
        public int Id { get; set; }

        [Keyword]
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
新建一个实体

创建索引

            var settings = new ConnectionSettings(new Uri("http://127.0.0.1:9200"))
                            .DefaultIndex("people");
            var client = new ElasticClient(settings);

            List<Person> list = new();
            for (int i = 0; i < 10; i++)
            {
                Person person = new Person();
                person.Id = i;
                person.FirstName = "张三"+i; 
                list.Add(person);
            }
            client.IndexMany<Person>(list);
View Code

通过命令查看文档结构

GET /people/_mapping?pretty

 

 发现firstName的类型为text, (text类型会进行分词处理)

查询FirstName包含“张三"的前10条数据

         var searchResponse = client.Search<Person>(s => s
                    .From(0)
                .Size(10)
                .Query(q => q
                         .Match(m => m
                            .Field(f => f.FirstName)
                            .Query("张三")
                         )
                    )
                );

            var people = searchResponse.Documents;
            Console.WriteLine("查询结果");
            foreach (var item in people)
            {
                Console.WriteLine($"id:{item.Id},firstname:{item.FirstName},lastname:{item.LastName}");
            }
View Code

注意:ES数据刷盘延迟--默认1s ,所以添加数据后需要等待1秒才能查询出数据

 查询结果为

 

查询FirstName包含张三,并且id大于3的文档

      var ss = client.Search<Person>(s => s.Query(
                      m => m.Bool(
                          m => m.Must(
                              x => x.Match(m => m.Field(f => f.FirstName).Query("张三1")
                                           ), mm => mm.Range(xx => xx.Field(f => f.Id).GreaterThan(3))
                                     )
                               )

                      )
                ).Documents;
View Code

是不是发现要编写如上的查询条件非常苦难,幸好找到一个工具可以为我们书写如上查询提供一些帮助(虽然不能直接使用,但至少可以借鉴)

直接运行ElasticHD.exe,会显示如下网页

 

通过直接编写SQL语句,最后转化为ES的查询条件,是不是感觉很方便,但还不够完美,需要自己在程序里进行转换,至少不需要自己完全编写ES查询条件了

 ,其实ES提供了一个SQL查询工具,直接就可以使用SQL语句来查询数据。在ES运行目录里有一个elasticsearch-sql-cli.bat客户端工具,直接运行后就可以在上面编写SQL语句。

 

注意:书写完SQL语句后一定要加上";" 否则会一直等待不执行

 那么程序怎么通过SQL来查询ES的数据呢?

我们只需要在程序里调用“http://127.0.0.1:9200/_xpack/sql?format=csv”地址,在发起http请求,就可以通过sql来查询ES数据了

        public static string Post(QueryParam queryParam, string url = "http://127.0.0.1:9200/_xpack/sql?format=csv")
        {
            HttpWebRequest request = null;
            try
            {
                request = (HttpWebRequest)WebRequest.Create(url);
                var data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(queryParam));
                //request.Accept = "application/json; charset=UTF-8"; // 设置响应数据的ContentType
                request.Method = "POST";
                request.ContentType = "application/json"; // 设置请求数据的ContentType
                request.ContentLength = data.Length;
                request.Timeout = 90000;
                // 设置入参
                using (var stream = request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
                // 发送请求
                var response = (HttpWebResponse)request.GetResponse();
                // 读取出参
                using (var resStream = response.GetResponseStream())
                {
                    using (var reader = new StreamReader(resStream, Encoding.UTF8))
                    {
                        return reader.ReadToEnd();
                    }
                }
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                // 释放连接
                if (request != null) request.Abort();
            }
        }
    public class QueryParam
    {
        public string query { get; set; }
    }
View Code

是不是感觉非常的方便呢?但当我们调用select * from my_index2;查询时,却发现出错了

 

 原因分析:因为my_index2索引中存在一个字段类型为text

 

这是就需要借助于第三方的开源插件 ,找到对应的ES版本,下载下来安装到ES插件中,具体安装可以查看ik分词器插件的安装(注意插件名称为sql)

调用地址要发生改变,需要使用“http://127.0.0.1:9200/_nlpcn/sql”,而“http://127.0.0.1:9200/_xpack/sql?format=csv”为官方提供给我们使用的地址

同时需要注意,在程序里调用时sql命令后不需要";"符号

最后献上DEMO地址

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表