天天看点

ElasticSearch.Net 7.3.2 的学习在windows上搭建ESC#操作ESC#操作ES总结

在windows上搭建ES

1.下载ES

官网:https://www.elastic.co/downloads/elasticsearch

官网下载很慢,这里提供一个百度网盘下载链接:

https://pan.baidu.com/s/1FH43S2MbH0yu5AKLVmfaiA

提取码:qnwb

版本:ES 7.3.2

2.搭建ES

下载之后解压如下图所示:

ElasticSearch.Net 7.3.2 的学习在windows上搭建ESC#操作ESC#操作ES总结

进入bin目录:

ElasticSearch.Net 7.3.2 的学习在windows上搭建ESC#操作ESC#操作ES总结

双击elasticsearch.bat即可启动ES,但是这个仅仅是本机可以访问。

3.启动远程访问

打开config/elasticsearch.yml文件

1.不要注释network.host: 0.0.0.0

2.不要注释cluster.initial_master_nodes: [“node-1”, “node-2”]

以上注意:network.host: 0.0.0.0和cluster.initial_master_nodes: [“node-1”, “node-2”]前面要有一个空格,否则会启动不成功

ElasticSearch.Net 7.3.2 的学习在windows上搭建ESC#操作ESC#操作ES总结

注册ES服务

在bin目录下,打开cmd控制台

输入以下命令,即可安装ES服务

elasticsearch-service.bat install
           

启动ES服务:

elasticsearch-service.bat start
           

elasticsearch-service.bat后面还可以执行这些命令 :

  1. install: 安装Elasticsearch服务
  2. remove: 删除已安装的Elasticsearch服务(如果启动则停止服务)
  3. start: 启动Elasticsearch服务(如果已安装)
  4. stop: 停止服务(如果启动)
  5. manager:启动GUI来管理已安装的服务

C#操作ES

1.新建一个项目,Nuget引用NEST:

ElasticSearch.Net 7.3.2 的学习在windows上搭建ESC#操作ESC#操作ES总结

2.向ElasticSearch中加入数据,加入数据时需要指定索引,我这里的索引是mymodel:

通讯模型类:

public class Model
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public int ID { get; set; }
        public string UUID { get; set; }

        public DateTime CreatedTime { get; set; }

    }
           

初始化ElasticSearch客户端:

var node = new Uri("http://10.36.10.13:9200/");
var settings = new ConnectionSettings(node);
settings.DefaultIndex("mymodel");
var client = new ElasticClient(settings);
           

注意:settings.DefaultIndex(“mymodel”);这里是指定默认的索引,下面的操作便不再需要指定索引

向elasticsearch中添加数据:

var randon = new Random();
var list = new List<Model>();
for (int i = 0; i < 1000; i++)
{
    var model = new Model()
    {
        Name = "test" + i,
        Age = randon.Next(0, 100),
        ID = i,
        UUID = Guid.NewGuid().ToString(),
        CreatedTime = DateTime.Now.AddSeconds(i),
    };
    list.Add(model);
}
var result = client.IndexMany(list);
           

如果是插入一条数据,用Index方法

特别注意:ES索引的名称必须是小写,大写是插入不了数据的

查询

查询所有数据:

这样不指定条件,不指定大小,查询默认10条数据

指定大小与开始的索引:

以上是从0开始,查询10000条数据

按条件查找

字符串包含查找:

查找UUID包含“9479edc0“的数据

注意:Term查询时,后面的给定关键字必须是小写,不然查询不到值

数字范围查找:

查询年龄在80到90的结果

注意,最后必须要指定Field!!!

日期范围查找:

查询大于当前时间,小于当前时间之后的3s的数据

查找ID在某个数组中:

var list = new List<int>() { 1000, 1001, 1002, 1003 };
var result = client.Search<Model>(x=>x.From(0).Size(10000).Query(t=>t.Terms(m=>m.Field(model=>model.ID).Terms(list))));
           

Bool查询

//bool查询  ID大于1000且小于3000 且年龄大于20小于40或年龄大于60小于80  且UUID含有a931b4db的数据

var result = client.Search<Model>(x => x.From(0).Size(10000).Query(a => a.Bool
(
    b => b.Must(c => c.Range(d => d.Field(model => model.ID).GreaterThan(1000).LessThan(3000)))// AND
        .Should(//OR
                c => c.Range(d => d.Field(model => model.Age).GreaterThan(20).LessThan(40)),
                c => c.Range(d => d.Field(model => model.Age).GreaterThan(60).LessThan(80))
                )
        .Must(c => c.Term(d => d.UUID, "a931b4db"))
)));
           

C#操作ES总结

一、获取NEST执行时的请求响应报文

1.初始化Setting的时候,加上settings.DisableDirectStreaming(true);

var node = new Uri("http://10.36.10.13:9200/");
var settings = new ConnectionSettings(node);
settings.DefaultIndex("mymodel");
settings.DisableDirectStreaming(true);//设置将请求响应信息写入到RequestBodyInBytes和ResponseBodyInBytes
var client = new ElasticClient(settings);
           

这样,请求响应的报文就会在ApiCall的RequestBodyInBytes和ResponseBodyInBytes

2.打印请求响应报文,在setting的OnRequestCompleted方法中处理

settings.OnRequestCompleted(x =>
{
    if (x.RequestBodyInBytes != null)
        {
            Console.WriteLine(Encoding.UTF8.GetString(x.RequestBodyInBytes));
        }

        if (x.ResponseBodyInBytes != null)
        {
            Console.WriteLine(Encoding.UTF8.GetString(x.RequestBodyInBytes));
        }
});
           

二、注意事项

1.建立索引,索引名称必须是小写

2.Term查询时,关键字也必须是小写

三、查询中文短语

在字段没有特殊标注的默认情况下,string类型的字段会被分词,用Term去查中文短语、英文短语,是查询不到结果的。这种情况下有两种方法处理

1.使用match查询,设置minimum_should_match为100%

这里设置100%,意思是字段device_name中必须包含

陈岗变

三个字,100%包含。但是

陈岗变

三个字可以是不连续的,查询出来的结果如下所示:

ElasticSearch.Net 7.3.2 的学习在windows上搭建ESC#操作ESC#操作ES总结

2.建立索引时,设置字段为keyword

var result = client.Indices.Create(nameof(EV_COMBINED).ToLower(), c =>
	            c.Map<EV_COMBINED>(m =>m.AutoMap().Properties(n => n.Keyword(x => x.Name(model => model.AssetName).Index(true)))
	            .Properties(n => n.Keyword(x => x.Name(model => model.Description).Index(true))))
);
           

在创建索引时,设置映射,设置AssetName和Description两个字段为keyword。

然后再往改索引里插入数据。

这样,在查询的时候,我们就可以查询中文短语了,但是这样好像不能中英文混查,没有深入继续研究,而且设置了不分词之后,不能全文检索

3.设置查询结果大于10000条不报错:

PUT alarm/_settings
{ 
  "max_result_window" : 200000000
} 
           

其中alarm是ES的索引名称

参考:

https://www.cnblogs.com/huhangfei/p/7524886.html

https://www.cnblogs.com/huhangfei/p/5726650.html