CAST supports Elasticsearch via its NoSQL for .NET extension. Details about how this support is provided for .NET source code is discussed below.

Supported Client Libraries

Elasticsearch.NET

NEST

Supported Operations

OperationMethods Supported
Insert


  • Elasticsearch.Net.ElasticLowLevelClient.Index
  • Elasticsearch.Net.ElasticLowLevelClient.IndexAsync


  • Nest.ElasticClient.Index
  • Nest.ElasticClient.IndexAsync
  • Nest.ElasticClient.IndexDocument
  • Nest.ElasticClient.IndexDocumentAsync


Update


  • Elasticsearch.Net.ElasticLowLevelClient.Update
  • Elasticsearch.Net.ElasticLowLevelClient.UpdateAsync
  • Elasticsearch.Net.ElasticLowLevelClient.UpdateByQuery
  • Elasticsearch.Net.ElasticLowLevelClient.UpdateByQueryAsync


  • Nest.ElasticClient.Update
  • Nest.ElasticClient.UpdateAsync
  • Nest.ElasticClient.UpdateByQuery
  • Nest.ElasticClient.UpdateByQueryAsync


Select


  • Elasticsearch.Net.ElasticLowLevelClient.Search
  • Elasticsearch.Net.ElasticLowLevelClient.SearchAsync
  • Elasticsearch.Net.ElasticLowLevelClient.DocumentExists
  • Elasticsearch.Net.ElasticLowLevelClient.DocumentExistsAsync
  • Elasticsearch.Net.ElasticLowLevelClient.Explain
  • Elasticsearch.Net.ElasticLowLevelClient.ExplainAsync


  • 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.ElasticLowLevelClient.Delete
  • Elasticsearch.Net.ElasticLowLevelClient.DeleteAsync
  • Elasticsearch.Net.ElasticLowLevelClient.DeleteByQuery
  • Elasticsearch.Net.ElasticLowLevelClient.DeleteByQueryAsync


  • 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 

Links

Links are created for transaction and function point needs:

Link typeSource and destination of link Methods supported
belongsTo

From DotNet Elasticsearch Index object to DotNet Elasticsearch Cluster object


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


  • Bulk
  • BulkAsync
  • DefaultIndex
 useInsertLink
  • Index
  • IndexAsync
  • IndexDocument
  • IndexDocumentAsync
 useDeleteLink
  • Delete
  • DeleteAsync
  • DeleteByQuery
  • DeleteByQueryAsync

useSelectLink

  • Search
  • SearchAsync
  • DocumentExists
  • DocumentExistsAsync
  • Explain
  • ExplainAsync
  • Get
  • GetAsync
useUpdateLink
  • Update
  • UpdateAsync
  • UpdateByQuery
  • UpdateByQueryAsync


What results can you expect?

Once the analysis/snapshot generation has completed, you can view the results in the normal manner (for example via CAST Enlighten). Some examples 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)
public void Indexing()
{
            var person = new Person
            {
                Id = 1,
                FirstName = "Martijn",
                LastName = "Laarman"
            };
            var ndexResponse = client.IndexDocument(person); //<1>
}


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


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

Evolution

Limitations