# La búsqueda de textos completos (Pt 3 - OpenSearch con ASPM SK3NET Core)

<!--category-- OpenSearch, ASP.NET -->
<datetime class="hidden">2024-08-24T06:40</datetime>

## El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

En las partes anteriores de esta serie hemos introducido el concepto de búsqueda de texto completo y cómo se puede usar para buscar texto dentro de una base de datos. En esta parte introduciremos cómo usar OpenSearch con ASPM SK1NET Core.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

- [La búsqueda del texto completo con Postgres](/blog/textsearchingpt1)
- [En la misma sesión, el Consejo aprobó el proyecto de resolución A/C.2/57/L.20 sin someterlo a votación (véase párr.](/blog/textsearchingpt11)
- [El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos desglosados por sexo, edad y origen étnico.](/blog/textsearchingpt2)

En esta parte nosotros'cubriremos cómo empezar a usar una nueva instancia de OpenSearch brillante con ASPM SK1NET Core.

[TOC]

## El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Una vez que hayamos puesto en marcha y ejecutado la instancia OpenSearch podemos empezar a interactuar con ella. Usaremos el [El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la protección de los derechos humanos y las libertades fundamentales de todos los trabajadores migratorios y de sus familiares.](https://opensearch.org/docs/latest/clients/OSC-dot-net/) El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole.
En primer lugar, instalamos el cliente en nuestra extensión de configuración.

```csharp
    var openSearchConfig = services.ConfigurePOCO<OpenSearchConfig>(configuration.GetSection(OpenSearchConfig.Section));
        var config = new ConnectionSettings(new Uri(openSearchConfig.Endpoint))
            .EnableHttpCompression()
            .EnableDebugMode()
            .ServerCertificateValidationCallback((sender, certificate, chain, errors) => true)
            .BasicAuthentication(openSearchConfig.Username, openSearchConfig.Password);
        services.AddSingleton<OpenSearchClient>(c => new OpenSearchClient(config));
```

Esto configura al cliente con el punto final y los credenciales. También habilitamos el modo de debugging para poder ver lo que se está haciendo'.

## El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la asignación de recursos suficientes a la educación y la formación profesional.

El concepto central de OpenSearch es el índice.

Para ello, utilicemos el [El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la protección de los derechos humanos y las libertades fundamentales de todos los trabajadores migratorios y de sus familiares.](https://opensearch.org/docs/latest/clients/OSC-dot-net/) para .NETM SK1 Puede instalarlo a través de NuGet:

La primera es la materia de bajo nivel como gestión de conexiones,, la segunda es la de alto nivel como indexación y búsqueda.

Ahora que lo hemos instalado podemos empezar a mirar los datos de indexación.

Crear un índice es semi-directamente hacia delanteM SK1 Simplemente defines como debe parecer su índice y luego lo creas.
En el código de abajo usted puede ver nosotros 'map' nuestro modelo de índice (una versión simplificada del blogM SK3modelo de base de datosMSC4
Para cada campo de este modelo definimos entonces qué tipo es (texto , fechaM SK2 palabra clave, etc.

El Tipo es importante, ya que define cómo se almacenan los datos y cómo pueden ser buscados. Por ejemplo, se analiza y se toquena un campo M SK2texto ' un campo , un SSK5 una palabra claveMSC6 no es un campoMNK7 Así que se espera que la búsqueda de un campo de palabras clave sea exacta tal como está almacenadoMST9 pero un campo texto que usted puede buscar partes del textoMstK10

También aquí Categories es realmente una cadena[] pero el tipo de palabras clave entiende cómo manejarlas correctamente.

```csharp
   public async Task CreateIndex(string language)
    {
        var languageName = language.ConvertCodeToLanguageName();
        var indexName = GetBlogIndexName(language);

      var response =  await client.Indices.CreateAsync(indexName, c => c
            .Settings(s => s
                .NumberOfShards(1)
                .NumberOfReplicas(1)
            )
            .Map<BlogIndexModel>(m => m
                .Properties(p => p
                    .Text(t => t
                        .Name(n => n.Title)
                        .Analyzer(languageName)
                    )
                    .Text(t => t
                        .Name(n => n.Content)
                        .Analyzer(languageName)
                    )
                    .Text(t => t
                        .Name(n => n.Language)
                    )
                    .Date(t => t
                        .Name(n => n.LastUpdated)
                    )
                    .Date(t => t
                        .Name(n => n.Published)
                    )
                    .Date(t => t
                        .Name(n => n.LastUpdated)
                    )
                    .Keyword(t => t
                        .Name(n => n.Id)
                    )
                    .Keyword(t=>t
                        .Name(n=>n.Slug)
                    )
                    .Keyword(t=>t
                        .Name(n=>n.Hash)
                    )
                    .Keyword(t => t
                        .Name(n => n.Categories)
                    )
                )
            )
        );
        
        if (!response.IsValid)
        {
           logger.LogError("Failed to create index {IndexName}: {Error}", indexName, response.DebugInformation);
        }
    }
```

## Añadidos a los elementos del índice

Una vez que hayamos establecido nuestro índice para agregar elementos a él necesitamos añadir elementos a este índice. Aquí como nosotros'estamos añadiendo una BUNCH usamos un método de inserción en bulkM SK2

Pueden ver que en primer lugar llamamos a un método llamado`GetExistingPosts` que devolve todos los puestos que ya están en el índice. Luego agrupamos los puesto por idioma y filtramos el M SK1uk' idioma (porque no queremos indexar que por que necesita un plugin adicional no tenemos todavíaMSC5no tenemos aún\). Luego filtramos cualquier puesto que ya está en el indexMNK7
Usamos el hash y el id para identificar si un puesto ya está en el index.

```csharp
    public async Task AddPostsToIndex(IEnumerable<BlogIndexModel> posts)
    {
        var existingPosts = await GetExistingPosts();
        var langPosts = posts.GroupBy(p => p.Language);
        langPosts=langPosts.Where(p => p.Key!="uk");
        langPosts = langPosts.Where(p =>
            p.Any(post => !existingPosts.Any(existing => existing.Id == post.Id && existing.Hash == post.Hash)));
        
        foreach (var blogIndexModels in langPosts)
        {
            
            var language = blogIndexModels.Key;
            var indexName = GetBlogIndexName(language);
            if(!await IndexExists(language))
            {
                await CreateIndex(language);
            }
            
            var bulkRequest = new BulkRequest(indexName)
            {
                Operations = new BulkOperationsCollection<IBulkOperation>(blogIndexModels.ToList()
                    .Select(p => new BulkIndexOperation<BlogIndexModel>(p))
                    .ToList()),
                Refresh = Refresh.True,
                ErrorTrace = true,
                RequestConfiguration = new RequestConfiguration
                {
                    MaxRetries = 3
                }
            };

            var bulkResponse = await client.BulkAsync(bulkRequest);
            if (!bulkResponse.IsValid)
            {
                logger.LogError("Failed to add posts to index {IndexName}: {Error}", indexName, bulkResponse.DebugInformation);
            }
            
        }
    }
```

Una vez que “'” hayamos filtrado los puestos existentes y nuestro analizador perdido, creamos un nuevo índice ( basado en el nombre , en mi caso<language>") y luego crear una solicitud de volumen. Esta solicitud de masa es una colección de operaciones para realizar en el índiceM SK2
El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `BulkRequest` En el párrafo 2 de la resolución, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación del Programa de Acción para prevenir, combatir y eliminar el tráfico ilícito de armas pequeñas y ligeras en todos sus aspectos. `Refresh` El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. `true`. Esto significa que después de haber completado la inserción en bulk el índice se actualizaM SK1 Esto no es' REALmente necesario pero es ' útil para la debuggingMSC4

## El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole.

Una buena manera de comprobar qué 's realmente se ha creado aquí es entrar en las herramientas Dev en los paneles de OpenSearch y ejecutar una consulta de búsqueda

```json
GET /mostlylucid-blog-*
{}
```

Esta consulta nos devolverá todos los índices que coincidan con el patrón `mostlylucid-blog-*`En el párrafo 2 de la resolución, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación del Programa de Acción para prevenir, combatir y eliminar el tráfico ilícito de armas pequeñas y ligeras en todos sus aspectos.

```json
{
  "mostlylucid-blog-ar": {
    "aliases": {},
    "mappings": {
      "properties": {
        "categories": {
          "type": "keyword"
        },
        "content": {
          "type": "text",
          "analyzer": "arabic"
        },
        "hash": {
          "type": "keyword"
        },
        "id": {
          "type": "keyword"
        },
        "language": {
          "type": "text"
        },
        "lastUpdated": {
          "type": "date"
        },
        "published": {
          "type": "date"
        },
        "slug": {
          "type": "keyword"
        },
        "title": {
          "type": "text",
          "analyzer": "arabic"
        }
      }
    },
    "settings": {
      "index": {
        "replication": {
          "type": "DOCUMENT"
..MANY MORE
```

Las herramientas Dev en los paneles de OpenSearch es una gran manera de probar tus consultas antes de ponerlas en tu código.

![El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.](devtools.png?width=900&quality=25)

## El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole.

Ahora podemos empezar a buscar el índice. Podemos usar `Search` method sobre el cliente para hacer esto.
Esto es donde el verdadero poder de OpenSearch viene en. Es literalmente [De conformidad con lo dispuesto en el párrafo 2 del artículo 5 de la Convención, los Estados Partes deben adoptar todas las medidas apropiadas para garantizar que se cumplan plenamente las obligaciones que les incumben en virtud del presente Protocolo.](https://opensearch.org/docs/latest/query-dsl/) puede usarse para buscar sus datos. Todo desde una búsqueda simple con palabras clave hasta una búsqueda compleja.

```csharp
    public async Task<List<BlogIndexModel>> GetSearchResults(string language, string query, int page = 1, int pageSize = 10)
    {
        var indexName = GetBlogIndexName(language);
        var searchResponse = await client.SearchAsync<BlogIndexModel>(s => s
                .Index(indexName)  // Match index pattern
                .Query(q => q
                    .Bool(b => b
                        .Must(m => m
                            .MultiMatch(mm => mm
                                .Query(query)
                                .Fields(f => f
                                    .Field(p => p.Title, boost: 2.0) 
                                    .Field(p => p.Categories, boost: 1.5) 
                                    .Field(p => p.Content)
                                )
                                .Type(TextQueryType.BestFields)
                                .Fuzziness(Fuzziness.Auto)
                            )
                        )
                    )
                )
                .Skip((page -1) * pageSize)  // Skip the first n results (adjust as needed)
                .Size(pageSize)  // Limit the number of results (adjust as needed)
        );

        if(!searchResponse.IsValid)
        {
            logger.LogError("Failed to search index {IndexName}: {Error}", indexName, searchResponse.DebugInformation);
            return new List<BlogIndexModel>();
        }
        return searchResponse.Documents.ToList();
    }

```

### El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `GetSearchResults`, está diseñado para hacer una consulta de un índice específico OpenSearch para extraer post de blog. Es necesario tres parámetrosM SK2 `language`, `query`El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de disposiciones legislativas, administrativas y de otra índole que prohíban la discriminación racial. `page` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `pageSize`. Aquí ' es lo que hace:

1. **El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos desglosados por sexo, edad y origen étnico.**:
   
   - El sistema retrieve el nombre del índice utilizando el `GetBlogIndexName` method based on the language provided. El índice se selecciona de forma dinámica según el idioma.

2. **El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad entre los géneros, en particular mediante la adopción de medidas legislativas, administrativas y de otra índole.**:
   
   - El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos estadísticos desglosados por sexo, edad y origen étnico. `Bool` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `Must` El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso.
   - Por consiguiente, el Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo. `Must` El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la adopción de medidas legislativas, administrativas, judiciales y de otra índole. `MultiMatch` se utiliza para buscar entre múltiples campos (`Title`, `Categories`El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. `Content`).
     - **El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.**El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. `Title` En el párrafo 2 de la parte dispositiva del proyecto de resolución, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo séptimo período de sesiones un informe sobre los progresos realizados en la aplicación de las recomendaciones formuladas por la Comisión Consultiva en Asuntos Administrativos y de Presupuesto. `2.0`, que lo hace más importante en la búsqueda, y `Categories` El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `1.5`En el párrafo 2 de la parte dispositiva del proyecto de resolución, la Asamblea General pidió al Secretario General que le presentara en su quincuagésimo noveno período de sesiones un informe sobre los progresos realizados en la aplicación de las recomendaciones formuladas por la Comisión Consultiva en Asuntos Administrativos y de Presupuesto.
     - **El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad entre los géneros en todos los niveles de la enseñanza, incluida la educación primaria y secundaria.**El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos estadísticos desglosados por sexo, edad y origen étnico. `BestFields`, que intenta encontrar el mejor campo de paridad para la consultaM SK1
     - **El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.**El Comité recomienda que el Estado Parte adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. `Fuzziness.Auto` el parámetro permite una aproximación de los parámenes (e.gM SK2 manipular typos menoresMSC3

3. **El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.**:
   
   - El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `Skip` La metodología supera el primer `n` Los resultados dependen del número de página, calculado como `(page - 1) * pageSize`. Esto ayuda a navegar por los resultados de las paginas.
   - El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. `Size` La metodología limita el número de documentos que se devolven al especificado `pageSize`.

4. **En la misma sesión, el Consejo aprobó el proyecto de resolución A/C.2/57/L.20 sin someterlo a votación (véase párr.**:
   
   - Si la consulta falla, se registra un error y se devolve una lista vacía.

5. **El Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos estadísticos desglosados por sexo, edad y origen étnico.**:
   
   - La metodología devolve una lista de `BlogIndexModel` Documentos compatibles con los criterios de búsqueda.

Así que usted puede ver que podemos ser super flexibles en cuanto a cómo buscamos nuestros datos. Podemos buscar campos específicos, podemos impulsar determinados camposM SK2 incluso podemos buscar por múltiples índicesMSC3

Una ventaja BIG es la facilidad qith que podemos apoyar múltiples idiomas. Tenemos un índice diferente para cada idioma y habilitamos la búsqueda dentro de ese índiceM SK1 Esto significa que podemos usar el analizador correcto para cada lengua y obtener los mejores resultados.

## El nuevo API de búsqueda

En contraste con la API de búsqueda que vimos en las partes anteriores de esta serie, podemos simplificar enormemente el proceso de búsqueda usando OpenSearch. simplemente podemos lanzar un texto a esta consulta y obtener grandes resultados de vueltaM SK2

```csharp
   [HttpGet]
    [Route("osearch/{query}")]
   [ValidateAntiForgeryToken]
    public async Task<JsonHttpResult<List<SearchResults>>> OpenSearch(string query, string language = MarkdownBaseService.EnglishLanguage)
    {
        var results = await indexService.GetSearchResults(language, query);
        
        var host = Request.Host.Value;
        var output = results.Select(x => new SearchResults(x.Title.Trim(), x.Slug, @Url.ActionLink("Show", "Blog", new{ x.Slug}, protocol:"https", host:host) )).ToList();
        return TypedResults.Json(output);
    }
```

Como usted puede ver, tenemos todos los datos que necesitamos en el índice para devolver los resultados. Podemos entonces usarlo para generar una URL al post de blogM SK1 Esto elimina la carga de nuestra base de datos y hace que el proceso de búsqueda sea mucho más rápido.

## El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

En este post vimos cómo escribir un cliente C# para interactuar con nuestra instancia OpenSearch.