【C#】ElasticSearch环境搭建与使用

12 篇文章 0 订阅
9 篇文章 0 订阅

以前在.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
在这里插入图片描述

▼双击kibana.bat启动Kibana

在这里插入图片描述

都启动完成之后,浏览器输入localhost:9200查看ES,

如果有输出内容,则证明ES运行正常。打开localhost:5601如果能看到页面则Kibana正常运行。

在这里插入图片描述

在这里插入图片描述


2. 配置

因为ES和Kibana绑定的是localhost,无法对外访问,所以需要我们修改下配置文件,将访问暴露给外部。

  • 配置ES和用户密码:
    修改ES根目录config文件夹下的elasticsearch.yml。里面有很多被注释掉的配置项,如下所示将对应的注释项放开:

 cluster.name: my-application
 node.name: node-1
 network.host: 0.0.0.0
 http.port: 9200
 cluster.initial_master_nodes: ["node-1"]
 

主要就是将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

先启动ES,然后找到elasticsearch-setup-passwords.bat这个文件,

执行下述命令elasticsearch-setup-passwords.bat interactive,配置密码。

在这里插入图片描述

配置完成之后,再次打开localhost:9200就会要求输入用户名和密码了。

  • 配置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。

  1. 连接ES

var node = new Uri("localhost:9200");
var settings = new ConnectionSettings(node);
var client = new ElasticClient(settings);
 

2.插入\索引数据

var response = client.Index(houseDTO, idx => idx.Index("house"));

3.查询
可以使用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;

也可以使用对象方式查询:

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;

注: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);

创建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")))));

重新创建成功之后,可以看到addrss字段已经配置好了IK分析器▼:

在这里插入图片描述

 

查询结果
Kibana切换到调试工具,查询address配置“荷花”的记录:

在这里插入图片描述

这里看到有两个记录命中。

参考: 1.Elasticsearch.Net and NEST: the .NET clients https://github.com/elastic/elasticsearch-net https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/custom-serialization.html
 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值