Back to "La Comisión Consultiva observa con preocupación que, a pesar de los esfuerzos realizados por el Departamento de Operaciones de Mantenimiento de la Paz y la Oficina del Alto Comisionado de las Naciones Unidas para los Refugiados (ACNUR), el número de refugiados sigue siendo insuficiente."

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

Entity Framework Postgres

La Comisión Consultiva observa con preocupación que, a pesar de los esfuerzos realizados por el Departamento de Operaciones de Mantenimiento de la Paz y la Oficina del Alto Comisionado de las Naciones Unidas para los Refugiados (ACNUR), el número de refugiados sigue siendo insuficiente.

Tuesday, 20 August 2024

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 de contenido es una parte crítica de cualquier sitio web de contenido pesado. Mejora la detectabilidad y experiencia del usuarioM SK1 En este post I' abordené cómo he agregado la búsqueda de texto completo para este sitio

Otros componentes de esta serie:

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.

Hay' una serie de formas para hacer búsqueda de texto completo, incluyendo

  1. Simplemente Buscando una estructura de datos en memoria (como una lista), esto es relativamente sencillo de implementar pero no se Scala bien
  2. Utilización de una base de datos como SQL Server o Postgres. Aunque esto funciona y tiene soporte de casi todos los tipos de bases de datos, no es siempre la mejor solución para estructuras de datos más complejas o preguntas complejadas.
  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. o SQLite FTS. Esta es una base intermedia entre las dos soluciones anteriores. Es más complejo que sólo buscar una lista, pero menos complejo que una solución de base de datos completaM SK3 Sin embargo ; esMSC5 sigue siendo bastante complejo para implementar Mska6especialmente para ingestión de datosMske7 y no Scale as well as a a la solución de búsqueda completa. En realidad muchas otras tecnologías de búsqueda Use Lucene under the hood for es'su increíbles capacidades de búsqueda vectorial.
  4. Usando un motor de búsqueda como ElasticSearch, OpenSearch o Azure Search. Esta es la solución más compleja M SK2 de recursos intensivos pero también la más poderosaMSC3 Es también la mas escalable y puede manejar consultas complejas con facilidad . YoMスク6 voy a entrar en una profundidad inmensa en la próxima semana o así sobre cómo configurar y usar OpenSearch desde C#.

La base de datos de búsqueda del texto completo con Postgres

En este blog ' he pasado recientemente a usar Postgres para mi base de datos. Postgres tiene una función de búsqueda de texto completo que es muy potente y (somewhatMSC3 fácil de usarM SK4 Es también muy rápido y puede manejar preguntas complejas con facilidadMST6

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. DbContext puede especificar qué campos tienen la función de búsqueda completa de texto habilitada.

Postgres utiliza el concepto de vectores de búsqueda para lograr una búsqueda rápida, eficiente de texto completo. Un vector de búsqueda es una estructura de datos que contiene las palabras en un documento y sus posiciones. Para ello se utilizan dos tipos de datos especiales:

  • TSVector: Un tipo de datos PostgreSQL especial que almacena una lista de lexemas (considera como un vector de palabras ). Es la versión indexada del documento utilizado para la búsqueda rápidaM SK3
  • TSQuery: Otro tipo de datos especial que almacena la consulta de búsqueda, que incluye los términos de búsqueda y los operadores lógicos M SK2como AND , OMST4 NOMst5

Además, ofrece una función de clasificación que le permite clasificar los resultados en función del grado de concordancia con la pregunta de búsqueda. Esto es muy potente y le permite ordenar los resultados por relevancia. PostgreSQL atribuye una clasificación a los resultados basada en la relevancia. La relevancia se calcula teniendo en cuenta factores como la cercanía de los términos de búsqueda entre sí y la frecuencia con que aparecen en el documento Se utilizan las funciones ts_rank o ts _rankM SK2cd para calcular esta clasificación.

Puede leer más sobre las características de búsqueda del texto completo de Postgres a) Adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en todos los ámbitos de la vida, incluida la educación;

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 paquete de marco de Entidades Postgres a) Adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre hombres y mujeres en todos los ámbitos de la vida, incluida la educación; proporciona soporte potente para la búsqueda de textos completos. Le permite especificar qué campos son indexados de texto completo y cómo hacerles preguntas.

Para ello, añademos tipos específicos de índices a nuestras Entidades tal y como se define en DbContext:

   modelBuilder.Entity<BlogPostEntity>(entity =>
        {
            entity.HasIndex(x => new { x.Slug, x.LanguageId });
            entity.HasIndex(x => x.ContentHash).IsUnique();
            entity.HasIndex(x => x.PublishedDate);

                entity.HasIndex(b => new { b.Title, b.PlainTextContent})
                .HasMethod("GIN")
                .IsTsVectorExpressionIndex("english");
  ...

En el cuadro siguiente se muestran los resultados de las encuestas realizadas por la Oficina del Alto Comisionado de las Naciones Unidas para los Refugiados (ACNUR) durante el período comprendido entre el 1° de julio y el 31 de diciembre de 2004. Title 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. PlainTextContent 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. BlogPostEntityEl 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. GIN a) Informe de la Comisión Consultiva en Asuntos Administrativos y de Presupuesto; english language. Esto es importante porque dice a Postgres cómo indexar los datos y qué lenguaje usar para detener y detener palabras.

Esto es obviamente una cuestión para nuestro blog ya que tenemos múltiples idiomas. Desgraciadamente por ahora I'm solo usa el english idioma para todos los puestos. Esto es algo que yo ' tendré que abordar en el futuro, pero por ahora funciona bastante bien.

También añadiremos un índice a nuestro sitio web. Category 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.

     modelBuilder.Entity<CategoryEntity>(entity =>
        {
            entity.HasIndex(b => b.Name).HasMethod("GIN").IsTsVectorExpressionIndex("english");;
...

Al hacerlo, Postgres genera un vector de búsqueda para cada fila en la base de datos. Este vector contiene las palabras en el Title 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. PlainTextContent fields. Podemos usar este vector para buscar palabras en el documento.

Esto se traduce en una función de to_tsvector en SQL que genera el vector de búsqueda para la fila. Podemos entonces usar la función tsM SK2rank para clasificar los resultados en función de la relevancia

SELECT to_tsvector('english', 'a fat  cat sat on a mat - it ate a fat rats');
to_tsvector
-----------------------------------------------------
'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4

Aplicarlo como una migración a nuestra base de datos y nosotros'estamos preparados para iniciar la búsqueda.

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, incluida la eliminación de la discriminación por motivos de raza, color, sexo, idioma, religión o creencias.

El Comité recomienda al Estado Parte que 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.

Para buscar utilizaremos el EF.Functions.ToTsVector 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. EF.Functions.WebSearchToTsQuery Funciones para crear un vector de búsqueda y consulta. Podemos entonces usar el Matches Función para buscar la consulta en el vector de búsqueda.

  var posts = await context.BlogPosts
            .Include(x => x.Categories)
            .Include(x => x.LanguageEntity)
            .Where(x =>
                EF.Functions.ToTsVector("english", x.Title + " " + x.PlainTextContent)
                    .Matches(EF.Functions.WebSearchToTsQuery("english", query)) // Search in title and content
                && x.Categories.Any(c =>
                    EF.Functions.ToTsVector("english", c.Name)
                        .Matches(EF.Functions.WebSearchToTsQuery("english", query))) // Search in categories
                && x.LanguageEntity.Name == "en") // Filter by language
            .OrderByDescending(x =>
                EF.Functions.ToTsVector("english", x.Title + " " + x.PlainTextContent)
                    .Rank(EF.Functions.WebSearchToTsQuery("english", query))) // Rank by relevance
            .Select(x => new { x.Title, x.Slug })
            .ToListAsync();
       

La función EF.Functions.WebSearchToTsQuery genera la consulta para la fila basada en la sintáctica común del motor de búsqueda webM SK2

SELECT websearch_to_tsquery('english', '"sad cat" or "fat rat"');
       websearch_to_tsquery
-----------------------------------
 'sad' <-> 'cat' | 'fat' <-> 'rat'

En este ejemplo se puede ver que genera una consulta que busca las palabras "sad catM SK1 o "fat rat" en el documentoMSC4 Esta es una característica poderosa que nos permite buscar preguntas complejas con facilidad.

Como se ha dicho en befpre, estos métodos generan tanto el vector de búsqueda como la consulta para la fila.. Matches Función para buscar la consulta en el vector de búsqueda. También podemos usar Rank La Comisión Consultiva en Asuntos Administrativos y de Presupuesto examinó el proyecto de presupuesto por programas para el bienio 2002-2003 (A/60/6 (Sect.

Como usted puede ver este no es una simple consulta, pero es muy potente y nos permite buscar palabras en el Title, PlainTextContent 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. Category 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. BlogPostEntity 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 Comisión Consultiva en Asuntos Administrativos y de Presupuesto examinó el proyecto de presupuesto por programas para el bienio 2002-2003 (A/60/6 (Sect.

Para usar estos (en el futuro) podemos crear un simple punto final WebAPI que toma una consulta y devolve los resultadosM SK2 Este es un simple controlador que toma la consulta y restituye los resultados

[ApiController]
[Route("api/[controller]")]
public class SearchApi(IMostlylucidDbContext context) : ControllerBase
{
    [HttpGet]
    public async Task<JsonHttpResult<List<SearchResults>>> Search(string query)
    {;

        var posts = await context.BlogPosts
            .Include(x => x.Categories)
            .Include(x => x.LanguageEntity)
            .Where(x =>
                EF.Functions.ToTsVector("english", x.Title + " " + x.PlainTextContent)
                    .Matches(EF.Functions.WebSearchToTsQuery("english", query)) // Search in title and content
                && x.Categories.Any(c =>
                    EF.Functions.ToTsVector("english", c.Name)
                        .Matches(EF.Functions.WebSearchToTsQuery("english", query))) // Search in categories
                && x.LanguageEntity.Name == "en") // Filter by language
            .OrderByDescending(x =>
                EF.Functions.ToTsVector("english", x.Title + " " + x.PlainTextContent)
                    .Rank(EF.Functions.WebSearchToTsQuery("english", query))) // Rank by relevance
            .Select(x => new { x.Title, x.Slug })
            .ToListAsync();
        
        var output = posts.Select(x => new SearchResults(x.Title.Trim(), x.Slug)).ToList();
        
        return TypedResults.Json(output);
    }

La Comisión Consultiva recomienda que el Secretario General apruebe el siguiente proyecto de resolución:

Un enfoque alternativo para usar estos 'simpleM SK1 Indices de TsVector es utilizar una columna generada para almacenar el Vector de búsqueda y luego usarlo para buscar. Este es un enfoque más complejo, pero permite una mejor rendimiento . 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 la presente resolución. BlogPostEntity para añadir un tipo especial de columna:

   [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public NpgsqlTsVector SearchVector { get; set; }

Esta es una columna computada que genera el vector de búsqueda para la fila. Podemos entonces usar esta columna para buscar palabras en el documento.

Luego instalamos este índice dentro de nuestra definición de entidad ( aún para confirmar, pero esto también puede permitirnos tener múltiples idiomas especificando una columna de idiomas para cada post).

   entity.Property(b => b.SearchVector)
                .HasComputedColumnSql("to_tsvector('english', coalesce(\"Title\", '') || ' ' || coalesce(\"PlainTextContent\", ''))", stored: true);

Usted'verá aquí que utilizamos HasComputedColumnSql para especificar explícitamente la función PostGreSQL para generar el vector de búsqueda. También especificamos que la columna está almacenada en la base de datos. Esto es importante ya que dice a Postgres que almacena el vektor de búsqueda en la Base de datos

En la base de datos esto generó este para cada fila, que son los 'lexemesM SK2 en el documento y sus posiciones :

"'1992':464 '1996':468 '20':480 '200':115 '2007':426 '2009':428 '2012':88 '2015':397 '2018':370 '2020':372 '2021':288,327,329,399 '2022':196,243,245,290 '2024':156,158,198 '25':21,477,486,522 '3d':346 '6':203,256 '8':179,485 '90':120,566 'ab':282 'access':221 'accomplish':14 'achiev':118 'across':60 'adapt':579 'advanc':134 'applic':168,316,526 'apr':155,197 'architect':83,97,159 'architectur':307,337 ...

La Comisión Consultiva en Asuntos Administrativos y de Presupuesto examinó el proyecto de presupuesto por programas para el bienio 2006-2007 (A/60/6 (Sect.

A continuación podemos utilizar esta columna para buscar palabras en el documento. Podemos usar la Matches Función para buscar la consulta en el vector de búsqueda. También podemos usar Rank La Comisión Consultiva en Asuntos Administrativos y de Presupuesto examinó el proyecto de presupuesto por programas para el bienio 2002-2003 (A/60/6 (Sect.

       var posts = await context.BlogPosts
            .Include(x => x.Categories)
            .Include(x => x.LanguageEntity)
            .Where(x =>
                // Search using the precomputed SearchVector
                x.SearchVector.Matches(EF.Functions.ToTsQuery("english", query + ":*")) // Use precomputed SearchVector for title and content
                && x.Categories.Any(c =>
                    EF.Functions.ToTsVector("english", c.Name)
                        .Matches(EF.Functions.ToTsQuery("english", query + ":*"))) // Search in categories
                && x.LanguageEntity.Name == "en") // Filter by language
            .OrderByDescending(x =>
                // Rank based on the precomputed SearchVector
                x.SearchVector.Rank(EF.Functions.ToTsQuery("english", query + ":*"))) // Use precomputed SearchVector for ranking
            .Select(x => new { x.Title, x.Slug })
            .ToListAsync();

Usted'l aquí vemos que también utilizamos un constructor de consulta diferente EF.Functions.ToTsQuery("english", query + ":*") que nos permite ofrecer una funcionalidad de tipo TypeAhead ( en la cual podemos escribir eM SK1g. 'catMSC4 y obtener SSK5cat≥', | | 'cats |', \ 'caterpillar | МSK10 | etc |

Además, nos permite simplificar la pregunta principal del post de blog para simplemente buscar la pregunta en el SearchVector column. Esta es una característica poderosa que nos permite buscar palabras en el Title, PlainTextContent. Seguimos utilizando el índice que hemos mostrado anteriormente para la CategoryEntity.

x.Categories.Any(c =>
                    EF.Functions.ToTsVector("english", c.Name)
                        .Matches(EF.Functions.ToTsQuery("english", query + ":*"))) 

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. Rank Función para clasificar los resultados por relevancia basada en la pregunta.

 x.SearchVector.Rank(EF.Functions.ToTsQuery("english", query + ":*")))

Esto nos permite utilizar el punto final como sigue, donde podemos pasar en las primeras letras de una palabra y recuperar todos los mensajes que coincidan con esa palabra:

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 las medidas adoptadas por los Estados Miembros para cumplir sus obligaciones financieras con arreglo a la presente resolución. API en acción aquí 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. /api/SearchApi. Swagger para este sitio ha sido habilitado para que puedas ver la API en acción, pero en la mayoría de los casos debería reservarse para `IsDevelopment()).

El Grupo de Trabajo tal vez desee tomar nota del informe de la Comisión Consultiva en Asuntos Administrativos y de Presupuesto.

En el futuro I' añadiré una función TypeAhead a la casilla de búsqueda del sitio que utiliza esta funcionalidad.

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.

Usted puede ver que es'es posible obtener una potente funcionalidad de búsqueda usando Postgres y Cadre de Entidades . Sin embargo, tiene complicaciones y limitaciones que debemos tener en cuenta (como la cosa de la lenguaM SK3 En la parte siguiente IMSC4cubreremos cómo nosotrosMska5d hacemos esto utilizando OpenSearch Mska6 que tiene una tonelada más de configuración pero es más potente y escalable M Ska7

logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.