一、查找ES客户端库
打开ES官网,选择学习-》文档,一般选择NEST客户端工具
新建一个项目,并添加NEST包
public class Person { public int Id { get; set; } [Keyword] public string FirstName { get; set; } public string LastName { get; set; } }
创建索引
var settings = new ConnectionSettings(new Uri("http://127.0.0.1:9200")) .DefaultIndex("people"); var client = new ElasticClient(settings); List<Person> list = new(); for (int i = 0; i < 10; i++) { Person person = new Person(); person.Id = i; person.FirstName = "张三"+i; list.Add(person); } client.IndexMany<Person>(list);
通过命令查看文档结构
GET /people/_mapping?pretty
发现firstName的类型为text, (text类型会进行分词处理)
查询FirstName包含“张三"的前10条数据
var searchResponse = client.Search<Person>(s => s .From(0) .Size(10) .Query(q => q .Match(m => m .Field(f => f.FirstName) .Query("张三") ) ) ); var people = searchResponse.Documents; Console.WriteLine("查询结果"); foreach (var item in people) { Console.WriteLine($"id:{item.Id},firstname:{item.FirstName},lastname:{item.LastName}"); }
注意:ES数据刷盘延迟--默认1s ,所以添加数据后需要等待1秒才能查询出数据
查询结果为
查询FirstName包含张三,并且id大于3的文档
var ss = client.Search<Person>(s => s.Query( m => m.Bool( m => m.Must( x => x.Match(m => m.Field(f => f.FirstName).Query("张三1") ), mm => mm.Range(xx => xx.Field(f => f.Id).GreaterThan(3)) ) ) ) ).Documents;
是不是发现要编写如上的查询条件非常苦难,幸好找到一个工具可以为我们书写如上查询提供一些帮助(虽然不能直接使用,但至少可以借鉴)
直接运行ElasticHD.exe,会显示如下网页
通过直接编写SQL语句,最后转化为ES的查询条件,是不是感觉很方便,但还不够完美,需要自己在程序里进行转换,至少不需要自己完全编写ES查询条件了
,其实ES提供了一个SQL查询工具,直接就可以使用SQL语句来查询数据。在ES运行目录里有一个elasticsearch-sql-cli.bat客户端工具,直接运行后就可以在上面编写SQL语句。
注意:书写完SQL语句后一定要加上";" 否则会一直等待不执行
那么程序怎么通过SQL来查询ES的数据呢?
我们只需要在程序里调用“http://127.0.0.1:9200/_xpack/sql?format=csv”地址,在发起http请求,就可以通过sql来查询ES数据了
public static string Post(QueryParam queryParam, string url = "http://127.0.0.1:9200/_xpack/sql?format=csv") { HttpWebRequest request = null; try { request = (HttpWebRequest)WebRequest.Create(url); var data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(queryParam)); //request.Accept = "application/json; charset=UTF-8"; // 设置响应数据的ContentType request.Method = "POST"; request.ContentType = "application/json"; // 设置请求数据的ContentType request.ContentLength = data.Length; request.Timeout = 90000; // 设置入参 using (var stream = request.GetRequestStream()) { stream.Write(data, 0, data.Length); } // 发送请求 var response = (HttpWebResponse)request.GetResponse(); // 读取出参 using (var resStream = response.GetResponseStream()) { using (var reader = new StreamReader(resStream, Encoding.UTF8)) { return reader.ReadToEnd(); } } } catch (Exception ex) { return null; } finally { // 释放连接 if (request != null) request.Abort(); } } public class QueryParam { public string query { get; set; } }
是不是感觉非常的方便呢?但当我们调用select * from my_index2;查询时,却发现出错了
原因分析:因为my_index2索引中存在一个字段类型为text
这是就需要借助于第三方的开源插件 ,找到对应的ES版本,下载下来安装到ES插件中,具体安装可以查看ik分词器插件的安装(注意插件名称为sql)
调用地址要发生改变,需要使用“http://127.0.0.1:9200/_nlpcn/sql”,而“http://127.0.0.1:9200/_xpack/sql?format=csv”为官方提供给我们使用的地址
同时需要注意,在程序里调用时sql命令后不需要";"符号
最后献上DEMO地址