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,一经查实,立即删除!

相关文章

python笔试题 github_简单的python面试题,居然

晚上翻手机&#xff0c;看见一道网友发的python面试题求助帖&#xff0c;当时简单扫一眼就跳过了&#xff0c;但下来仔细想想觉得还蛮有趣&#xff0c;开电脑梳理下思路&#xff0c;因为没有官方答案&#xff0c;所以大家可以一起来做做&#xff0c;其中涉及的python知识点还是…

思科3550 IOS

两种方法升级思科3550 IOS 有两种方法做3550 IOS升级&#xff1a; int vlan 1 ip address 192.168.1.1 255.255.255.0 no shut int f0/1 no shut 默认的接口都VLAN 1下的 一使用.bin文件形式的IOS 1.copy tftp flash: 2.boot system flash:.bin 3.show boot 确定下次启动是用新…

沙洋有几个微服务群_集群 分布式 微服务

转自&#xff1a;https://blog.csdn.net/qq_37788067/article/details/79250623概念:集群是个物理形态&#xff0c;分布式是个工作方式。1.分布式&#xff1a;一个业务分拆多个子业务&#xff0c;部署在不同的服务器上2.集群&#xff1a;同一个业务&#xff0c;部署在多个服务器…

聊聊如何构建一支自驱团队(一)

每一个管理者都致力于构建一支自我驱动的团队&#xff0c;更有甚至&#xff0c;许多人公开宣称&#xff0c;在一支20人以下的团队其实是不用管理手段的&#xff0c;靠团队自驱就能实现团队的快速运作&#xff0c;但知易行难&#xff0c;如果不能根据组织特色灵活的运用管理手段…

java之for循环

/*for循环里i计数器需要用int声明* 本程序是计算*135。。。99。* i2处可以写成i,i 或者ii2如果间隔50 *显然不是一种好的方法*copyright paryjie qq:613972*/public class TextFor {public static void main(String[] args) {long result 0; //用result来存放结果。for(int i1…

action评测 osmo_前后双屏 大疆OSMO ACTION运动相机评测

2019年5月15日晚&#xff0c;大疆正式发布了旗下全新一代运动摄像机&#xff1a;OSMO ACTION。作为OSMO家族的新成员&#xff0c;这款产品的诞生其实一点也不意外&#xff0c;一方面是vlog视频的火爆加速了用户对拍摄设备的使用需求&#xff0c;另外一方面则是运动摄像机这块的…

在.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 如果…

(1)学习数组,集合,IEnumerable接口,引申学习迭代器

发展:数组-->集合-->泛型 (1)数组 1. 数组数据结构是System.Array类的一个实例. 2. System.Array类的语法为 [SerializableAttribute] [ComVisibleAttribute(true)] public abstract class Array : ICloneable, IList, ICollection, IEnumerable 3. 下面看一个使用数组…

华为交换机初始化_华为交换机恢复出厂设置

华为交换机恢复出厂设置(2008-10-06 22:29:54)在设备重启时按CtrlB进入BOOT MENU之后&#xff0c;Press Ctrl-B to enter Boot Menu... 5Password :缺省为空&#xff0c;回车即可1. Download application file to flash2. Select application file to boot3. Display all files…

领域驱动设计-从贫血模型到充血模型

背景领域模型对象只是用来存储应用的数据。业务逻辑位于服务层中&#xff0c;管理域对象的数据。在服务层中&#xff0c;应用的每个实体对应一个服务类。这种模式大家是不是很熟悉&#xff0c;尤其是在中小项目或者项目刚启动的时候&#xff0c;都是怎么方便怎么来&#xff1b;…

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

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

普通故障处理流程

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

普通用户nginx访问不了_Nginx降权启动之使用普通用户管理 | it运维_it技术_linux运维-追梦人博客...

一、介绍1.1、什么是nginx降权启动降权启动&#xff1a;即nginx的启动与管理使用非root用户来启动与管理&#xff0c;这样就防止每次修改配置重启时都需要用root用户来重启了。注意&#xff1a;普通用户只能只用1024以上的端口&#xff0c;不可以直接使用80或者443端口(前面可以…

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

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

编译AjaxControlToolkit发生错误如何解决?

错误的具体内容是&#xff1a;Error 1 Could not load file or assembly vjslib, Version2.0.0.0, Cultureneutral, PublicKeyTokenb03f5f7f11d50a3a or one of its dependencies. TemplateVSI\TemplateVSI.csproj 未能加载文件或程序集“vjslib, Version2.0.0.0, Cultureneut…

内网通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