Массовая вставка в эластичный поиск с использованием Elasticsearch.net или PlainElastic.net

Я возился с Elasticsearch.net ( http://nest.azurewebsites.net/) и PlainElastic.Net ( https://github.com/Yegoroff/PlainElastic.Net) и смог вставить отдельные документы в эластичный поиск. Я сейчас пытаюсь выяснить, как выполнить массовую вставку. Я знаю, что каждая из этих двух библиотек.net имеет документацию по этому вопросу, но данные, которые я хочу вставить, хранятся в словаре, где ключ - это идентификатор документа, а значение - это документ, и я не могу понять, как это сделать.

Вот некоторый код, который я имею (используя Elasticsearch.net):

var conn = new Uri("http://localhost:9200");
var config = new ConnectionConfiguration(conn);
var client = new ElasticsearchClient(config);

var myJson = @"{""Col1"" : ""Hello World"", ""col2"" : ""asdfasdf"" }";
var myjson2 = @"{""Col2"" : ""Hello World Again"", ""col2"" : ""zxcvzxcv"" }";

Dictionary<string, string> jsonCollection = new Dictionary<string, string>();

jsonCollection.Add("1", myJson);
jsonCollection.Add("2", myjson2);

2 ответа

Я использую PlainElastic.Net, и вот как должны выглядеть данные RAW

POST /_bulk
{ "index" :{ "_index": "myIndex", "_type": "myType", "_id": 1  }}
{ "id": 1, "name": "My category \"ONE\" "}
{ "index" :{ "_index": "myIndex", "_type": "myType", "_id": 2  }}
{ "id": 2, "name": "My second category \t "}
{ "index" :{ "_index": "myIndex", "_type": "myType", "_id": 3 }}
{ "id": 3, "name": "My third category \r\n "}

имейте в виду, что новая строка находится в конце каждой строки (да, даже после последней строки)

поэтому vb.net должен выглядеть так:

Dim bulkData As String = "{ ""index"": { ""_index"": ""myIndex"", ""_type"": ""myType"", ""_id"": 1  }}" & vbNewLine & _
                         "{ ""id"": 1, ""name"": ""My category""}" & vbNewLine & _
                         "{ ""index"": { ""_index"": ""myIndex"", ""_type"": ""myType"", ""_id"": 2  }}" & vbNewLine & _
                         "{ ""id"": 2, ""name"": ""My second category""} " & vbNewLine & _
                         "{ ""index"": { ""_index"": ""myIndex"", ""_type"": ""myType"", ""_id"": 3  }}" & vbNewLine & _
                         "{ ""id"": 3, ""name"": ""My third category""} " & vbNewLine

Dim ESConn as New ElasticConnection("localhost", 9200)
Dim response As String = ESConn.Post("/_bulk", bulkData)

C# версия, которую я не тестировал, но вы поймете, идея

string bulkData = @"{ ""index"": { ""_index"": ""myIndex"", ""_type"": ""myType"", ""_id"": 1}}
{ ""id"": 1, ""name"": ""My category""}
{ ""index"": { ""_index"": ""myIndex"", ""_type"": ""myType"", ""_id"": 2}}
{ ""id"": 2, ""name"": ""My second category""}
{ ""index"": { ""_index"": ""myIndex"", ""_type"": ""myType"", ""_id"": 3}}
{ ""id"": 3, ""name"": ""My third category""} \n";

ElasticConnection ESConn = New ElasticConnection("localhost", 9200);
string response = ESConn.Post("/_bulk", bulkData);

Вы можете создать JSON вручную или с помощью Newtonsoft.Json

Я использую ниже класс для загрузки массовых индексов. этот пример не использует документ Json.

public class esclient
{
    const string uri = "http://localhost:9200";
    const string index = "INDEX_NAME";
    static ElasticClient _current;
    public esclient()
    {
        if (_current == null)
        {
            var node = new Uri(uri);

            var _settings = new ConnectionSettings(node)
                            .DefaultIndex(index)
                            .MaximumRetries(2)
                            .MaxRetryTimeout(TimeSpan.FromSeconds(150));

            _current = new ElasticClient(_settings);
        }
    }

    public void bulkIndexCreate(IEnumerable<esentity> items)
    {
        var descriptor = new BulkDescriptor();
        foreach (var item in items)
        {
            descriptor.Index<esentity>(op => op.Document(item));
        }

        var result = _current.Bulk(descriptor);
    }
}
Другие вопросы по тегам