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

 

在ElasticSearch引擎中進(jìn)行全文搜索是一件非??犰诺氖?,而創(chuàng)建索引是最重要的事,必須要精心設(shè)計(jì),建議使用head插件創(chuàng)建索引的映射(Mapping),而對(duì)索引文檔數(shù)據(jù)的日常更新,可以使用C#客戶端程序,按照計(jì)劃自動(dòng)進(jìn)行數(shù)據(jù)的同步和更新。

對(duì)于一個(gè)數(shù)據(jù)庫(kù)開(kāi)發(fā),很久沒(méi)有寫過(guò)C#代碼,dot net菜鳥一個(gè),本文簡(jiǎn)單分享了使用ElasticSearch的.net客戶端驅(qū)動(dòng)程序向索引中添加文檔的代碼片段,詳細(xì)信息,請(qǐng)參考官方手冊(cè):Elasticsearch.Net and NEST: the .NET clients [5.x] ? Introduction

一,ElasticSearch的.net客戶端驅(qū)動(dòng)程序

ElasticSearch官方網(wǎng)站提供了兩個(gè).net客戶端驅(qū)動(dòng)程序,其中Elasticsearch.Net是一個(gè)非常底層且靈活的客戶端驅(qū)動(dòng)程序,用戶需要手動(dòng)創(chuàng)建請(qǐng)求(Request)和響應(yīng)(Response);而NEST是一個(gè)高層的客戶端,其內(nèi)部使用的依然是Elasticsearch.Net驅(qū)動(dòng)程序,NEST擁有查詢DSL(領(lǐng)域特定語(yǔ)言),能夠映射所有請(qǐng)求和響應(yīng)對(duì)象,使用起來(lái)比較方便。不同版本的NEST驅(qū)動(dòng)程序,其提供的接口變化很大,在熟悉Nest之后,可以使用Elasticsearch.Net驅(qū)動(dòng)程序來(lái)編寫自己的代碼,免受更新之苦。

首先,下載ElastiSearch的.net客戶端驅(qū)動(dòng)程序,打開(kāi)VS的工具(Tools)菜單,通過(guò)NuGet包管理器控制臺(tái),輸入命令安裝NEST:

PM> Install-Package NEST

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

安裝之后,系統(tǒng)引用三個(gè)DLL文件,樓主安裝的驅(qū)動(dòng)程序版本分別是:

  • Elasticsearch.Net.dll (版本 5.0.0.0)

  • Nest.dll (版本 5.0.0.0)

  • Newtonsoft.Json.dll (版本 9.0.0.0)

二,NEST驅(qū)動(dòng)程序的簡(jiǎn)單使用

1,連接到ElasticSearch引擎服務(wù)器

注意,默認(rèn)索引的名稱必須小寫,建議將索引名,文檔類型名稱,和字段名稱都小寫。

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

using Nest;    
public static class Setting
{    public static string strConnectionString=@"http://localhost:9200";    public static Uri Node
    {        get
        {            return new Uri(strConnectionString);
        }
    }    public static ConnectionSettings ConnectionSettings
    {        get
        {            return new ConnectionSettings(Node).DefaultIndex("default");
        }
    }
}

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

2,創(chuàng)建數(shù)據(jù)模型

注意,模型的字段名和創(chuàng)建的索引映射中的字段保持一致,推薦都使用小寫字母。Nest驅(qū)動(dòng)程序提供了模型屬性,讀者可以自行嘗試。

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

public class MeetupEvents
{    public long eventid { get; set; }    public string orignalid { get; set; }    public string eventname { get; set; }    public string description { get; set; }
}

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

3,更新文檔

NEST提供兩種更新文檔的方式,逐條更新和批量更新,函數(shù)PopulateIndex用于逐條更新索引,函數(shù)BulkPopulateIndex用于批量更新索引;

注意,在更新索引時(shí),高亮顯示的代碼指定了索引的元字段_id為meetupevent實(shí)體的主鍵eventid;

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

using Nest;public class ESProvider
{    public static ElasticClient client = new ElasticClient(Setting.ConnectionSettings);    public static string strIndexName = @"meetup".ToLower();    public static string strDocType = "events".ToLower();    public bool PopulateIndex(MeetupEvents meetupevent)
    {        var index = client.Index(meetupevent,i=>i.Index(strIndexName).Type(strDocType).Id(meetupevent.eventid));        return index.Created;
    }    public bool BulkPopulateIndex(List<MeetupEvents> posts)
    {        var bulkRequest = new BulkRequest(strIndexName,strDocType) { Operations = new List<IBulkOperation>() };   
        var idxops = posts.Select(o => new BulkIndexOperation<MeetupEvents>(o) { Id=o.eventid}).Cast<IBulkOperation>().ToList();
        bulkRequest.Operations = idxops;        var response = client.Bulk(bulkRequest);        return response.IsValid;
    }
}

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

4,執(zhí)行批量更新操作

如果更新的數(shù)據(jù)量十分龐大,建議,首先對(duì)數(shù)據(jù)源分頁(yè),分batch更新ElasticSearch的索引。ElasticSearch在批量索引文檔時(shí),如果一批文檔數(shù)量過(guò)大,會(huì)導(dǎo)致數(shù)據(jù)丟失,建議每次索引1000個(gè)文檔。

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

ESProvider es = new ESProvider();
List<MeetupEvents> pbs = new List<MeetupEvents>();foreach (DataRow dr in MeetupEventsTable.Rows)
{
    MeetupEvents pb = new MeetupEvents();
    pb.eventid = long.Parse(dr["EventID"].ToString());
    pb.orignalid = dr["OriginalID"].ToString();
    pb.eventname = dr["EventName"].ToString();
    pb.description = dr["Description"].ToString();

    pbs.Add(pb);
}          
es.BulkPopulateIndex(pbs);

iOS培訓(xùn),Swift培訓(xùn),蘋果開(kāi)發(fā)培訓(xùn),移動(dòng)開(kāi)發(fā)培訓(xùn)

5,總結(jié)NEST驅(qū)動(dòng)程序的使用

使用以下三段代碼連接NEST客戶端:

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

使用客戶端的Index方法更新/添加單個(gè)文檔:

Client.Index(student);

使用客戶端的IndexMany函數(shù)更新/添加多個(gè)文檔:

var list = new List<Student>();
client.IndexMany<Student>(list);

使用客戶端的Bulk方法批量更新文檔,需要根據(jù)實(shí)體列表List構(gòu)造一個(gè)BulkRequest參數(shù):

client.Bulk(bulkRequest);

 

 

參考文檔:

NEST使用指南

elasticsearch.net search入門使用指南中文版

.net ElasticSearch

--業(yè)精于勤而荒于嬉,行成于思而毀于隨--
--歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處--

分類: ElasticSearch

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