dotNet Core 3.1 使用 Elasticsearch

Elasticsearch 是基于 Lucene 的搜索引擎。可以非常方便地实现分布式的全文搜索,本文介绍在 dotNet Core 3.1 中怎样使用  Elasticsearch 。

版本

  • dotnet Core :3.1

  • Elasticsearch:7.6.1

  • Kibana:7.6.1

  • NEST:7.10.1

  • Docker:19.03.13

Docker 安装 Elasticsearch

为了方便,我们以 Docker 的方式来进行安装,这里使用的版本为 7.6.1,首先执行下面命令进行镜像的拉取:

docker pull elasticsearch:7.6.1

注意:这里需要指定相关版本,版本可以在 dockerhub 上进行查询 ,否则拉镜像的时候可能出现 下面错误:

Error response from daemon: manifest for elasticsearch:latest not found: manifest unknown: manifest unknown

镜像成功拉取后,执行 docker run 命令构建容器,命令如下:

docker run -d --name myes -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" elasticsearch:7.6.1

为了更好地进行中文的搜索,需要安装中文分词插件,本文中安装的中文分词插件为 ik ,版本和 Elasticsearch 一致,安装方法如下:

进入 Elasticsearch 容器后执行:

./bin/elasticsearch-plugin install [https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.6.1/elasticsearch-analysis-ik-7.6.1.zip](https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.5.4/elasticsearch-analysis-ik-6.5.4.zip)

安装成功后的如下图所示:

Docker 安装 Kibana

Kibana 是一个免费的用户界面,能够让您对 Elasticsearch 数据进行可视化,不是必须,但可以更好地查看数据。

执行下面命令进行镜像的拉取,版本和 Elasticsearch 一致:

docker pull kibana:7.6.1

在宿主机创建 /root/data/elk/ 目录并创建配置文件 kibana.yml ,内容如下:

# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://172.17.0.6:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true

elasticsearch.hosts 配置为 Elasticsearch 的访问地址。

执行下面命令进行容器的创建

docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name mykibana -p 5601:5601 -v /root/data/elk/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.6.1

创建成功后,可以通过 5601 端口进行访问。

Elasticsearch 的 API

Elasticsearch 提供 API 的方式来进行数据操作,非常方便,常用的三个接口:

  • 插入数据

  • 获取单条数据

  • 查询数据

插入数据

http://10.211.55.6:9200/index/oec2003/1

  • index:我的理解是相当于数据库表的概念;

  • oec2003:在 Elasticsearch 的 index 中有个 Type 的概念,相当于分组,当前的 7.6.1 版本中一个 index  中只能有一个 Type ,所以相当于可以忽略;

  • 1:单条记录的 id;

  • 接口为 Post 方式,数据内容为 Json 格式,字段可以随便定义,而且每条数据的字段可以不相同。

获取单条数据

http://10.211.55.6:9200/index/oec2003/1

搜索数据

http://10.211.55.6:9200/index/oec2003/_search

  • 查询接口为 Post 方式;

  • 查询表达式也是 Json 格式,如果熟悉 MongoDB 的 Document ,应该会感觉很熟悉。

在 dotNet Core 3.1 中使用

1、在 VS 2019 中创建 dotNet Core 3.1  的 WebAPI 项目 ElasticsearchWebAPIDemo ;

2、引用 Nuget 包 NEST;

3、创建一个 Elasticsearch 的客户端连接接口和类,代码如下:

class ESClientProvider : IESClientProvider
{private ElasticClient _client;public ESClientProvider(){}public ElasticClient GetClient(){if (_client != null)return _client;InitClient();return _client;}private void InitClient(){var node = new Uri("http://10.211.55.6:9200");_client = new ElasticClient(new ConnectionSettings(node).DefaultIndex("artiles"));}
}
public interface IESClientProvider
{ElasticClient GetClient();
}

4、在 Startup 类的 ConfigureServices 方法中将 ESClientProvider 类注册为单例

public void ConfigureServices(IServiceCollection services)
{services.AddSingleton<IESClientProvider, ESClientProvider>();services.AddSwaggerGen(c =>{c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });});services.AddControllers();
}

5、创建 Article 实体类


[ElasticsearchType(IdProperty = "Id")]
public class Article
{[Keyword]public string Id { get; set; }[Keyword]public string Title { get; set; }[Keyword]public string Auther { get; set; }[Keyword]public string SubTitle { get; set; }
} 

6、创建 ESController,添加创建 index 的方法

[HttpGet]
[Route("CreateIndex")]
public bool CreateIndex(string indexName)
{var res = _client.Indices.Create(indexName, c => c.Map<Article>(h => h.AutoMap().Properties(ps => ps.Text(s => s.Name(n => n.Title).Analyzer("ik_smart").SearchAnalyzer("ik_smart")).Text(s => s.Name(n => n.SubTitle).Analyzer("ik_smart").SearchAnalyzer("ik_smart")))));return res.IsValid;
}
  • 对什么字段进行索引需要进行指定

  • 字段的分词器和搜索关键字的分词器建议使用相同,否则可能搜索不到数据,例如上面代码中都指定为 ik_smart

7、添加 AddArticles 的方法

[HttpPost]
[Route("AddArticles")]
public bool AddArticles()
{// 获取数据批量进行插入List<Article> listArticle = GetArticles();return _client.IndexMany(listArticle).IsValid;
}

8、添加高亮搜索的方法 SearchHighlight

[HttpPost]
[Route("SearchHighlight")]
public List<Article> SearchHighlight(string key, int pageIndex = 0, int pageSize = 10)
{var searchAll = _client.Search<Article>(s => s.From(pageIndex).Size(pageSize).Query(q => q.QueryString(qs => qs.Query(key).DefaultOperator(Operator.Or))).Highlight(h => h.PreTags("<span class='color:red;'>").PostTags("</span>").Encoder(HighlighterEncoder.Html).Fields(fs => fs.Field(p => p.Title),fs => fs .Field(p => p.SubTitle))));foreach (var hit in searchAll.Hits){foreach (var highlightField in hit.Highlight){if (highlightField.Key == "title"){foreach (var highlight in highlightField.Value){hit.Source.Title = highlight.ToString();}}else if (highlightField.Key == "subTitle"){foreach (var highlight in highlightField.Value){hit.Source.SubTitle = highlight.ToString();}}}}return searchAll.Documents.ToList();
}

在 Kibana 中查看数据

Kibana 容器运行起来后,可以通过端口 5601 进行访问,进行简单配置就可以查看数据了,具体步骤如下:

1、进入 Management→ Index Management ,如下图:

在改功能中可以维护所有的 idnex ,也可以看看我们创建的 index 有没有在里面显示:

2、在 Index Patterns 中进行 index pattern 的添加,名字可以进行模糊匹配:

3、在 Discover 菜单中进行数据查看,在这里可以选择之前创建的 index pattern:

总结

本文只是很简单的一个示例,带你入门,有了基本概念后,深入学习更多的高级用法就很容易了,文章中部分示例代码来自团队中的王同学,在此感谢!

希望本文对您有所帮助!

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

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

相关文章

在.NET Core 中实现健康检查

.NET Core中提供了开箱即用的运行状况检查&#xff0c;首先&#xff0c;我将在.NET Core API应用程序中执行运行状况检查&#xff0c;接下来&#xff0c;我们将使用DbContext集成SQL Server或数据库的运行状况检查&#xff0c;最后是如何实现自定义服务的运行状况检查。在ASP.N…

python3.7安装keras教程_Python3.7安装keras和TensorFlow的教程图解

win10 Python3.7安装keras深度学习集成包 TensorFlow 和Ubuntu下安装keras 在win10下安装 安装时必须检查你的python是否为64位&#xff0c;32位不支持&#xff01;&#xff01;&#xff01; 32 位卸载下载其中的64位在python官网 然后在 pip install --upgrade tensorflow 如果…

python离群点检测_如何从熊猫DataFrame中检测峰点(离群值)

我有一个带有多个速度值的熊猫数据帧&#xff0c;这些速度值是连续移动的值&#xff0c;但它是一个传感器数据&#xff0c;因此我们经常在中间出现误差的情况下&#xff0c;移动平均值似乎也无济于事&#xff0c;所以我可以采用什么方法用于从数据中删除这些离群值或峰点&#…

普通故障处理流程

一般OA或者BOSS的用户报故障后流程如下。、从中心机房扫描微波如果基站端能扫描到&#xff0c;但是客户端无法扫描。基本可以排除 基站端设备正常&#xff08;除天线外&#xff09;。问题一般出在客户那里&#xff0c;比如客户端微波数据丢失&#xff0c;停电。天线问题&#x…

读书 | IT人如何直击本质洞察底层逻辑?

【好书共读】| 作者/Edison Zhou作为IT技术人&#xff0c;我们不仅要精进技术&#xff0c;也要在技术之外修炼自己的软能力。本质思考&#xff0c;是一种直击事物本质的能力&#xff0c;是思考“思考的方法”&#xff0c;是一切思考的原动力。我们不用担心这个能力在其他企业用…

内网通mac能用吗_纯干货!小容量Mac装外置硬盘Windows系统最完美的方案!(多图)...

很多用Mac 的同学都会碰到一个很头疼的问题&#xff0c;那就是对 Windows系统的需求&#xff0c;macOS系统虽好&#xff0c;但是很多专业性软件都没有Mac 版本(特别是对国内的用户)&#xff0c;这时大家就会对 Windows系统有需求了。这时候很多同学会想到使用虚拟机或者装 Boot…

卖shell看站什么意思_粤语俚语卖咸鸭蛋是什么意思?

点读&#xff1a;卖咸鸭蛋&#xff08;maai6 haam4 aap3 daan6&#xff09;点解&#xff1a;就是死了的意思点造句&#xff1a;粤&#xff1a;您搵丧彪啊&#xff0c;佢琴日去劈友唔小心赖咗嘢&#xff0c;宜家已经去咗卖咸鸭蛋啦~~普&#xff1a;你找丧彪吗&#xff0c;他昨天…

asp.net core安全事项(上)

隐藏web服务端信息创建一个asp.net core mcv web项目&#xff0c;运行&#xff0c;F12查看返回信息&#xff0c;如下图&#xff0c;会清晰看到服务端的类型是kestrel.有时安全检测要求不能显示服务端信息&#xff0c;这样在一定程度上能降低被 攻击的风险&#xff0c;具体代码如…

云水画中人,独立一江秋

转载于:https://blog.51cto.com/wuliguo/50014

python是c语言_python与c语言

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; python语言调用c语言进行扩展&#xff0c;或者增加程序的运行速度都是特别方便的。 同时还能获得与c或者c几…

aes算法实现c语言_以C语言实现归并排序为例,谈谈五大常用算法之一的“分治法”...

分治算法&#xff0c;顾名思义就是“分而治之”&#xff0c;即把规模较大的复杂问题拆分为若干规模较小的类似子问题&#xff0c;并逐个解决&#xff0c;最后再将各个子问题的解决结果合并&#xff0c;得到原始问题的结果的方法。这个技巧是很多高效算法的基础&#xff0c;例如…

一朝读码深似海,不读源码薪难升!读懂.NET5源码,到底多重要?

谈到源码分析&#xff0c;很多人会有这样的疑问&#xff1a;“.NET5的基本功能我已经掌握了&#xff0c;还有读源码的必要吗&#xff1f;”实际上&#xff0c;阅读源码不仅能够帮你更深刻地理解底层设计原理&#xff0c;提升你的系统架构能力和编码功力&#xff0c;还能让你知道…

50万数据生成6位数不重复字符串_R语言系列3:高级数据管理

R语言系列3&#xff1a;高级数据管理此文内容为《R语言实战》的笔记&#xff0c;人民邮电出版社出版。从高中电脑课学VB开始&#xff0c;大一课内开始学习C&#xff0c;到后来大二为了数模学习Matlab&#xff0c;到大三为了搞深度学习自学Python&#xff0c;到研究生之初学习St…

fcn网络训练代码_另辟蹊径,中科院自动化所等首次用图卷积网络解决语义分割难题...

使用 CNN 处理图像问题已经是常规操作&#xff0c;但此类方法会造成局部位置信息的损失。如何解决这个问题呢&#xff1f;来自中科院自动化所和北京中医药大学的研究者另辟蹊径&#xff0c;提出用图卷积网络解决语义分割问题。选自arXiv&#xff0c;作者&#xff1a;Yi Lu等&am…

盘点大厂的那些开源项目 - 小米科技

小米是一家以手机、智能硬件和IoT平台为核心的互联网公司&#xff0c;以智能手机、智能电视、笔记本等丰富的产品与服务。致力于让全球每个人都能享受科技带来的美好生活。“为发烧而生”是小米的产品概念。“让每个人都能享受科技的乐趣”是小米公司的愿景。小米公司应用了互联…

博主应邀参加YOCSEF虚拟化技术论坛

发布日期: 2007-11-18 中国计算机学会青年计算机科技论坛<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />CCF Young Computer Scientists & Engineers ForumYOCSEF于<?xml:namespace prefix st1 ns "urn:schema…

自定义依赖注解无效_最详细的自定义Spring Boot Starter开发教程

1.前言随着Spring的日渐臃肿&#xff0c;为了简化配置、开箱即用、快速集成&#xff0c;Spring Boot 横空出世。目前已经成为 Java 目前最火热的框架了。平常我们用Spring Boot开发web应用。Spring mvc 默认使用tomcat servlet容器&#xff0c; 因为Spring mvc组件集成了spring…

thinkpadt450s换键盘视频_ikbc c87 入门级有线机械键盘测评

大家好&#xff0c;我是胖虎。今天&#xff0c;写一写我当初买的第一把机械键盘「ikbc c87 茶轴」&#xff0c;非常好的入门级樱桃轴键盘&#xff0c;手感和键帽都很不错。ikbc c87 茶轴机械键盘小白&#xff0c;第一款入门级机械键盘买什么&#xff1f;这款ikbc c87和高斯 87C…

dotnet cli 5.0 新特性——dotnet tool search

dotnet cli 5.0 新特性——dotnet tool searchIntro.NET 5.0 SDK 的发布&#xff0c;给 dotnet cli 引入了一个新的特性&#xff0c;dotnet tool search&#xff0c;主要用于搜索 Nuget 上的 dotnet tool&#xff0c;这个命令会搜索 tool 的名称以及一些元数据&#xff0c; tit…

localhost 已拒绝连接_MySQL连接错误:Access denied for #x27;root#x27;@#x27;localhost#x27;

问题描述&#xff1a;笔者在Mac安装MySQL&#xff0c;但是当我连接到localhost本地服务器却被拒绝mysql -u root -p(1045, "Access denied for user rootlocalhost (using password: YES)")根据MySQL的反馈&#xff0c;可以得知&#xff0c;我输入的root密码应该不对…