【C#】ElasticSearch环境搭建与使用
参考网址:https://blog.csdn.net/catshitone/article/details/95939413
文章目录
1.安装(路径中不能有空格)
2. 配置
2.1 配置ES和用户密码:
2.2 配置Kibana
3. C#调用ElasticSearch
3.1 连接ES
3.2 插入\索引数据
3.6 查询数据
4. 使用Kibana查看数据
5. 修正时区问题
6. 中文分词
7. Elasticsearch Nest库 第三方教程
以前在.net里如果要做全文搜索的话,一般都会使用Lucene.net配合盘古分词。使用起来麻烦而且还不容易查看数据,后来就出现了ElastiSearch。ES也是基于Lucene并采用java编写, 相当于对Lucene做了一层封装,我们只需要调用ES相关API即可,配合Kibana数据可视化工具可以很方便的分析和统计数据。
1.安装(路径中不能有空格)
这里以windows环境为例,linux类似。
移步到ES官网,下载ElasticSearch和Kibana
ES: https://www.elastic.co/downloads/elasticsearch
Kibana: https://www.elastic.co/downloads/kibana
这两个压缩包,解压之后即可用(ES自带jdk无需单独安装)。
▼双击elasticsearch.bat启动ES
也可以执行elasticsearch-service.bat install将es安装为服务,随系统启动。
▼双击kibana.bat启动Kibana
都启动完成之后,浏览器输入localhost:9200查看ES,如果有输出内容,则证明ES运行正常。打开localhost:5601如果能看到页面则Kibana正常运行。
2. 配置
因为ES和Kibana绑定的是localhost,无法对外访问,所以需要我们修改下配置文件,将访问暴露给外部。
2.1 配置ES和用户密码:
修改ES根目录config文件夹下的**elasticsearch.yml**。里面有很多被注释掉的配置项,如下所示将对应的注释项放开:
1
cluster.name: my-application
node.name: node-1
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
1
2
3
4
5
主要就是将network.host:127.0.0.1改为0.0.0.0。
配置用户密码:
在yml中最后增加以下几项:
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
1
2
3
4
5
先启动ES,然后找到elasticsearch-setup-passwords.bat这个文件,执行下述命令elasticsearch-setup-passwords.bat interactive,配置密码。
配置完成之后,再次打开localhost:9200就会要求输入用户名和密码了。
2.2 配置Kibana
配置类似, 打开Kibana根目录下的config文件夹的kibana.yml文件。修改kibana的server.port和server.host如下所示▼:
(▲配置kibana要连接到的ES信息)
到现在,ES和Kibana已经暴露给外网了,直接通过外部IP访问▼:
ES配置用户名密码:参考Elasticsearch 配置用户名和密码
3. C#调用ElasticSearch
新建项目,nuget搜索:NEST或Elasticsearch.Net。其中NEST是对Elasticsearch.NET的封装,更易使用,建议使用NEST。
3.1 连接ES
var node = new Uri("localhost:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);
1
2
3
3.2 插入\索引数据
var response = client.Index(houseDTO, idx => idx.Index("house"));
1
ES根据会插入对象houseDTO的Id字段做索引,所以houseDTO里需要有一个Id字段,如果没有的话参考下方引用文档也可以手动指定。其中idx.Index("")需要传入小写字母的索引名称,这里的索引名称可以理解为数据库里的表名。
3.6 查询数据
可以使用FluentAPI查询:
var response = client.Search<Tweet>(s => s
.From(0)
.Size(10)
.Query(q => q
.Term(t => t.User, "kimchy") || q
.Match(mq => mq.Field(f => f.User).Query("nest"))
)
);
var list=response.Documents;
1
2
3
4
5
6
7
8
9
也可以使用对象方式查询:
var request = new SearchRequest
{
From = 0,
Size = 10,
Query = new TermQuery { Field = "user", Value = "kimchy" } ||
new MatchQuery { Field = "description", Query = "nest hello" }
};
var response = client.Search<Tweet>(request);
var list=response.Documents;
1
2
3
4
5
6
7
8
9
10
注:TermQuery会将kimchy作为整个单词进行搜索,MatchQuery会将nest hello按照分词器进行分词,然后再搜索。
4. 使用Kibana查看数据
添加索引模式▼:
▼这里列出了ES里目前已有的index,就是我们刚才添加进去名为house的indexname。
▼然后输入索引名称,点击next step
▼选择houseDTO的createDateTime字段作为过滤字段(用来在Discover里过滤数据)
▼创建完成之后,切换到Discover
右侧的时间选择框,就是创建索引模式时选择的createDateTime字段。
5. 修正时区问题
走到这里ElasticSearch和Kibana的环境都已经搭建起来了,并且也能正常使用。
不过还有个问题,我插入数据到ES时checkInDateTime是2019-12-09 00:00:00,createDateTime是2019-07-15 09:05:02,但是Kibana显示的时候却比实际时间多了8个小时。
这是因为NEST的序列化器默认认为我们的DateTime类型是UTC时区的,序列化时把时区信息丢失了,而我们的Kibana设置的东八区。所以显示的时候直接在原有时间上加了8个小时。
我们知道NEST也是用Newtonsoft.Json进行序列化的,所以可以从这里入手解决这个问题:
var node = new Uri(ConstString.EsUrl);
var pool = new SingleNodeConnectionPool(node);
var settings = new ConnectionSettings(pool, sourceSerializer: (builtin, setting) => new JsonNetSerializer(builtin, setting, () => new Newtonsoft.Json.JsonSerializerSettings { DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local }));
var client = new ElasticClient(settings);
1
2
3
4
创建client时传入设置参数。
6. 中文分词
ES内置几款分析器,具体参见Analyzers。但这几款对于中文分词不好,这里建议使用IK分词,Github。
下载作者编译好的插件https://github.com/medcl/elasticsearch-analysis-ik/releases,然后在ES根目录的plugins目录下新建ik文件夹然后将下载好的解压进去即可。
重启ES,见到如下字段后,表明加载成功:
由于在之前的操作中我们已经创建好了索引对应的mapping,可在这里查看▼
而ES的mapping一旦创建好之后就不能再次修改,所以要把house这个索引删除之后再次创建,点击“Manage”删除索引。
重新创建索引和mapping
var node = new Uri(ConstString.EsUrl);
var pool = new SingleNodeConnectionPool(node);
var settings = new ConnectionSettings(pool, sourceSerializer: (builtin, setting) => new JsonNetSerializer(builtin, setting, () => new Newtonsoft.Json.JsonSerializerSettings { DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local }));
Client = new ElasticClient(settings);
//给address字段添加IK分词
Client.Indices.Create(IndexName.HOUSE.ToString().ToLower(), c => c.Map<HouseDTO>(h => h.AutoMap().Properties(ps => ps.Text(s => s.Name(n => n.Address).Analyzer("ik_max_word").SearchAnalyzer("ik_smart")))));
1
2
3
4
5
6
7
重新创建成功之后,可以看到addrss字段已经配置好了IK分析器▼:
查询结果
Kibana切换到调试工具,查询address配置“荷花”的记录:
这里看到有两个记录命中。
7. Elasticsearch Nest库 第三方教程
Elasticsearch.Nest 教程系列 1:Nest 快速入门
Elasticsearch.Nest 教程系列 2-1 连接:Configuration options | 配置选项
Elasticsearch.Nest 教程系列 2-2 连接:Connection pools | 连接池使用
Elasticsearch.Nest 教程系列 2-3 连接:Modifying the default connection | 修改默认连接
Elasticsearch.Nest 教程系列 2-4 连接:Working with certificates | 使用凭证连接
Elasticsearch.Nest 教程系列 3-1 序列化:Custom Serialization | 自定义序列化
Elasticsearch.Nest 教程系列 3-2 序列化:Extending NEST types | 扩展 NEST 类型
Elasticsearch.Nest 教程系列 4 映射
Elasticsearch.Nest 教程系列 5-1 索引:Indexing | 索引(添加)文档
Elasticsearch.Nest 教程系列 5-2 索引:Ingest Node | 使用 Ingest 节点
Elasticsearch.Nest 教程系列 5-3 索引:Ingest Pipeline | Ingest 管道
Elasticsearch.Nest 教程系列 6-1 分析:Writing analyzers | 编写分析器
Elasticsearch.Nest 教程系列 6-2 分析:Testing analyzers | 测试分词器
Elasticsearch.Nest 教程系列 7-2 搜索:Writing bool queries | 编写布尔查询
Elasticsearch.Nest 教程系列 7-3 搜索:Selecting fields to return | 选择需要返回的字段
Elasticsearch.Nest 教程系列 8 聚合:Writing Aggregations | 使用聚合
Elasticsearch.Nest 教程系列 9-1 转换:Index name inference | 索引名推断的3种方式
Elasticsearch.Nest 教程系列 9-2 转换:Relation names inference | 关系名推断
Elasticsearch.Nest 教程系列 9-3 转换:Ids inference | Id 文档标识推断
Elasticsearch.Nest 教程系列 9-4 转换:Field inference | 字段推断
Elasticsearch.Nest 教程系列 9-5 转换:Property name inference | 属性名推断
Elasticsearch.Nest 教程系列 9-6 转换:Document paths | 文档路径
Elasticsearch.Nest 教程系列 9-7 转换:Indices Paths | 索引路径
Elasticsearch.Nest 教程系列 9-8 转换:Routing Inference | 路由推断
Elasticsearch.Nest 教程系列 10-1 常用类型:Time Units | 时间单位
Elasticsearch.Nest 教程系列 10-2 常用类型:Distance Units | 距离单位
Elasticsearch.Nest 教程系列 10-3 常用类型:Date math expressions | 日期数字表达式
Elasticsearch.Nest 教程系列 10-4 常用类型:Union Type | 类型合并
1.Elasticsearch.Net and NEST: the .NET clients
2. https://github.com/elastic/elasticsearch-net
3. https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/custom-serialization.html
————————————————
版权声明:本文为CSDN博主「JimCarter」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/catshitone/article/details/95939413
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2020-11-17 浅谈Vue中计算属性computed的实现原理
2020-11-17 C#内存管理和垃圾回收机制