.Net使用ElasticSearch

文章目录

  • 前言
  • 主体内容
    • 一.Kibana中ElasticSearch的基础操作
      • 1.GET(查询)
      • 1.POST(新增)
      • 1.PUT(修改)
      • 1.DELET(删除)
    • 二.在.Net中,对ElasticSearch进行基础操作
      • 1.DotNet连接ElasticSearch
      • 2.DotNet查询ElasticSearch指定Index的数据
        • a.这里用了一些NEST包的查询条件,非常的不方便
        • b.使用Kibana中的ES语句查询ElasticSearch
        • c.使用Sql语句查询ElasticSearch(需要单独下载对应版本的ElasticSearch-Sql插件,待验证)
      • 3.DotNet新增ElasticSearch数据
      • 4.DotNet修改ElasticSearch数据
      • 5.DotNet删除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
}

在这里插入图片描述

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 order by age desc";
var response = await client.SearchAsync<User>(s => s.Index("user").Query(q => q.QueryString(qs => qs.Query(sql))));if (response.IsValid)
{foreach (var hit in response.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}");}
}
else
{Console.WriteLine($"Error executing SQL query: {response.OriginalException.Message}");
}#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539296.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型笔记:吴恩达 ChatGPT Prompt Engineering for Developers(1) prompt的基本原则和策略

1 intro 基础大模型 VS 用指令tune 过的大模型 基础大模型 只会对prompt的文本进行续写 所以当你向模型发问的时候&#xff0c;它往往会像复读机一样续写几个问题这是因为在它见过的语料库文本&#xff08;通常大多来自互联网&#xff09;中&#xff0c;通常会连续列举出N个问…

react/vue项目刷新页面404的原因以及解决办法

项目 公司官网 背景 1、问题描述&#xff1a;react/vue项目&#xff0c;正常的页面操作跳转&#xff0c;不会出现404的问题&#xff0c;但是一旦刷新&#xff0c;就会出现404报错 2、产生原因&#xff1a;我们打开react/vue打包后生成的dist文件夹&#xff0c;可以看到只有一…

基于MATLAB的直流无刷电机速度控制

作品简介 基于MATLAB的直流无刷电机速度控制 仿真平台&#xff1a;Matlab 仿真结果为&#xff1a;

npm报错,显示certificate has expired

从报错信息就可以知道是因为之前设置的淘宝镜像已过期&#xff0c;解决方法就是要把之前设置的淘宝镜像改成新的 第一种方法 第一步&#xff1a;清空缓存 npm cache clean --force第二步&#xff1a;重新设置新的镜像源 npm config set registry https://registry.npmmirror…

django-q轻量级定时任务制定

django-q ,celery&#xff0c;apschedule都可以作为python的选型&#xff0c;但是django-q更轻量级&#xff0c;可以定制想要的任务&#xff0c;通过消息中间件&#xff0c;来实现不太高并发的实现 官网介绍地址 django-q官网地址 本次测试的是python3.12版本 首先需要安装dja…

QT 如何防止 QTextEdit 自动滚动到最下方

在往QTextEdit里面append字符串时&#xff0c;如果超出其高度&#xff0c;默认会自动滚动到QTextEdit最下方。但是有些场景可能想从文本最开始的地方展示&#xff0c;那么就需要禁止自动滚动。 我们可以在append之后&#xff0c;添加如下代码&#xff1a; //设置编辑框的光标位…

华为配置WLAN外置Portal认证实验

华为配置WLAN外置Portal认证示例 组网图形 图1 配置WLAN外置Portal认证示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤 业务需求 某企业为了提高WLAN网络的安全性&#xff0c;采用外置Portal认证方式&#xff0c;实现对用户的接入控制。 组网需求 AC组…

论文阅读——Align before Fuse

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation image-text contrastive learning(ITC)用在单模态&#xff0c;masked language modeling (MLM) and image-text matching (ITM) 用在多模态。 单模态编码器的表示上引入了中间图像…

如何在Windows 10上打开和关闭平板模式?这里提供详细步骤

前言 默认情况下&#xff0c;当你将可翻转PC重新配置为平板模式时&#xff0c;Windows 10会自动切换到平板模式。如果你希望手动打开或关闭平板模式&#xff0c;有几种方法可以实现。​ 自动平板模式在Windows 10上如何工作 如果你使用的是二合一可翻转笔记本电脑&#xff0…

常见的十大网络安全攻击类型

常见的十大网络安全攻击类型 网络攻击是一种针对我们日常使用的计算机或信息系统的行为&#xff0c;其目的是篡改、破坏我们的数据&#xff0c;甚至直接窃取&#xff0c;或者利用我们的网络进行不法行为。你可能已经注意到&#xff0c;随着我们生活中越来越多的业务进行数字化&…

嵌入式学习day37 数据结构

1.sqlite3_open int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); 功能: 打开数据库文件(创建一个数据库连接) 参数: filename:数据库文…

django-comment-migrate 模型注释的使用

django-comment-migrate 的使用 django-comment-migrate 是一个 Django 应用&#xff0c;用于将模型注释自动迁移到数据库表注释中。它可以帮助您保持数据库表注释与模型定义的一致性&#xff0c;并提高代码的可读性。 安装 要使用 django-comment-migrate&#xff0c;您需要…