Upgrade to Pro — share decks privately, control downloads, hide ads and more …

An Introduction to the Elasticsearch .NET clients

An Introduction to the Elasticsearch .NET clients

Presented by Greg Marzoula at Code Camp New York City 2014

Elasticsearch.NET and NEST are both the official low-level and high-level .NET clients of Elasticsearch. With the recent 1.0 release, they combine the power of C# and .NET with the awesomeness of Elasticsearch, a distributed, real-time search and analytics engine. This session will kick off with an Elasticsearch primer covering installation and configuration on Windows, followed by a brief overview of indexing and querying via Elaticsearch's REST API. We will then dive into a detailed overview of the NEST and Elasticsearch.NET libraries, covering the new features introduced in 1.0, complete with coding examples and a sample MVC app demoing the full-text search capabilities of Elasticsearch.

Elasticsearch Inc

September 17, 2014
Tweet

More Decks by Elasticsearch Inc

Other Decks in Technology

Transcript

  1. {          “$tle”  :  “intro  to  nest

     &  elas$csearch.net”,          “level”  :  100,          “speaker”  :  “greg  marzouka”,          “event”  :  “code  camp  nyc  2014”   }  
  2. elas$csearch   •  Distributed  data  store   •  Really  good

     at  search   •  Analy$cs  too   •  RESTful  API   •  Document  oriented  (JSON  over  HTTP)   •  “Schema-­‐less”   •  Mul$-­‐tenancy   •  Built  on  top  of  Apache  Lucene   •  Open-­‐source  (Apache  2  license)    
  3. terminology     node  =  single  server  (elas$csearch/jvm  instance)  

      cluster  =  collec$on  of  one  more  more  node     index  =  collec$on  of  documents  (database)     type  =  logical  category/par$$on  of  your  index  (table)     document  =  basic  unit  of  informa$on  that  can  be  indexed  (row)     shard  =  slice/par$$on  of  an  index     replica  =  copy  of  a  shard  
  4. terminology     node  =  single  server  (elas$csearch/jvm  instance)  

      cluster  =  collec$on  of  one  more  more  node     index  =  collec$on  of  documents  (database)     type  =  logical  category/par$$on  of  your  index  (table)     document  =  basic  unit  of  informa$on  that  can  be  indexed  (row)     shard  =  slice/par$$on  of  an  index     replica  =  copy  of  a  shard  
  5. terminology     node  =  single  server  (elas$csearch/jvm  instance)  

      cluster  =  collec$on  of  one  more  more  node     index  =  collec$on  of  documents  (database)     type  =  logical  category/par$$on  of  your  index  (table)     document  =  basic  unit  of  informa$on  that  can  be  indexed  (row)     shard  =  slice/par$$on  of  an  index     replica  =  copy  of  a  shard  
  6. terminology     node  =  single  server  (elas$csearch/jvm  instance)  

      cluster  =  collec$on  of  one  more  more  node     index  =  collec$on  of  documents  (database)     type  =  logical  category/par$$on  of  your  index  (table)     document  =  basic  unit  of  informa$on  that  can  be  indexed  (row)     shard  =  slice/par$$on  of  an  index     replica  =  copy  of  a  shard  
  7. terminology     node  =  single  server  (elas$csearch/jvm  instance)  

      cluster  =  collec$on  of  one  more  more  node     index  =  collec$on  of  documents  (database)     type  =  logical  category/par$$on  of  your  index  (table)     document  =  basic  unit  of  informa$on  that  can  be  indexed  (row)     shard  =  slice/par$$on  of  an  index     replica  =  copy  of  a  shard  
  8. terminology     node  =  single  server  (elas$csearch/jvm  instance)  

      cluster  =  collec$on  of  one  more  more  node     index  =  collec$on  of  documents  (database)     type  =  logical  category/par$$on  of  your  index  (table)     document  =  basic  unit  of  informa$on  that  can  be  indexed  (row)     shard  =  slice/par$$on  of  an  index     replica  =  copy  of  a  shard  
  9. terminology     node  =  single  server  (elas$csearch/jvm  instance)  

      cluster  =  collec$on  of  one  more  more  node     index  =  collec$on  of  documents  (database)     type  =  logical  category/par$$on  of  your  index  (table)     document  =  basic  unit  of  informa$on  that  can  be  indexed  (row)     shard  =  slice/par$$on  of  an  index     replica  =  copy  of  a  shard  
  10. nest  &  elas$csearch.net   •  Two  official  .NET  clients  for

     elas$csearch   •  NEST  originally  created  by  Mar$jn  Laarman   (Mpdreamz)  in  2010  (6  months  aber  elas$csearch)   •  Wide  adop$on  of  NEST  led  to  Elas$csearch  hiring   Mar$jn  and  making  NEST  the  official  .NET  client   •  NEST  split  into  two  clients:  NEST  and   Elas$csearch.Net  (low-­‐level  client  generated  mostly   from  the  REST  API  spec)   •  Recently  released  1.0  GA  
  11. elas$csearch.net   •  Low-­‐level  client   •  Generated  from  the

     official  elas$csearch  REST   API  spec   •  No  dependencies   •  Load  balancing  /  cluster  fail  over  support   •  Async  variants   •  Unlike  NEST,  does  not  provide  typed  request   and  response  objects  
  12. nest   •  High-­‐level  client   •  Strongly  typed  

    •  Json.NET   •  Uses  and  exposes  elas$csearch.net  under  the   hood   •  Fluent  API   •  Load  balancing  /  connec$on  failover   •  Async  variants  
  13. specifying  a  node  and  sehngs   var  node  =  new

     Uri(“hip://localhost:9200”);   var  sehngs  =  new  Connec$onSehngs(node);   var  client  =  new  Elas$cClient(sehngs);  
  14. a  closer  look  at  Connec$onSehngs       var  sehngs

     =  new  Connec$onSehngs(node)    .SetTimeout(150)    .MaximumRetries(5)    .SetDefaultIndex(“foo”)    .MapDefaultTypeNames(m  =>  m.Add(typeof(Session),  "session"))    .MapDefaultTypeIndices(m  =>  m.Add(typeof(Session),  "codecampnyc”))    .SetJsonSerializerSehngsModifier(…);  
  15. using  a  connec$on  pool   var  nodes  =  new  Uri[]

        {      new  Uri("hip://localhost:9200"),      new  Uri("hip://localhost:9201"),      new  Uri("hip://localhost:9202")     };     var  pool  =  new  Sta$cConnec$onPool(nodes);   var  sehngs  =  new  Connec$onSehngs(pool);   var  client  =  new  Elas$cClient(sehngs);  
  16. indexing  a  document   var  session  =  new  Session  

    {      Title  =  “Foo”,    Abstract  =  “Bar”,    Level  =  100,   }     //  Inference   var  response  =  client.Index(session);       //  Explicit   var  response  =  client.Index(session,  i  =>  i    .Index(“codecampnyc")    .Type(“session”)    .Id(1)    .Refresh()   );      
  17. indexing  mul$ple  documents   var  response  =  client.Bulk(b  =>  b

       .Index<Session>(i  =>  i.Document(new  Session  {  Title  =  "Foo”  }))    .Index<Session>(i  =>  i.Document(new  Session  {  Title  =  "Bar”  }))   );     //  Shortcut   var  response  =  client.IndexMany<Session>(sessions);  
  18. gehng  a  document     var  response  =  client.Get<Session>(1);  

    var  response  =  client.Get<Session>(g  =>  g    .Index("codecampnyc")    .Type("sesion")    .Id(1)   );  
  19. upda$ng  a  document   var  response  =  client.Update<Session,  object>(u  =>

     u    .Id(1)    .Doc(new  {  Abstract  =  “foo  bar”  })   );     var  response  =  client.Update<Session>(u  =>  u    .Id(1)    .Script("ctx._source.level  +=  count")    .Params(p  =>  p      .Add("count",  100)    )   );  
  20. dele$ng  a  document     var  response  =  client.Delete<Session>(1);  

    var  response  =  client.Delete<Session>(d  =>  d    .Index("codecampnyc")    .Type("sesion")    .Id(1)   );  
  21. crea$ng  an  index     var  response  =  client.CreateIndex("codecampnyc",  c

     =>  c    .NumberOfShards(2)    .NumberOfReplicas(1)    .AddMapping<Session>(m  =>  m      .Proper$es(ps  =>  ps        .String(s  =>  s          .Name(o  =>  o.Title)          .Index(FieldIndexOp$on.NotAnalyzed)      )        .Number(n  =>  n          .Name(o  =>  o.Level)          .Store(false)      )        .String(s  =>  s          .Name(o  =>  o.Abstract)          .Analyzer("snowball")        )      )   )   );  
  22. searching  (query  string  query)     var  response  =  client.Search<Session>(s

     =>  s    .From(0)    .Size(50)    .Query(q  =>  q      .QueryString(qs  =>  qs        .DefaultField(o  =>  o.Abstract)        .Query("c#  AND  elas$csearch")      )    )   );  
  23. searching  (match  query)     var  response  =  client.Search<Session>(s  =>

     s    .From(0)    .Size(50)    .Query(q  =>  q      .Match(qs  =>  qs        .OnField(o  =>  o.Abstract)        .Query(“elas$csearch")      )    )   );  
  24. searching  (bool  query)     var  response  =  client.Search<Session>(s  =>

     s    .From(0)    .Size(50)    .Query(q  =>  q      .Bool(b  =>  b        .Should(          qs  =>  qs            .Match(m  =>  m              .OnField(o  =>  o.Title)              .Query("elas$csearch")            ),          qs  =>  qs            .Match(m  =>  m              .OnField(o  =>  o.Abstract)              .Query("elas$csearch")            )        )        .Must(          qm  =>  qm            .Match(m  =>  m              .OnField(o  =>  o.Level)              .Query("100")            )          )        )      )    );  
  25. bool  query  shortcut  (using  operators)   var  response  =  client.Search<Session>(s

     =>  s    .From(0)    .Size(50)    .Query(q  =>  {      return  (q.Match(m  =>  m.OnField(o  =>  o.Title).Query("elas$csearch"))        ||  q.Match(m  =>  m.OnField(o  =>  o.Abstract).Query("elas$csearch")))        &&  q.Match(m  =>  m.OnField(o  =>  o.Level).Query("100"));      })    );  
  26. aggrega$ons   var  response  =  client.Search<Session>(s  =>  s    .Size(0)

       .Aggrega$ons(a  =>  a      .Terms("level_count",  t  =>  t        .Field(o  =>  o.Level)      )    )   );  
  27. response  handling   public  interface  IResponse   {    bool

     IsValid  {  get;  }    IElas$csearchResponse  Connec$onStatus  {  get;  set;  }    Elas$cInferrer  Infer  {  get  ;  }   }  
  28. ISearchResponse     response.Hits  (IEnumerable<IHit<T>>)     response.Documents  (IEnumerable<T>)  

      response.Aggrega$ons  (IDic$onary<string,  IAggrega$on>)     response.Total  
  29. object  ini$alizer  syntax  (indexing)     var  request  =  new

     IndexRequest<Session>(session)   {    Index  =  "codecampnyc",    Type  =  "session",    Id  =  "1”   };     client.Index(request);  
  30. object  ini$alizer  syntax  (searching)   IQueryContainer  query  =  new  MatchQuery

      {    Field  =  “abstract”,    Query  =  “elas$csearch”   };     var  request  =  new  SearchRequest   {    From  =  0,    Size  =  50,    Query  =  query,    Filter  =  ...,    Aggrega$ons  =  ...   };   client.Search<Session>(request);  
  31. thank  you   resources   slides  &  source  code:  hips://github.com/gmarz/ccnyc

      github  repo:  hips://github.com/elas$csearch/elas$csearch-­‐net   nest  documenta$on:  hip://nest.azurewebsites.net   elas$csearch  documenta$on:  hip://www.elas$csearch.org/guide/     contact  info   twiier:  gregmarzouka   github:  gmarz   email:  greg.marzouka@elas$csearch.com