Page tree
Skip to end of metadata
Go to start of metadata

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

Supported Operations

OperationMethods Supported
Insert
 Insert Methods Supported -Elasticsearch.Net
  • Elasticsearch.Net.ElasticLowLevelClient.Index
  • Elasticsearch.Net.ElasticLowLevelClient.IndexAsync
 Insert Methods Supported - NEST
  • Nest.ElasticClient.Index
  • Nest.ElasticClient.IndexAsync
  • Nest.ElasticClient.IndexDocument
  • Nest.ElasticClient.IndexDocumentAsync
Update
 Update Methods Supported - Elasticsearch.Net
  • Elasticsearch.Net.ElasticLowLevelClient.Update
  • Elasticsearch.Net.ElasticLowLevelClient.UpdateAsync
  • Elasticsearch.Net.ElasticLowLevelClient.UpdateByQuery
  • Elasticsearch.Net.ElasticLowLevelClient.UpdateByQueryAsync
 Update Methods Supported - NEST
  • Nest.ElasticClient.Update
  • Nest.ElasticClient.UpdateAsync
  • Nest.ElasticClient.UpdateByQuery
  • Nest.ElasticClient.UpdateByQueryAsync
Select
 Select Methods Supported - 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 Methods Supported - 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 
 Delete Methods Supported - Elasticsearch.Net
  • Elasticsearch.Net.ElasticLowLevelClient.Delete
  • Elasticsearch.Net.ElasticLowLevelClient.DeleteAsync
  • Elasticsearch.Net.ElasticLowLevelClient.DeleteByQuery
  • Elasticsearch.Net.ElasticLowLevelClient.DeleteByQueryAsync
 Delete Methods Supported - 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 

Links are created for transaction and function point needs:

Link typeSource and destination of link Methods supported
parentLink

Between Elasticsearch Cluster object and Elasticsearch Index object


useLinkBetween the caller .NET Class / Method objects and 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)

Cluster Creation and Default Index
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)

Update
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)

Select
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)

Delete
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)

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

Evolution

  • Reading Cluster Information from configuration file

Limitations

  • If index names are not resolved, the links are created between methods and default or unknown index objects
  • Bulk operations using ObjectInitializerSyntax result in useLinks only
  • Version .NET SDK 6.x and 7.x are supported
  • No labels