Support of Elasticsearch for .NET

CAST supports Eleasticsearch via its com.castsoftware.nosqldotnet extension. Details about how this support is provided for .NET source code is discussed below.

Supported Client Libraries

Library

Supported

Elasticsearch.NET

NEST

Supported Operations

Operation Scenario Methods Supported
Insert Elasticsearch.Net

Elasticsearch.Net.ElasticLowLevelClient.Index

Elasticsearch.Net.ElasticLowLevelClient.IndexAsync

Insert NEST

Nest.ElasticClient.Index

Nest.ElasticClient.IndexAsync

Nest.ElasticClient.IndexDocument

Nest.ElasticClient.IndexDocumentAsync

Update Elasticsearch.Net

Elasticsearch.Net.ElasticLowLevelClient.Update

Elasticsearch.Net.ElasticLowLevelClient.UpdateAsync

Elasticsearch.Net.ElasticLowLevelClient.UpdateByQuery

Elasticsearch.Net.ElasticLowLevelClient.UpdateByQueryAsync

Update NEST

Nest.ElasticClient.Update

Nest.ElasticClient.UpdateAsync

Nest.ElasticClient.UpdateByQuery

Nest.ElasticClient.UpdateByQueryAsync

Select Elasticsearch.Net

Elasticsearch.Net.ElasticLowLevelClient.Search

Elasticsearch.Net.ElasticLowLevelClient.SearchAsync

Elasticsearch.Net.ElasticLowLevelClient.DocumentExists

Elasticsearch.Net.ElasticLowLevelClient.DocumentExistsAsync

Elasticsearch.Net.ElasticLowLevelClient.Explain

Elasticsearch.Net.ElasticLowLevelClient.ExplainAsync

Select NEST

Nest.ElasticClient.Search

Nest.ElasticClient.SearchAsync

Nest.ElasticClient.DocumentExists

Nest.ElasticClient.DocumentExistsAsync

Nest.ElasticClient.Explain

Nest.ElasticClient.ExplainAsync

Nest.ElasticClient.Get

Nest.ElasticClient.GetAsync

Delete  Elasticsearch.Net

Elasticsearch.Net.ElasticLowLevelClient.Delete

Elasticsearch.Net.ElasticLowLevelClient.DeleteAsync

Elasticsearch.Net.ElasticLowLevelClient.DeleteByQuery

Elasticsearch.Net.ElasticLowLevelClient.DeleteByQueryAsync

Delete NEST

Nest.ElasticClient.Delete

Nest.ElasticClient.DeleteAsync

Nest.ElasticClient.DeleteByQuery

Nest.ElasticClient.DeleteByQueryAsync

Objects

Icon  Description

DotNet Elasticsearch Cluster

DotNet Elasticsearch Index

DotNet Unknown Elasticsearch Index 
Link type Source and destination of link  Methods supported
belongsTo

From DotNet Elasticsearch Index object to DotNet Elasticsearch Cluster object

-
useLink Between the caller .NET Class / Method objects and DotNet Elasticsearch Index objects

Bulk

BulkAsync

DefaultIndex

 useInsertLink Between the caller .NET Class / Method objects and DotNet Elasticsearch Index objects

Index

IndexAsync

IndexDocument

IndexDocumentAsync

 useDeleteLink Between the caller .NET Class / Method objects and DotNet Elasticsearch Index objects

Delete

DeleteAsync

DeleteByQuery

DeleteByQueryAsync

useSelectLink

Between the caller .NET Class / Method objects and DotNet Elasticsearch Index objects

Search

SearchAsync

DocumentExists

DocumentExistsAsync

Explain

ExplainAsync

Get

GetAsync

useUpdateLink Between the caller .NET Class / Method objects and DotNet Elasticsearch Index objects

Update

UpdateAsync

UpdateByQuery

UpdateByQueryAsync

What results can you expect?

Some example scenarios are shown below:

Cluster Creation and Default Index(Elasticsearch.Net and NEST)

class HighLevel
{
        public void UsingConnectionPool()
        {            var uris = new[]
                 {
                    new Uri("http://localhost:9200"),
                    new Uri("http://localhost:9201"), 
                   new Uri("http://localhost:9202"), 
                 };
                var connectionPool = new SniffingConnectionPool(uris);
                var settings = new ConnectionSettings(connectionPool)
                        .DefaultIndex("people");
                var client = new ElasticClient(settings);
        }
}

Cluster Creation From Configuration File

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="resizer" type="ImageResizer.ResizerSection,ImageResizer" requirePermission="false" />
    <section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <section name="rockConfig" type="Rock.Configuration.RockConfig, Rock" />
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <appSettings>
    <add key="baseUrl" value="http://127.0.0.1:9200" />
    <add key="AllowDuplicateGroupMembers" value="false" />
    <add key="EnableRedisCacheCluster" value="False" />
    <add key="RedisPassword" value="" />
    <add key="RedisEndpointList" value="" />
    <add key="RedisDatabaseNumber" value="0" />
    <add key="CacheManagerEnableStatistics" value="False" />
  </appSettings>

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.IdentityModel.Tokens" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.1.0" newVersion="5.2.1.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Owin.Security" publicKeyToken="31bf3856ad364e35" culture="neutral" />
          <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.IdentityModel.Protocol.Extensions" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.40306.1554" newVersion="1.0.40306.1554" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.AspNetCore.DataProtection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <system.codedom>
    <compilers>
      <compiler extension=".cs" language="c#;cs;csharp" warningLevel="4" compilerOptions="/langversion:7.3 /nowarn:1659;1699;1701" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=3.6.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
        <providerOption name="UseAspNetSettings" value="false" />
      </compiler>
    </compilers>
  </system.codedom>
</configuration>

Insert Operation(Elasticsearch.Net and NEST)

IndexDocument

public void Indexing()
{
            var person = new Person
            {
                Id = 1,
                FirstName = "Martijn",
                LastName = "Laarman"
            };
            var ndexResponse = client.IndexDocument(person); //<1>
}

IndexDocumentAsync

public async Task IndexingAsync()
{            var person = new Person
            {
                Id = 2,
                FirstName = "Jack",
                LastName = "Mas" 
           };
           var asyncIndexResponse = await client.IndexDocumentAsync(person); 
}

Update Operation(Elasticsearch.Net and NEST)

public static bool updateDocument(string searchID, string first_name, string last_name)
{
        bool status;
             //Update by Partial Document
               var response = client.Update<DocumentAttributes, UpdateDocumentAttributes>(searchID, d => d
                .Index(index)
                .Doc(new UpdateDocumentAttributes
                {
                    FirstName = first_name,
                    LastName = last_name
                 }));            
}

Select Operation(Elasticsearch.Net and NEST)

public void SearchingOnDefaultIndex()        
{
    var searchResponse = client.Search<Person>(s => s
                .From(0)
                .Size(10)
                .Query(q => q
                     .Match(m => m
                        .Field(f => f.FirstName)
                        .Query("Martijn")
                     )
                )
            );
            var people = searchResponse.Documents;        
}

Delete Operation(Elasticsearch.Net and NEST)

public static bool deleteDocument(string index, string searchID)        
{
        bool status;
             var response = client.Delete<DocumentAttributes>(searchID, d => d
                 .Index(index));
        if (response.IsValid)
        {
                 status = true;
             }
           else
           {
                    status = false;
               }
            return status;
}   

Bulk Operations(Elasticsearch.Net and NEST)

public void BulkOperations()        
{
            var people = new object[]
            {
                new { index = new { _index = "people", _type = "person", _id = "1"  }},
                new { FirstName = "Martijn", LastName = "Laarman" },
                new { index = new { _index = "people", _type = "person", _id = "2"  }},
                new { FirstName = "Greg", LastName = "Marzouka" },
                new { index = new { _index = "people", _type = "person", _id = "3"  }},
                new { FirstName = "Russ", LastName = "Cam" },
             };
            var ndexResponse = lowlevelClient.Bulk<StringResponse>(PostData.MultiJson(people));
            string responseStream = ndexResponse.Body;
}

Bulk Operations Using Fluent DSL

public void BulkOperationsUsingFluentDSL ()
{
            var result = client.Bulk(b => b
            .Index<Person>(i => i
                .Document(new Person {Id = 2})
             )   
             .Create<Person>(c => c
                .Document(new Person { Id = 3 })
            )
            .Delete<Person>(d => d
                .Document(new Person { Id = 4 })
            ));
}

Known Limitations

  • If index names are not resolved, the links are created between methods and default or unknown index objects