Programming/How To Post data to Elasticsearch: Difference between revisions

From Wiki Aghanim
Jump to navigationJump to search
 
(One intermediate revision by the same user not shown)
Line 31: Line 31:
}
}
</syntaxhighlight>  
</syntaxhighlight>  


The below is a simple service that adds the message that the method receives to the body, and post ut using an HttpClient. ''my-index/_doc'' is just the indices that I made.  
The below is a simple service that adds the message that the method receives to the body, and post ut using an HttpClient. ''my-index/_doc'' is just the indices that I made.  
Line 58: Line 57:
</syntaxhighlight>
</syntaxhighlight>


 
Now you can expose this service via a controller.
Now you can expose this services via a Controller.  


<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">
Line 76: Line 74:


</syntaxhighlight>
</syntaxhighlight>


[[Category:.NET]]
[[Category:.NET]]
[[Category:CSharp]]
[[Category:CSharp]]
[[Category:Programming]]
[[Category:Programming]]

Latest revision as of 13:40, 3 March 2026

Elasticsearch API Key

In order to POST or GET data from Elasticsearch, you need an API key.

You must have one of the following cluster privileges:

  • manage_security
  • manage_api_key
  • manage_own_api_key
  1. Open Kibana
  2. In the left sidebar, scroll down and click Stack Management
  3. Under Security, click API Keys
  4. Click Create API key
  5. Fill in the following fields:
    • Name — give it a meaningful name
    • Expiration — optional, leave blank for no expiration
    • Privileges — set index/cluster permissions (e.g. index * with privilege write to post data)
  6. Click Create API key
  7. Copy the key immediately — it is only shown once


Your Project

In appsettings.json add the following.

{
  "Elasticsearch": {
    "Url": "https://10.18.20.1:9200",
    "IndexName": "my-index",
    "ApiKey": "U2g2OTVKc0I5QmZUMW5vY25NOXY6b25VMDFadUhsN1kycjJnZzVGekUwQQ=="
  }
}

The below is a simple service that adds the message that the method receives to the body, and post ut using an HttpClient. my-index/_doc is just the indices that I made.

 public Task<bool> PostDocument(MessageModel message)
        {
            var apiKey = _configuration["Elasticsearch:ApiKey"];
            var url = _configuration["Elasticsearch:Url"];
            var json = JsonSerializer.Serialize(message);

            _httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("ApiKey", apiKey);

            var body = new StringContent(json, Encoding.UTF8, "application/json");
            var result = _httpClient.PostAsync($"{url}/my-index/_doc/", body).GetAwaiter().GetResult();

            if (result.IsSuccessStatusCode)
            {
                Console.WriteLine(result.ToString());
                return Task.FromResult(true);
            }
            return Task.FromResult(false);
        }
    }

Now you can expose this service via a controller.

  [HttpPost]
        public Task<ActionResult> PostData([FromBody] MessageModel messageModel)
        {
            var elastic = new ElasticsearchService(_httpClient, _configuration);
            var result = elastic.PostDocument(messageModel);

            if (result.IsCompleted)
            {
                return OkResult
            }
            return OkResult(result);
        }