一、查找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地址