Массовая коллекция в правильном пути индекса в ElasticSearch с использованием NEST в приложении .NET Core - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь объединить коллекцию элементов в индексе ElasticSearch, используя NEST внутри приложения .NET Core.

В настоящее время у меня работает, и элементы сохраняются, но не сохраняются гдеЯ пытаюсь сделать

Создание моего клиента:

protected ElasticClient GetClient()
{
    var node = new Uri("http://localhost:9200/");
    var settings = new ConnectionSettings(node)
        .DefaultIndex("TestIndex")
        .PrettyJson(true);

    return new ElasticClient(settings);
}

Вот как я создаю дескриптор для массива всех данных

protected BulkDescriptor GenerateBulkDescriptor<T>(IEnumerable<T> elements, string indexName) where T: class, IIndexable
{
    var bulkIndexer = new BulkDescriptor();

    foreach (var element in elements)
        bulkIndexer.Index<T>(i => i
          .Document(element)
          .Id(element.Id)
          .Index(indexName));

    return bulkIndexer;
}

Наконец, когда у меня есть этовот как я индексирую данные

var descriptor = GenerateBulkDescriptor(indexedElements, "indexed_elements");

var response = GetClient().Bulk(descriptor);

Но, если я увижу, как они хранятся в индексе Elastic, используя this , вот что у меня есть:

Just one index created

Как узнать, создан ли он по индексу TestIndex?Потому что, насколько я вижу, создан только один индекс

Заранее большое спасибо

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

После сом-тестов и попыток я нашел решение.

Прежде всего, это была проблема с настроенным индексом, , как только я установил его в нижнем регистре, индекснормально работала с индексированием данных внутри.

Затем у меня возникла проблема с индексированием данных по определенному «пути» внутри того же индекса, наконец, я нашел решение типа из NEST , взяв такжеПреимущество DefaultMappingFor, предложенное Руссом в предыдущем ответе.

Определение клиента:

var node = new Uri(_elasticSearchConfiguration.Node);
var settings = new ConnectionSettings(node)
    .DefaultMappingFor<IndexedElement>(m => m
        .IndexName(_elasticSearchConfiguration.Index)
        .TypeName(nameof(IndexedElement).ToLower()))
    .PrettyJson(true)
    .DisableDirectStreaming();

var client = new ElasticClient(settings);

Затем создание BulkDescriptior:

var bulkIndexer = new BulkDescriptor();

foreach (var element in elements)
    bulkIndexer.Index<IndexedElement>(i => i
        .Document(element)
        .Type(nameof(IndexedElement).ToLower()))
        .Id(element.Id)
    );

И, наконец,, объем данных:

client.Bulk(bulkIndexer);

Теперь, если я выполняю вызов индекса, я вижу это

{
"testindex": {
    "aliases": {},
    "mappings": {
        "indexedelement": {

[...]

}

Спасибо Расс заВаша помощь и для тех, кто заглянул в пост.

ОБНОВЛЕНИЕ

Наконец, кажется, что единственная проблема была связана с индексом по умолчанию, что он должен бытьнижний регистр, поэтому, указывайте тип с именем самого POCO, это не обязательно, как @RussCam действительно обнаружил в комментариях выше.После изменения индекса по умолчанию на строчные, все различные возможности работали нормально.

Еще раз всем спасибо

0 голосов
/ 26 февраля 2019

Определяя операции с индексами для BulkDescriptor, вы явно устанавливаете индекс для использования для каждой операции

foreach (var element in elements)
    bulkIndexer.Index<T>(i => i
      .Document(element)
      .Id(element.Id)
      .Index(indexName));

, где indexName равно "indexed_elements".Вот почему все документы индексируются в этом индексе, и вы не видите ни одного в "TestIndex".

Bulk API позволяет определять несколько операций, которые могут включать в себя индексирование документов в разные индексы.Когда индекс указывается непосредственно для операции, это будет используемый индекс. Если все операции с индексами при вызове Bulk API должны выполняться с одним и тем же индексом, вы можете опустить индекс для каждой операции и вместо этого указать индекс, который будет использоваться при вызове Bulk API напрямую

var defaultIndex = "default_index";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));

var settings = new ConnectionSettings(pool)
    .DefaultIndex(defaultIndex);

var client = new ElasticClient(settings);

var people = new [] 
{
    new Person { Id = 1, Name = "Paul" },
    new Person { Id = 2, Name = "John" },
    new Person { Id = 3, Name = "George" },
    new Person { Id = 4, Name = "Ringo" },
};

var bulkResponse = client.Bulk(b => b
    .Index("people")
    .IndexMany(people)
);

, который отправляет следующий запрос

POST http://localhost:9200/people/_bulk
{"index":{"_id":"1","_type":"person"}}
{"id":1,"name":"Paul"}
{"index":{"_id":"2","_type":"person"}}
{"id":2,"name":"John"}
{"index":{"_id":"3","_type":"person"}}
{"id":3,"name":"George"}
{"index":{"_id":"4","_type":"person"}}
{"id":4,"name":"Ringo"}

Обратите внимание, что URI равен /people/bulk и что каждый объект JSON, представляющий операцию, не содержит "_index".

ЕслиВы опускаете. Index() при вызове Bulk API, он будет использовать DefaultIndex, настроенный для ConnectionSettings:

var bulkResponse = client.Bulk(b => b
    .IndexMany(people)
);

, что дает

POST http://localhost:9200/_bulk
{"index":{"_id":"1","_index":"default_index","_type":"person"}}
{"id":1,"name":"Paul"}
{"index":{"_id":"2","_index":"default_index","_type":"person"}}
{"id":2,"name":"John"}
{"index":{"_id":"3","_index":"default_index","_type":"person"}}
{"id":3,"name":"George"}
{"index":{"_id":"4","_index":"default_index","_type":"person"}}
{"id":4,"name":"Ringo"}

Вы также можете указатьиндекс по умолчанию для использования для данного типа POCO на ConnectionSettings с DefaultMappingFor<T>(), где T - ваш тип POCO.

...