.NET 操作ES


一、查找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);
View Code

通過命令查看文檔結構

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}");
            }
View Code

注意: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;
View Code

是不是發現要編寫如上的查詢條件非常苦難,幸好找到一個工具可以為我們書寫如上查詢提供一些幫助(雖然不能直接使用,但至少可以借鑒)

直接運行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; }
    }
View Code

是不是感覺非常的方便呢?但當我們調用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地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM