Индекс поиска Azure через консольное приложение .NET Core перезаписывает старый документ

Я добавляю документы в индекс поиска Azure через консольное приложение .NET Core. Когда я добавляю новые документы, он перезаписывает старый документ, и, наконец, индекс содержит только один документ.

Я использую метод IndexDocumentsBatch для загрузки списка документов в индекс. Когда я загружаю 5 документов, в индексе есть только последний документ из списка из 5 документов.

 var inputDocuments = DemoObjects();
 var sampleDocuments = await GetSampleDocumentsAsync(openAIClient, inputDocuments);
 await searchClient.IndexDocumentsAsync(IndexDocumentsBatch.Upload(sampleDocuments));

Привет @user26459797, мой ответ ниже помог тебе?

Suresh Chikkam 24.07.2024 09:22

Да, это сработало, спасибо за помощь.

user26459797 27.07.2024 08:13
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
2
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  • Вы добавляете документы в индекс поиска Azure, перезаписывая друг друга, поскольку они имеют одно и то же значение ключа.

  • Установите пакет nuget Azure.Search.Documents.

Проверьте приведенный ниже код, чтобы предотвратить перезапись.

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Azure;
using Azure.Search.Documents;
using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;

namespace ConsoleApp6
{
    internal class Program
    {
        private static readonly string serviceName = "testserviceb01";
        private static readonly string apiKey = "API-Key";
        private static readonly Uri endpoint = new Uri($"https://{serviceName}.search.windows.net");
        private static readonly string indexName = "sample-index";

        static async Task Main(string[] args)
        {
            var searchIndexClient = new SearchIndexClient(endpoint, new AzureKeyCredential(apiKey));
            var searchClient = new SearchClient(endpoint, indexName, new AzureKeyCredential(apiKey));

            await CreateIndexIfNotExistsAsync(searchIndexClient, indexName);
            await UploadDocumentsAsync(searchClient);
        }

        public static async Task CreateIndexIfNotExistsAsync(SearchIndexClient indexClient, string indexName)
        {
            try
            {
                var existingIndex = await indexClient.GetIndexAsync(indexName);
                Console.WriteLine($"Index '{indexName}' already exists.");
            }
            catch (RequestFailedException ex) when (ex.Status == 404)
            {
                var fields = new FieldBuilder().Build(typeof(SampleDocument));
                var index = new SearchIndex(indexName, fields);
                await indexClient.CreateOrUpdateIndexAsync(index);
                Console.WriteLine($"Index '{indexName}' created.");
            }
        }

        public static List<SampleDocument> DemoObjects()
        {
            return new List<SampleDocument>
            {
                new SampleDocument { Id = Guid.NewGuid().ToString(), Name = "Document 1" },
                new SampleDocument { Id = Guid.NewGuid().ToString(), Name = "Document 2" },
                new SampleDocument { Id = Guid.NewGuid().ToString(), Name = "Document 3" },
                new SampleDocument { Id = Guid.NewGuid().ToString(), Name = "Document 4" },
                new SampleDocument { Id = Guid.NewGuid().ToString(), Name = "Document 5" }
            };
        }

        public static async Task UploadDocumentsAsync(SearchClient searchClient)
        {
            var inputDocuments = DemoObjects();
            var batch = IndexDocumentsBatch.Upload(inputDocuments);
            try
            {
                IndexDocumentsResult result = await searchClient.IndexDocumentsAsync(batch);
                Console.WriteLine("Documents indexed successfully.");
            }
            catch (RequestFailedException ex)
            {
                Console.WriteLine($"Indexing failed: {ex.Message}");
            }
        }
    }

    public class SampleDocument
    {
        [SimpleField(IsKey = true, IsFilterable = true)]
        public string Id { get; set; }
        public string Name { get; set; }
    }
}
  • Каждый документ должен иметь уникальный ключ, чтобы предотвратить перезапись существующих документов. Если документы имеют один и тот же ключ, в индексе будет сохранен только последний документ с этим ключом.

Индексировано успешно:

Другие вопросы по теме