zoukankan      html  css  js  c++  java
  • .NET 操作ES

    一、查找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地址

  • 相关阅读:
    MarkDown 基本语法
    JavaScript 关于setTimeout与setInterval的小研究
    Openlayers 实现轨迹播放/暂停/重新播放/从点击处播放/提速/减速
    Openlayers ol.interaction.Select传值问题
    Openlayers ol.interaction.Select取消默认选中效果
    Openlayers Projection导致经纬度颠倒问题
    ArcGIS 切片与矢量图图层顺序问题
    PostGIS 爆管分析之找出总阀门
    计算机网络原理-5
    k8s中部署基于nfs的StorageClass
  • 原文地址:https://www.cnblogs.com/Duko/p/14853718.html
Copyright © 2011-2022 走看看