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

 

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

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

一,編程流程

1,創(chuàng)建客戶端

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

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

2,創(chuàng)建查詢請求

連接到引擎之后,創(chuàng)建搜索請求(SearchRequest),用于封裝查詢類型和查詢條件

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

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

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

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

4,調(diào)整查詢結(jié)果

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

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

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

//windowssr.From = 0;
sr.Size = 100;//sortISort sort = new SortField { Field = "eventid", Order = SortOrder.Ascending };
sr.Sort = new List<ISort>();
sr.Sort.Add(sort);//source filtersr.Source = new SourceFilter()
{
   Includes = new string[] { "eventid", "eventname" },
   Excludes = new string[] { "roginalid", "description" }
};

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

5,執(zhí)行查詢請求

最后,客戶端執(zhí)行搜索請求,獲取搜索結(jié)果,并將查詢結(jié)果中的文檔集轉(zhuǎn)換成列表

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

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

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

1,詞條查詢

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

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>();
}

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

2,匹配查詢

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

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>();
}

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

3,正則表達式查詢

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

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>();
}

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

4,布爾查詢

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

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>();   
}

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

三,把Query DSL封裝成HTTP Request

向ElasticSearch引擎發(fā)送Http請求,在http請求中指定查詢的類型和查詢條件,引擎在收到請求后執(zhí)行搜索,查詢結(jié)果以HTTP 響應(yīng)(Response)返回,開發(fā)者需要從Response返回的JSON結(jié)構(gòu)字符串中解析搜索結(jié)果。

1,封裝類庫

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

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓 View Code

2,執(zhí)行查詢

查詢的結(jié)果是JSON結(jié)構(gòu)的字符串,通常使用JObject和JToken類處理。

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

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

移動開發(fā)培訓,Android培訓,安卓培訓,手機開發(fā)培訓,手機維修培訓,手機軟件培訓

解析JSON的常用類庫是:

http://www.cnblogs.com/ljhdo/p/4550135.html