.Net使用ElasticSearch

前言

Elastic官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/eql.html#specify-a-timestamp-or-event-category-field

CSDN大佬的ElasticSearch和Kibana安装通道

本文章的主要目的就是了解ElasticSearch的基本用法,以及在.Net中简单操作一些ElasticSearch的数据

Elasticsearch 是一个开源的分布式搜索和分析引擎,它被设计用来快速、准确地进行大规模数据的搜索和分析。Elasticsearch 基于 Apache Lucene 搜索引擎构建,提供了一个分布式的实时文档存储和检索引擎,适用于各种用例,包括文本搜索、日志分析、应用程序性能监控等。

以下是 Elasticsearch 的一些主要特点和用途:

全文搜索:Elasticsearch 支持全文搜索,可以快速检索大量的文本数据,并提供相关性排序和高亮显示等功能。

实时数据分析:Elasticsearch 具有实时性,可以快速索引新数据并立即使其可查询,适用于实时监控和分析场景。

分布式架构:Elasticsearch 是分布式的,数据被自动分片存储在集群中的多个节点上,提供了高可用性和横向扩展性。

多种用途:Elasticsearch 可以用于各种用例,包括搜索引擎、日志和指标分析、安全信息和事件管理等。

RESTful API:Elasticsearch 提供了基于 RESTful API 的交互方式,方便与各种编程语言和工具集成。

强大的聚合功能:Elasticsearch 提供了丰富的聚合功能,可以对数据进行统计、分组、过滤等操作。

总的来说,Elasticsearch 是一个功能强大且灵活的搜索和分析引擎,广泛应用于企业级应用程序中,为用户提供快速、准确的数据搜索和分析能力。

主体内容

一.Kibana中ElasticSearch的基础操作

进入Kibana在左侧的菜单栏中,有一个开发工具,里面可以进行简单的ElasticSearch命令操作
注意:ElasticSearch中的语言类型为强类型语言,命令字符GET(查询),POST(新增),PUT(修改),DELETE(删除)只能以大写为前缀;document中的字段建议小写,在.Net中操作的时候大写前缀会无法辨别,
在这里插入图片描述

1.GET(查询)

查询所有索引(Index)

GET _search

查询指定索引

GET user/_search

添加查询条件
这里推荐一个在线sql格式转es格式转换工具 PrintLove:https://old.printlove.cn/tools/sql2es
这个网址可以将我们熟知的sql语句转换成es所需的条件语句,另外这里还有几个其他格式文档的转换
在这里插入图片描述

这样我们在kibana中就能执行对应的条件过滤了

GET user/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "match_phrase": {
                        "name": {
                            "query": "黄"
                        }
                    }
                }
            ]
        }
    },
    "from": 0,
    "size": 1
}

在这里插入图片描述

使用sql语句查询,获得txt格式数据

GET /_sql?format=txt
{
  "query": "SELECT * FROM user"
}

在这里插入图片描述
使用sql语句查询,获得json格式数据

GET /_sql?format=json
{
  "query": "SELECT * FROM user"
}

在这里插入图片描述

1.POST(新增)

命令格式 POST user/_doc/id 其中id不指定,系统会自动生成一个字符串id

POST user/_doc
{
  "name":"hgcjd",
  "age":18
}

在这里插入图片描述

1.PUT(修改)

命令格式 PUT index/_doc/id

PUT user/_doc/b2B_O44B65XW4Pz-I4W7
{
  "name":"hgcjd2",
  "age":18
}

在这里插入图片描述

1.DELET(删除)

命令格式 Delete index/_doc/id

Delete user/_doc/b2B_O44B65XW4Pz-I4W7

在这里插入图片描述

二.在.Net中,对ElasticSearch进行基础操作

这里我使用的是.net6的控制台程序,需要安装NEST包
在这里插入图片描述

1.DotNet连接ElasticSearch

连接成功后,//开始执行操作占位符,就可以放其他的es操作代码块了

var settings = new ConnectionSettings(new Uri("https://localhost:9200/"))
    //.DefaultIndex("user") //可以在连接ElasticSearch的时候,就选择Index
    .BasicAuthentication("elastic", "你的elastic密码")
    // 忽略证书验证,仅用于测试环境,请勿在生产环境中使用
    .ServerCertificateValidationCallback((sender, certificate, chain, sslPolicyErrors) => true);

var client = new ElasticClient(settings);
var clusterHealth = client.Cluster.Health();
if (clusterHealth.IsValid){
	//开始执行操作
}else{
	Console.WriteLine($"ElasticSearch连接失败{clusterHealth.OriginalException.Message}");
}

添加一个User类

public class User
{
    public string Id { get; set; }

    public string Name { get; set; }

    public int Age { get; set; }
}

2.DotNet查询ElasticSearch指定Index的数据

a.这里用了一些NEST包的查询条件,非常的不方便
#region 查询数据
    var searchResponse = await client.SearchAsync<User>(s => s.Index("user") //选择Index,否则程序会异常
                                                                             //.From((1 - 1) * 10) //取数启始位置
                                                                             //.Size(10)   //指定页面大小
                                                                             //.Query(e=>e.Range(r=>r.Field(f=>f.Age).GreaterThanOrEquals(18).LessThan(80)))    //查询条件:年龄大于等于18 并且 年龄小于80 
                                                                             //.Query(e=>e.Prefix(r=>r.Field(f=>f.Name).Value("黄")))   //查询条件:名字以"黄"字开头
                                                                             //.Query(e => e.Match(r => r.Field(f => f.Name).Query("尔")))  //查询条件:名字包含"尔"字
                                                                             //.Sort(s=>s.Field(f=>f.Age,SortOrder.Descending))   //根据年龄降序排序
        );
    if (searchResponse.IsValid)
    {
        foreach (var hit in searchResponse.Hits)
        {
            var model = new User()
            {
                Id = hit.Id,
                Name = hit.Source.Name,
                Age = hit.Source.Age,
            };
            Console.WriteLine($"ID:{model.Id};\t姓名:{model.Name};\t年龄:{model.Age}");
            //userList.Add(model);
        }
        //Console.WriteLine(JsonConvert.SerializeObject(userList));
    }
    else
    {
        Console.WriteLine($"查询失败:{searchResponse.OriginalException.Message}");
    }
    #endregion

在这里插入图片描述

b.使用Kibana中的ES语句查询ElasticSearch

这里获取到的结果是一个很长的json字符串,还需要单独解析

 var searchResponse = client.LowLevel.Search<StringResponse>("user", @"{
      ""query"": {
      ""bool"": {
        ""must"": [
          {
            ""match_all"": { }
          }
        ],
        ""must_not"": [ ],
        ""should"": [ ]
        }
      },
      ""from"": 0,
      ""size"": 10,
      ""sort"": [ ],
      ""aggs"": { }
    }");

    if (searchResponse.Success)
    {
        Console.WriteLine(searchResponse.Body); // 处理查询结果
    }
    else
    {
        Console.WriteLine($"Error executing search query: {searchResponse.OriginalException.Message}");
    }

在这里插入图片描述

c.使用Sql语句查询ElasticSearch(需要单独下载对应版本的ElasticSearch-Sql插件)

github大佬的ElasticSearch-Sql安装地址,找到对应的ES版本:https://github.com/NLPchina/elasticsearch-sql/releases
我安装的es版本太新了,是elasticsearch-8.12.2版本的,看了一下大佬的插件版本,还没有更新到这

#region 使用sql查询
var sql = "select * from user where age > 18 Order by age desc";
//var url = "https://localhost:9200/_sql?format=json";//返回json格式数据
var url = "https://localhost:9200/_sql?format=txt";//返回txt格式数据

//忽略SSL认证
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
var data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new { query = sql }));
request.Accept = "application/json;charset=UTF-8";
request.Method = "POST";
request.ContentType = "application/json";
request.Timeout = 90000;

//账号密码认证
NetworkCredential credential = new NetworkCredential("elastic", "你的密码");
request.Credentials = credential;
using (var strea = request.GetRequestStream())
{
    strea.Write(data,0,data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
using (var resStream = response.GetResponseStream())
{
    using (var reader = new StreamReader(resStream,Encoding.UTF8))
    {
        Console.WriteLine(reader.ReadToEnd());
    }
}
#endregion

在这里插入图片描述

3.DotNet新增ElasticSearch数据

#region 新增数据
var UserInfo = new User()
{
    Name = "黄瓜炒鸡蛋",
    Age = 20,
};
var addResponse = client.IndexDocument(UserInfo);
if (addResponse.IsValid)
{
    Console.WriteLine($"新增ID为{addResponse.Id}的数据成功");
}
else
{
    Console.WriteLine($"操作失败:{addResponse.OriginalException.Message}");
}
#endregion

4.DotNet修改ElasticSearch数据

下面的bmB9O44B65XW4Pz-foX9为数据Id

#region 修改数据
var updateResponse = client.Update<User>("bmB9O44B65XW4Pz-foX9", u => u
.Index("user") // 替换为你的索引名称
.Doc(new User
{
    Name = "福尔摩斯",
    Age = 35,
})
);

if (updateResponse.IsValid)
{
    Console.WriteLine("修改成功");
}
else
{
    Console.WriteLine("修改失败: " + updateResponse.OriginalException.Message);
}
#endregion

5.DotNet删除ElasticSearch数据

下面的cGCFO44B65XW4Pz-M4X5为数据Id

#region 删除数据
var deleteResponse = client.Delete<User>("cGCFO44B65XW4Pz-M4X5", d => d
.Index("user") // 替换为你的索引名称
);

if (deleteResponse.IsValid)
{
    Console.WriteLine("删除成功");
}
else
{
    Console.WriteLine("删除失败 " + deleteResponse.OriginalException.Message);
}
#endregion
  • 16
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值