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

Alpine 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.

Wednesday, 21 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.

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. Te he mostrado cómo configurar una búsqueda de texto completo usando las capacidades de búsqueda de textos completos incorporadas en Postgres. Mientras exponía un api de búsqueda no tenía'a modo de usarlo realmente, así que ...se trataba de un poco de teaseM SK3 En este artículo te mostraré cómo usar el api de busca para buscar texto en tu base de datosMSC5

Artículos anteriores de esta serie:

Otros componentes de esta serie:

Esto añadirá una pequeña caja de búsqueda al encabezamiento del sitio que permitirá a los usuarios buscar texto en los mensajes de blog.

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.

Nota: El elefante en la sala es que yo no considero la mejor manera de hacer esto . Para apoyar multiM SK2la lengua es super compleja (IMSC4d necesitaremos una columna diferente por idiomaMska5 y IMSKA6d necesitamos manejar las cuestiones relacionadas con la terminación y otras cosas específicas de la lenguaM Ska7 I‘Mska8vo a ignorar esto por ahora y limitarme a concentrarme en el inglésM ska9 LATER nosotrosMaskan10 mostraremos cómo manejar esto en OpenSearchMskai11

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.

Para añadir una capacidad de búsqueda he tenido que hacer algunos cambios a la búsqueda api. He agregado manipulación para frases usando el EF.Functions.WebSearchToTsQuery("english", processedQuery)

    private async Task<List<(string Title, string Slug)>> GetSearchResultForQuery(string query)
    {
        var processedQuery = query;
        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.WebSearchToTsQuery("english", processedQuery)) // Use precomputed SearchVector for title and content
                || x.Categories.Any(c =>
                    EF.Functions.ToTsVector("english", c.Name)
                        .Matches(EF.Functions.WebSearchToTsQuery("english", processedQuery)))) // Search in categories
                && x.LanguageEntity.Name == "en")// Filter by language
            
            .OrderByDescending(x =>
                // Rank based on the precomputed SearchVector
                x.SearchVector.Rank(EF.Functions.WebSearchToTsQuery("english", processedQuery))) // Use precomputed SearchVector for ranking
            .Select(x => new { x.Title, x.Slug,  })
            .Take(5)
            .ToListAsync();
        return posts.Select(x=> (x.Title, x.Slug)).ToList();
    }

Esto se usa de forma opcional cuando existe un espacio en la consulta'.

    if (!query.Contains(" "))
        {
            posts = await GetSearchResultForComplete(query);
        }
        else
        {
            posts = await GetSearchResultForQuery(query);
        }

De lo contrario, utilizo el método de búsqueda existente que añade el caracter prefixal.

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

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 el empleo, incluida la eliminación del trabajo forzoso.

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 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. He hecho un simple control parcial que proporciona una caja de búsqueda super sencilla.

<div x-data="window.mostlylucid.typeahead()" class="relative"    x-on:click.outside="results = []">

    <label class="input input-sm dark:bg-custom-dark-bg bg-white input-bordered flex items-center gap-2">
       
        
        <input
            type="text"
            x-model="query"

            x-on:input.debounce.300ms="search"
            x-on:keydown.down.prevent="moveDown"
            x-on:keydown.up.prevent="moveUp"
            x-on:keydown.enter.prevent="selectHighlighted"
            placeholder="Search..."
            class="border-0 grow  input-sm text-black dark:text-white bg-transparent w-full"/>
        <i class="bx bx-search"></i>
    </label>
    <!-- Dropdown -->
    <ul x-show="results.length > 0"
        class="absolute z-10 my-2 w-full bg-white dark:bg-custom-dark-bg border border-1 text-black dark:text-white border-b-neutral-600 dark:border-gray-300   rounded-lg shadow-lg">
        <template x-for="(result, index) in results" :key="result.slug">
            <li
                x-on:click="selectResult(result)"
                :class="{
                    'dark:bg-blue-dark bg-blue-light': index === highlightedIndex,
                    'dark:hover:bg-blue-dark hover:bg-blue-light': true
                }"
                class="cursor-pointer text-sm p-2 m-2"
                x-text="result.title"
            ></li>
        </template>
    </ul>
</div>

Esto tiene una gran cantidad de clases CSS para render correctamente para el modo oscuro o claro. El código Alpine.js es bastante sencilloM SK2 Es un simple control de typeahead que llama al api de búsqueda cuando el usuario teclea en la casilla de búsqueda. También tenemos un pequeño código para manejar el desfoque para cerrar los resultados de búsqueda.

   x-on:click.outside="results = []"

Notamos que tenemos un debounce aquí para evitar golpear al servidor con solicitudes.

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.

Esto llama a nuestra función JS (definida en src/js/main.js)

window.mostlylucid = window.mostlylucid || {};

window.mostlylucid.typeahead = function () {
    return {
        query: '',
        results: [],
        highlightedIndex: -1, // Tracks the currently highlighted index

        search() {
            if (this.query.length < 2) {
                this.results = [];
                this.highlightedIndex = -1;
                return;
            }

            fetch(`/api/search/${encodeURIComponent(this.query)}`)
                .then(response => response.json())
                .then(data => {
                    this.results = data;
                    this.highlightedIndex = -1; // Reset index on new search
                });
        },

        moveDown() {
            if (this.highlightedIndex < this.results.length - 1) {
                this.highlightedIndex++;
            }
        },

        moveUp() {
            if (this.highlightedIndex > 0) {
                this.highlightedIndex--;
            }
        },

        selectHighlighted() {
            if (this.highlightedIndex >= 0 && this.highlightedIndex < this.results.length) {
                this.selectResult(this.results[this.highlightedIndex]);
            }
        },

        selectResult(result) {
           window.location.href = result.url;
            this.results = []; // Clear the results
            this.highlightedIndex = -1; // Reset the highlighted index
        }
    }
}

Como usted puede ver esto es bastante simple (mucha de la complejidad está manejando las teclas arriba y abajo para seleccionar los resultados). Este post a nuestro SearchApi Cuando se selecciona un resultado, navegamos a la URL del resultado.

     search() {
            if (this.query.length < 2) {
                this.results = [];
                this.highlightedIndex = -1;
                return;
            }

            fetch(`/api/search/${encodeURIComponent(this.query)}`)
                .then(response => response.json())
                .then(data => {
                    this.results = data;
                    this.highlightedIndex = -1; // Reset index on new search
                });
        },

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.

También he cambiado la descarga para trabajar con HTMX, esto simplemente cambia el search method to use a HTMX refresh:

    selectResult(result) {
    htmx.ajax('get', result.url, {
        target: '#contentcontainer',  // The container to update
        swap: 'innerHTML', // Replace the content inside the target
    }).then(function() {
        history.pushState(null, '', result.url); // Push the new url to the history
    });

    this.results = []; // Clear the results
    this.highlightedIndex = -1; // Reset the highlighted index
    this.query = ''; // Clear the query
}

Nota que intercambiamos el HTML interno del contentcontainer con el resultado de la búsqueda. Esta es una manera sencilla de actualizar el contenido de la página con el resulte de la busca sin que se actualice la página. También cambiamos el URL en la historia al nuevo url.

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.

Esto añade una potente pero sencilla capacidad de búsqueda al sitio. Es un gran modo para ayudar a los usuarios a encontrar lo que buscan Esto da a este sitio una sensación más profesional y facilita la navegación.

logo

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