ElasticSearch入門 第五篇:使用C#查詢文檔

来源:http://www.cnblogs.com/ljhdo/archive/2017/04/07/4550135.html
-Advertisement-
Play Games

使用C#代碼實現對ElastiSearch的編程查詢,是十分方便的,通常情況下,開發者採用官方提供的NEST客戶端程式,通過封裝的方法向ElasticSearch引擎發送查詢請求,搜索數據,最終獲取返回的查詢結果,實現預定的業務需求。在內部,NEST客戶端通過格式化的數據結構,把C#代碼轉換成HTT... ...


這是ElasticSearch 2.4 版本系列的第五篇:

 

使用C#代碼實現對ElastiSearch的編程查詢,是十分方便的,通常情況下,開發者採用官方提供的NEST客戶端程式,通過封裝的方法向ElasticSearch引擎發送查詢請求,搜索數據,最終獲取返回的查詢結果,實現預定的業務需求。在內部,NEST客戶端通過格式化的數據結構,把C#代碼轉換成HTTP 請求(Request),減輕了用戶直接編寫Qeury DSL的麻煩。當然,用戶也可以直接把Query DSL封裝成HTTP請求,發送到ElasticSearch引擎;對開發者來說,不僅需要熟悉Query DSL的語法,而且需要手動編寫代碼,處理引擎返回的JSON結構化的數據集,採用這種方式的優點是不受限於NEST客戶端程式,能夠最大化使用ElasticSearch查詢的各種參數,書寫自由。

本文簡單介紹使用C#代碼對ElasticSearch進行編程查詢的流程,具體的細節,請參考官方文檔。

一,編程流程

1,創建客戶端

在搜索文檔之前,首先要連接到ElasticSearch引擎,創建客戶端對象

using Nest;
var node = new Uri("http://myserver:9200");
var settings = new ConnectionSettings(node).DefaultIndex("default");
var client = new ElasticClient(settings);

2,創建查詢請求

連接到引擎之後,創建搜索請求(SearchRequest),用於封裝查詢類型和查詢條件

SearchRequest sr = new SearchRequest("meetup", "events");

3,指定查詢類型和查詢條件

為搜索請求指定查詢類型,可以是詞條搜索,或全文搜索

TermQuery tq = new TermQuery();
tq.Field = "eventname";
tq.Value = "azure";
sr.Query = tq;

4,調整查詢結果

為搜索請求設置參數,排序,分頁,和選擇返回的欄位等,在選擇查詢結果返回的欄位時,推薦在查詢請求(SearchRequest)中使用Source Filter。

在查詢請求中,通過類RequestSearch的數組欄位StoredFileds,把已存儲欄位添加到該數組中,ElasticSearch引擎只返回特定的欄位,而不是文檔的所有欄位。在索引映射中,已存儲欄位的store屬性為true,StoredFileds數組只能選擇已存儲欄位(stored field)。

//windows
sr.From = 0;
sr.Size = 100;

//sort
ISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };
sr.Sort = new List<ISort>();
sr.Sort.Add(sort);

//source filter
sr.Source = new SourceFilter()
{
   Includes = new string[] { "eventid", "eventname" },
   Excludes = new string[] { "roginalid", "description" }
};

5,執行查詢請求

最後,客戶端執行搜索請求,獲取搜索結果,並將查詢結果中的文檔集轉換成列表

var result = client.Search<MeetupEvents>(sr);
return result.Documents.ToList<MeetupEvents>();

二,示例代碼,使用Nest客戶端搜索文檔

在該示例代碼中,本文簡單列舉詞條查詢,匹配查詢,布爾查詢和正則表達式查詢的示例代碼。

1,詞條查詢

public List<MeetupEvents>GetResult_TermQuery( )
{
    //create term query
    TermQuery tq = new TermQuery();
    tq.Field = "eventname";
    tq.Value = "azure";

    //create search request
    SearchRequest sr = new SearchRequest("meetup", "events");
    sr.Query = tq;

    //windows
    sr.From = 0;
    sr.Size = 100;

    //sort
    ISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };
    sr.Sort = new List<ISort>();
    sr.Sort.Add(sort);

    //source filter
    sr.Source = new SourceFilter()
    {
        Includes = new string[] { "eventid", "eventname" },
        Excludes = new string[] { "roginalid", "description" }
    };

    var result = client.Search<MeetupEvents>(sr);
    return result.Documents.ToList<MeetupEvents>();
}

2,匹配查詢

public List<MeetupEvents> GetResult_MatchQuery()
{
    SearchRequest sr = new SearchRequest("meetup", "events");
    MatchQuery mq = new MatchQuery();
    mq.Field = new Field("eventname");
    mq.Query = "azure cloud";
    mq.MinimumShouldMatch = 2;
    mq.Operator = Operator.Or;

    sr.Query = mq;
    sr.From = 0;
    sr.Size = 100;
    sr.Sort = new List<ISort>();
    sr.Sort.Add(new SortField { Field = "eventid", Order = SortOrder.Ascending });

    ISearchResponse<MeetupEvents> result = client.Search<MeetupEvents>(sr);
            
    return result.Documents.ToList<MeetupEvents>();
}

3,正則表達式查詢

public List<MeetupEvents>GetResult_RegexpQuery()
{
    SearchRequest sr = new SearchRequest();

    RegexpQuery rq = new RegexpQuery();
    rq.Field = "description";
    rq.Value = "azu.*";
    rq.MaximumDeterminizedStates = 20000;

    sr.Query = rq;

    var result = client.Search<MeetupEvents>(sr);
    return result.Documents.ToList<MeetupEvents>();
}

4,布爾查詢

public List<MeetupEvents>GetResult_BoolQuery()
{
    SearchRequest sr = new SearchRequest("meetup", "events");

    BoolQuery bq = new BoolQuery();
    bq.Filter = new QueryContainer[]
    {
        new MatchQuery()
        {
            Field="eventname",
            Query="azure cloud",
            Operator=Operator.Or,
            MinimumShouldMatch=1
        },
        new MatchQuery()
        {
            Field ="eventname",
            Query="aws google",
            Operator=Operator.Or,
            MinimumShouldMatch=1
         }
    };
    bq.Should = new QueryContainer[]
    {
        new TermQuery()
        {
            Field="description",
            Value="azure"
        },
        new TermQuery()
        {
            Field="description",
            Value="cloud"
        }

    };
    bq.MinimumShouldMatch = 1;

    sr.Query = bq;

    var result = client.Search<MeetupEvents>(sr);
    return result.Documents.ToList<MeetupEvents>();   
}

三,把Query DSL封裝成HTTP Request

向ElasticSearch引擎發送Http請求,在http請求中指定查詢的類型和查詢條件,引擎在收到請求後執行搜索,查詢結果以HTTP 響應(Response)返回,開發者需要從Response返回的JSON結構字元串中解析搜索結果。

1,封裝類庫

以下HTTP網路編程代碼,是我們項目組一姐Amy的作品,謝謝Amy的分享,代碼可以進一步封裝,在此文中,僅僅作為演示:

namespace ElasticSearchNet
{
    class ESRequest
    {
        string es_host;
        string es_port;
        string es_index;
        string es_type;
        private string url;

        public ESRequest(string host,string index,string type,string port="9200")
        {
            es_host = host;
            es_port = port;
            es_index = index;
            es_type = type;

            string requst_cache = "request_cache=true";
            url = string.Format("http://{0}:{1}/{2}/{3}/_search?{4}", es_host, es_port, es_index, es_type,requst_cache);
        }

        public string ExecuteQeury(string json_query)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.ContentType = "aplication/json";
            request.Method = "POST";
            request.Timeout = 1000 * 60;
            using (var sw = new StreamWriter(request.GetRequestStream()))
            {
                sw.Write(json_query);
                sw.Flush();
                sw.Close();
            }

            var response = (HttpWebResponse)request.GetResponse();
            using (var sr = new StreamReader(response.GetResponseStream()))
            {
                return sr.ReadToEnd();
            }
        }
    }
}
View Code

2,執行查詢

查詢的結果是JSON結構的字元串,通常使用JObject和JToken類處理。

ESRequest es = new ElasticSearchNet.ESRequest("cia-sh-svr-sis3", "meetup", "events");
string json_query = @"
{ ""query"":{
        ""match"":{
            ""eventname"":""azure""
        }
    }
}
";
string strJsonResult=es.ExecuteQeury(json_query);

解析JSON的常用類庫是:

 

參考文檔:

Elasticsearch.Net and NEST: the .NET clients [5.x] » Search

Elasticsearch.Net and NEST: the .NET clients [5.x] » Query DSL


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近的項目要用到一個線上報告的下載,於是完成後自己在理一下思路,大體的實現了我要得需求。 話不多說,直接上代碼 首先,取到網路文件的鏈接,進行判段是否需求再次下載還是直接打開 #pragma mark 下載報告 //// 第一步 //是否下載還是打開文件 - (void)downloadPDF:(N ...
  • Windows下MongoDB的下載、安裝以及對應的windows服務的創建 ...
  • 本文出處:http://www.cnblogs.com/wy123/p/6677073.html 在做數據統計類資料庫設計的時候,在考慮數據存儲的時候,經常會遇到邏輯上同一個BusinessID對應多個數據點的情況,比如工資表中的員工ID以及各項工資信息,財務表中的各個報表Id和多個數據點之間的信息 ...
  • Util包下的連接資料庫的工具包 src下的jdbc.properties ...
  • 資料庫的主鍵與外鍵 一、什麼是主鍵、外鍵: 關係型資料庫中的一條記錄中有若幹個屬性,若其中某一個屬性組(註意是組)能唯一標識一條記錄,該屬性組就可以成為一個主鍵 比如 學生表(學號,姓名,性別,班級) 其中每個學生的學號是唯一的,學號就是一個主鍵 課程表(課程編號,課程名,學分) 其中課程編號是唯一 ...
  • 上篇文章介紹了關於MySQL如何配置主從複製,本篇主要說一下主主複製: 先對文章將要出現的關鍵詞做一下說明: server1、server2、server...表示資料庫伺服器 (寫的比較懶,用心體會) mysql主主複製配置server1 ip:192.168.0.231server2 ip:19 ...
  • 簡介 在DBMS中,事務保證了一個操作序列可以全部都執行或者全部都不執行(原子性),從一個狀態轉變到另外一個狀態(一致性)。由於事務滿足久性。所以一旦事務被提交之後,數據就能夠被持久化下來,又因為事務是滿足隔離性的,所以,當多個事務同時處理同一個數據的時候,多個事務直接是互不影響的,所以,在多個事務 ...
  • 本文主要描述 MySQL Group Replication的簡易原理、搭建過程以及故障維護管理內容。由於是新技術,未在生產環境使用過,本文均是虛擬機測試,可能存在考慮不周跟思路有誤情況,歡迎交流指正。 如果轉載,請註明博文來源: www.cnblogs.com/xinysu/ ,版權歸 博客園 蘇 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...