Массовая вставка в ElasticSearch с помощью NEST

Я пытаюсь добавить 100 000 продуктов в elasticsearch, но когда я пытаюсь, я получаю: {"Ошибка проверки: 1: запросы не добавлены;"}

Мой код:

        var Node = new Uri("......");
        var ConnectionPool = new SniffingConnectionPool(new[] { Node });
        var Config = new ConnectionConfiguration(ConnectionPool)
                    .SniffOnConnectionFault(false)
                    .SniffOnStartup(false)
                    .SniffLifeSpan(TimeSpan.FromMinutes(10));
        var Client = new ElasticsearchClient(Config);

        var AllProducts = Product.GetProducts();
        var SPl = AllProducts.Split(100); // Split into 100 collections/requests

        var COll = new List<ElasticsearchResponse<DynamicDictionary>>();

        foreach (var I in SPl)
        {
            var Descriptor = new BulkDescriptor();

            foreach (var Product in I)
            {
                Descriptor.Index<Product>(op => op.Document(Product));
            }

            COll.Add(Client.Bulk(Descriptor));
        }

AllProducts содержит список этого объекта:

public class Product
{
 public int AffiliateNr { get; set; }
 public string AffiliateProductId { get; set; }
 public int BrandNr { get; set; }
 public string Currency { get; set; }
 public string IndexId { get; set; }
 public decimal Price { get; set; }
 public long ProductNr { get; set; }
 public string Title { get; set; }
}

So,

  1. Где я могу установить имя индекса?
  2. Почему я получил сообщение «Ошибка проверки: 1: запросы не добавлены»?
  3. IndexId — это мой идентификатор продукта. Как указать Elasticsearch использовать этот идентификатор? Или я должен указать идентификатор?

person mrcode    schedule 04.06.2015    source источник
comment
почему бы не использовать IndexMany?   -  person Shivang MIttal    schedule 04.06.2015
comment
спасибо Теперь у меня есть: SPl.Select(I => Client.IndexMany(I, products)) И это работает. Но: IndexId — это мой идентификатор продукта. Как указать Elasticsearch использовать этот идентификатор? Или я должен указать идентификатор?   -  person mrcode    schedule 05.06.2015
comment
Переименуйте поле IndexId в Id, и elasticsearch будет использовать его по соглашению в качестве идентификатора документа.   -  person Manolis    schedule 05.06.2015
comment
@mrcode: посмотрите мой ответ ниже и отметьте его, если он полезен   -  person Shivang MIttal    schedule 05.06.2015


Ответы (1)


Ссылаясь на вашу предыдущую проблему, вы можете использовать IndexMany для индексации данных. Теперь, согласно вашему вопросу в комментарии, вы можете указать идентификатор, который будет использовать эластичный поиск. см. приведенный ниже пример.

  ElasticType(IdProperty = "<fieldName>")]
    public class ClassName
    {

если вы не хотите указывать какой-либо идентификатор для эластичного поиска, создайте фиктивное поле dummyId (nullable) и поместите его в «IdProperty». Эластичный поиск автоматически присвоит ему значение, если оно равно нулю.

Редактировать: Начиная с версии 2.3, его

[ElasticsearchType(IdProperty = "<fieldName>")]
person Shivang MIttal    schedule 05.06.2015
comment
Идеальный. Есть ли простой способ отметить, какие свойства я не хочу индексировать в elasticsearch? :) - person mrcode; 06.06.2015
comment
@mrcode: да, просмотрите ответ stackoverflow.com/questions/23063839/. отметьте ответ выше, если он правильный - person Shivang MIttal; 07.06.2015