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 |
Links
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