DEV Community

Aarshdeep Singh Chadha
Aarshdeep Singh Chadha

Posted on

1

Elasticsearch with .NET Core Web API and Docker

Elasticsearch is a powerful search engine designed for scalable data search and analytics. Integrating it with a .NET Core Web API allows us to perform full-text search and manage data efficiently. In this article, we'll walk through how to set up Elasticsearch with Docker, create a simple service to interact with it, and integrate it into a .NET Core Web API.

Prerequisites

Before we get started, make sure you have the following installed:

  • Docker
  • .NET Core SDK
  • Basic understanding of Docker, Elasticsearch, and .NET Core Web API

Setting up Elasticsearch and Kibana with Docker

We will use Docker Compose to create an environment where Elasticsearch and Kibana work together. Kibana provides a user interface to interact with Elasticsearch and monitor its data.

docker-compose.yml

version: '3.8'

services:
  elasticsearch:
    container_name: else
    image: elasticsearch:8.15.0
    ports:
      - "9200:9200"
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
    networks:
      - elk

  kibana:
    container_name: kibana
    image: kibana:8.15.0
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200
    networks:
      - elk

networks:
  elk:
    driver: bridge

volumes:
  elasticsearch-data:

Enter fullscreen mode Exit fullscreen mode

Image description

In this file, we define two services:

  1. Elasticsearch: Runs on port 9200 and is set to operate in a single-node mode. Security is disabled for simplicity.
  2. Kibana: Connects to Elasticsearch and runs on port 5601, providing a UI for interacting with Elasticsearch.

To bring up the services, run:

docker-compose up -d

Enter fullscreen mode Exit fullscreen mode

This will pull the required images and start the containers. You can verify by visiting http://localhost:5601 for Kibana and http://localhost:9200 for Elasticsearch.

Creating the ElasticService in .NET Core Web API

Next, we'll create a service in our .NET Core Web API project to interact with Elasticsearch.

Step 1: Add NuGet Packages

Install the necessary NuGet packages:

dotnet add package Elasticsearch.Net --version 8.15.0
dotnet add package NEST --version 8.15.0

Enter fullscreen mode Exit fullscreen mode

Step 2: Define ElasticSettings

Add the connection settings for Elasticsearch in your appsettings.json:

"ElasticsSearchSettings": {
  "Url": "<http://localhost:9200>",
  "DefaultIndex": "users"
}

Enter fullscreen mode Exit fullscreen mode

Step 3: Create ElasticService

The ElasticService is responsible for interacting with the Elasticsearch cluster. Here's a basic implementation:

public class ElasticService : IElasticService
{
    private readonly ElasticsearchClient _client;
    private readonly ElasticSettings _elasticSettings;

    public ElasticService(IOptions<ElasticSettings> elasticSettings)
    {
        _elasticSettings = elasticSettings.Value;

        var settings = new ElasticsearchClientSettings(new Uri(_elasticSettings.Url))
            .DefaultIndex(_elasticSettings.DefaultIndex);

        _client = new ElasticsearchClient(settings);
    }

    public async Task<bool> AddOrUpdate(User user)
    {
        var response = await _client.IndexAsync(user, idx =>
        {
            idx.Index(_elasticSettings.DefaultIndex).OpType(OpType.Index);
        });

        return response.IsValidResponse;
    }

    public async Task<bool> AddOrUpdateBulk(IEnumerable<User> users, string indexName)
    {
        var response = await _client.BulkAsync(x => x.Index(_elasticSettings.DefaultIndex)
        .UpdateMany(users, (ud, u) => ud.Doc(u).DocAsUpsert(true)));

        return response.IsValidResponse;
    }

    public async Task CreateIndexIfNotExistsAsync(string indexName)
    {
        if (!_client.Indices.Exists(indexName).Exists)
        {
            await _client.Indices.CreateAsync(indexName);
        }
    }

    public async Task<User> Get(string key)
    {
        var response = await _client.GetAsync<User>(key, g =>
        {
            g.Index(_elasticSettings.DefaultIndex);
        });

        return response.Source;
    }

    public async Task<List<User>> GetAll()
    {
        var response = await _client.SearchAsync<User>(x => x.Index(_elasticSettings.DefaultIndex));

        return response.IsValidResponse ? response.Documents.ToList() : default;
    }

    public async Task<bool> Remove(string key)
    {
        var response = await _client.DeleteAsync<User>(key, x => x.Index(_elasticSettings.DefaultIndex));

        return response.IsValidResponse;
    }

    public async Task<long?> RemoveAll()
    {
        var response = await _client.DeleteByQueryAsync<User>(d => d.Indices(_elasticSettings.DefaultIndex));

        return response.IsValidResponse ? response.Deleted : default;
    }
}

Enter fullscreen mode Exit fullscreen mode

Image description

This service contains methods to:

  • Add or update documents in Elasticsearch.
  • Create indices if they do not exist.
  • Retrieve individual or all documents from the index.
  • Delete individual or all documents from the index.

Step 4: Register and Configure Services

In your Startup.cs or Program.cs, register the ElasticService and its settings:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<ElasticSettings>(Configuration.GetSection("ElasticsSearchSettings"));
    services.AddSingleton<IElasticService, ElasticService>();
}

Enter fullscreen mode Exit fullscreen mode

Image description

Conclusion

In this article, we've set up Elasticsearch and Kibana using Docker and created a basic .NET Core Web API service to interact with Elasticsearch. With these steps, you can integrate Elasticsearch into your .NET Core applications to provide powerful search functionality. From here, you can further explore advanced features like custom mappings, querying, and full-text search.

Github : https://github.com/aarshdeepsinghchadha/elastic-search-with-dotnet

For more resource : https://dev.to/midnightasc/elasticsearch-an-in-depth-explanation-2bpf

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

Cloudinary image

Optimize, customize, deliver, manage and analyze your images.

Remove background in all your web images at the same time, use outpainting to expand images with matching content, remove objects via open-set object detection and fill, recolor, crop, resize... Discover these and hundreds more ways to manage your web images and videos on a scale.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay