[Resuelto] Crear buscador en web sin usar CMS AYUDA

Iniciado por JuisitoFelix, 16 Marzo 2020, 11:56 AM

0 Miembros y 2 Visitantes están viendo este tema.

JuisitoFelix

Buenos días a todos y feliz cuarentena!  ;-)

Llevo poco tiempo en este mundillo del desarrollo web y me ha surgido unas dudas:
- Las páginas web que tienen buscadores internos para buscar contenido propios de su web como crean ese buscador web
normalmente. ¿Cuál es la práctica más extendida? Un plugin de jQuery? php? ....
- El resultado de esta busqueda se indexa en Google, me explico, si en mi web buscan perros y eso general un resultado de 10 elementos. Si
alguien pone en google "nombredemiweb perros" Google indexa ese resultado de mi web en sus resultados de busquedas. En caso de hacerlo
como puedo evitarlo?
- Sabéis la existencia de foros de programación y SEO para poder preguntar estas dudas que me surgen, tambien me
interesaría grupos de telegram de esta temática. Actualmente estoy en stackoverflow y forobeta (aunque este han puesto el
registro pagando)

Gracias a todos por vuestras respuestas!

Un saludo desde mi bunker  :silbar:

WHK

Hola,

CitarLas páginas web que tienen buscadores internos para buscar contenido propios de su web como crean ese buscador web normalmente. ¿Cuál es la práctica más extendida? Un plugin de jQuery? php? ....

Bases de datos, consultas SQL a tablas desnormalizadas e indexadas con frases cortas o apache solr:

https://www.mysqltutorial.org/mysql-like/
https://rubygarage.org/blog/database-denormalization-with-examples
https://dev.mysql.com/doc/refman/5.7/en/query-cache.html
https://www.w3resource.com/mysql/mysql-full-text-search-functions.php
https://www.digitalocean.com/community/tutorials/how-to-improve-database-searches-with-full-text-search-in-mysql-5-6-on-ubuntu-16-04
https://stackoverflow.com/questions/2526772/search-for-string-within-text-column-in-mysql

https://lucene.apache.org/solr/
https://www.php.net/manual/es/book.solr.php

CitarEl resultado de esta busqueda se indexa en Google, me explico, si en mi web buscan perros y eso general un resultado de 10 elementos. Si alguien pone en google "nombredemiweb perros" Google indexa ese resultado de mi web en sus resultados de busquedas. En caso de hacerlo como puedo evitarlo?

Con robots.txt : https://www.hostinger.com/tutorials/website/how-to-block-search-engines-using-robotstxt

CitarSabéis la existencia de foros de programación y SEO para poder preguntar estas dudas que me surgen, tambien me interesaría grupos de telegram de esta temática. Actualmente estoy en stackoverflow y forobeta (aunque este han puesto el registro pagando)

Ya estás en los mejores lugares, no conozco otro foro mejor para preguntar cosas de seo que forobeta.

Saludos.

JuisitoFelix

Cita de: WHK en 16 Marzo 2020, 19:39 PM

Muchisimas gracias por las respuestas todo muy claro y conciso  ;-)

@XSStringManolo

Cuando quieren añadir las búsquedas en Google o navegadores usan get con un servidor. Entonces se realizan las búsquedas a partir de la url. Ejemplo, quiero buscas coches en google. https://google.com/search?q=coches

Si quieres hacerlo interno en la web puedes hacerlo a tu p**a bola. Mira otras páginas y analiza como lo hacen.

Aquí te dejo un ejemplo de tutorialzine que me descargué hoy y me gustó mucho. Usa vue.js y css pero lo puedes implementar perfectamente en javascript vanilla sin mucha complicación.
Código (javascript) [Seleccionar]
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Vue.js Instant Search</title>

   
    <style>
    /* Hide un-compiled mustache bindings
    until the Vue instance is ready */

    [v-cloak] {
      display: none;
    }

    *{
        margin:0;
        padding:0;
    }

    body{
        font:15px/1.3 'Open Sans', sans-serif;
        color: #5e5b64;
        text-align:center;
    }

    a, a:visited {
        outline:none;
        color:#389dc1;
    }

    a:hover{
        text-decoration:none;
    }

    section, footer, header, aside, nav{
        display: block;
    }


    /*-------------------------
        The search input
    --------------------------*/

    .bar{
        background-color:#5c9bb7;

        background-image:-webkit-linear-gradient(top, #5c9bb7, #5392ad);
        background-image:-moz-linear-gradient(top, #5c9bb7, #5392ad);
        background-image:linear-gradient(top, #5c9bb7, #5392ad);

        box-shadow: 0 1px 1px #ccc;
        border-radius: 2px;
        width: 400px;
        padding: 14px;
        margin: 45px auto 20px;
        position:relative;
    }

    .bar input{
        background:#fff no-repeat 13px 13px;
        background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkU5NEY0RTlFMTA4NzExRTM5RTEzQkFBQzMyRjkyQzVBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkU5NEY0RTlGMTA4NzExRTM5RTEzQkFBQzMyRjkyQzVBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RTk0RjRFOUMxMDg3MTFFMzlFMTNCQUFDMzJGOTJDNUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RTk0RjRFOUQxMDg3MTFFMzlFMTNCQUFDMzJGOTJDNUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4DjA/RAAABK0lEQVR42pTSQUdEURjG8dOY0TqmPkGmRcqYD9CmzZAWJRHVRIa0iFYtM6uofYaiEW2SRJtEi9YxIklp07ZkWswu0v/wnByve7vm5ee8M+85zz1jbt9Os+WiGkYdYxjCOx5wgFeXUHmtBSzpcCGa+5BJTCjEP+0nKWAT8xqe4ArPGEEVC1hHEbs2oBwdXkM7mj/JLZrad437sCGHOfUtcziutuYu2v8XUFF/4f6vMK/YgAH1HxkBYV60AR31gxkBYd6xAeF3VzMCwvzOBpypX8V4yuFRzX2d2gD/l5yjH4fYQEnzkj4fae5rJulF2sMXVrAsaTWttRFu4Osb+1jEDT71/ZveyhouTch2fINQL9hKefKjuYFfuznXWzXMTabyrvfyIV3M4vhXgAEAUMs7K0J9UJAAAAAASUVORK5CYII=);

        border: none;
        width: 100%;
        line-height: 19px;
        padding: 11px 0;

        border-radius: 2px;
        box-shadow: 0 2px 8px #c4c4c4 inset;
        text-align: left;
        font-size: 14px;
        font-family: inherit;
        color: #738289;
        font-weight: bold;
        outline: none;
        text-indent: 40px;
    }

    ul{
        list-style: none;
        width: 428px;
        margin: 0 auto;
        text-align: left;
    }

    ul li{
        border-bottom: 1px solid #ddd;
        padding: 10px;
        overflow: hidden;
    }

    ul li img{
        width:60px;
        height:60px;
        float:left;
        border:none;
    }

    ul li p{
        margin-left: 75px;
        font-weight: bold;
        padding-top: 12px;
        color:#6e7a7f;
    }
    </style>

</head>
<body>

<form id="main" v-cloak>

    <div class="bar">
        <!-- Create a binding between the searchString model and the text field -->

        <input type="text" v-model="searchString" placeholder="Enter your search terms" />
    </div>

    <ul>
        <!-- Render a li element for every entry in the computed filteredArticles array. -->
             
        <li v-for="article in filteredArticles">
            <a v-bind:href="article.url"><img v-bind:src="article.image" /></a>
            <p>{{article.title}}</p>
        </li>
    </ul>

</form>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.5/vue.min.js"></script>
<script>

var demo = new Vue({
    el: '#main',
    data: {
        searchString: "",

        // The data model. These items would normally be requested via AJAX,
        // but are hardcoded here for simplicity.

        articles: [
            {
                "title": "What You Need To Know About CSS Variables",
                "url": "http://tutorialzine.com/2016/03/what-you-need-to-know-about-css-variables/",
                "image": "http://cdn.tutorialzine.com/wp-content/uploads/2016/03/css-variables-100x100.jpg"
            },
            {
                "title": "Freebie: 4 Great Looking Pricing Tables",
                "url": "http://tutorialzine.com/2016/02/freebie-4-great-looking-pricing-tables/",
                "image": "http://cdn.tutorialzine.com/wp-content/uploads/2016/02/great-looking-pricing-tables-100x100.jpg"
            },
            {
                "title": "20 Interesting javascript and CSS Libraries for February 2016",
                "url": "http://tutorialzine.com/2016/02/20-interesting-javascript-and-css-libraries-for-february-2016/",
                "image": "http://cdn.tutorialzine.com/wp-content/uploads/2016/02/interesting-resources-february-100x100.jpg"
            },
            {
                "title": "Quick Tip: The Easiest Way To Make Responsive Headers",
                "url": "http://tutorialzine.com/2016/02/quick-tip-easiest-way-to-make-responsive-headers/",
                "image": "http://cdn.tutorialzine.com/wp-content/uploads/2016/02/quick-tip-responsive-headers-100x100.png"
            },
            {
                "title": "Learn SQL In 20 Minutes",
                "url": "http://tutorialzine.com/2016/01/learn-sql-in-20-minutes/",
                "image": "http://cdn.tutorialzine.com/wp-content/uploads/2016/01/learn-sql-20-minutes-100x100.png"
            },
            {
                "title": "Creating Your First Desktop App With HTML, JS and Electron",
                "url": "http://tutorialzine.com/2015/12/creating-your-first-desktop-app-with-html-js-and-electron/",
                "image": "http://cdn.tutorialzine.com/wp-content/uploads/2015/12/creating-your-first-desktop-app-with-electron-100x100.png"
            }
        ]
    },
    computed: {
        // A computed property that holds only those articles that match the searchString.
        filteredArticles: function () {
            var articles_array = this.articles,
                searchString = this.searchString;

            if(!searchString){
                return articles_array;
            }

            searchString = searchString.trim().toLowerCase();

            articles_array = articles_array.filter(function(item){
                if(item.title.toLowerCase().indexOf(searchString) !== -1){
                    return item;
                }
            })

            // Return an array with the filtered data.
            return articles_array;;
        }
    }
});
</script>
</body>
</html>


WHK

Personalmente no te recomiendo que lo hagas vía javascript con valores en memoria como el ejemplo de @XSStringManolo porque si tienes 500 posts tendrás que cargar los 500 temas completos en memoria ram para realizar las búsquedas. Cargar todas las paginas en una sola petición y mandarlas todas a variables de javascript es una locura.

Es mucho mas recomendable realizar una petición post común y corriente a traves de unformulario y desde php realizar la búsqueda en la base de datos, de esta manera no sobrecargas el navegador ni al servidor ya que para eso existen las indexaciones de contenido y la desnormalizaicón de datos.

Lo que algunos hacen a traves de javascript es traer posibles resultados desde una solicitud REST vía json pero puede que te complique mucho más la existencia si aun no manejas esos conceptos.

Cuando hagas un buscador de contenido te toparás con problemas muy comunes, por ejemplo, el paginador, límites de contenido, tipo de permisos para ver contenido y que tipo de contenido buscar, realizar busquedas en multiples tablas de posibles resultados, ahi tendrás que desnormalizar utilizando una columna con el identificador de la columna donde debes ir a buscar el valor final o simplemente tener un buscador por separado de cada tipo de dato, evitar denegaciones de servicio por exceso de consultas y sobrecarga de datos, etc.

El camino para crear un buen buscador sin errores es dificil, yo te recomiendo el camino fácil el cual es utilizar algún framework conocido ya que muchos integran por defecto buscadores o paginadores de resultados como active record de codeigniter para php.

Mira etso: https://www.guru99.com/codeigniter-pagination.html

Saludos.