Usare AND/OR nella ricerca dei post per Tags

di il
6 risposte

Usare AND/OR nella ricerca dei post per Tags

Buongiorno, ho un problema che non so risolvere: ho un'applicazione molto semplice con un classico modulo di ricerca che estrae elementi dal database dando come chiavi di ricerca una stringa con tutti i tags richiesti.
Ora però vorrei che alcuni tags funzionassero per richiamare gli elementi, mentre altri servissero a selezionare quanto trovato.

Mi spiego meglio con un esempio.
Ho un blog di ricette di cucina: ipotizziamo che tutte le ricette siano state inserite con due tag di cui uno che indichi se è un primo piatto o un secondo o un dolce ed un ulteriore tag per indicare il principale ingrediente (per i primi ad es fettuccine o riso o pizza).
Al momento facendo una ricerca sui tags "primi piatti, fettuccine, secondi, dolci" ottengo banalmente tutti i post che hanno come tags quelli da me indicati.
Invece io vorrei modificare la ricerca facendo in modo che il tag "fettuccine" servisse a selezionare all'interno della categoria "primi piatti" solo i post che riguardano i primi piatti con fettuccine.
Dato per scontato che il sistema è in grado di riconoscere quali tag si riferiscono al numero di portata e quali quelli che si riferiscono all'ingrediente, vorrei passare da una ricerca
("Primi piatti" OR "fettuccine" OR "secondi" OR "dolci") ad una più selettiva del tipo [("primi piatti" AND "fettuccine") OR "secondi piatti" OR "dolci"].
In pratica quando in una ricetta viene letto il tag "primi piatti" viene controllato anche se è presente il tag "fettuccine".

È possibile scrivere una stringa si codice MySQL che contenga una selezione AND/OR nel campo di ricerca?
E come si scrive?
Grazie

6 Risposte

  • Re: Usare AND/OR nella ricerca dei post per Tags

    Per la domanda la risposta è sì, ed è esattamente come l'hai scritta.
    Invece non mi è chiarissima la semantica che attribuisci a "tag"
  • Re: Usare AND/OR nella ricerca dei post per Tags

    Innanzitutto grazie M2 per avermi risposto: sono un po' incasinato con questa applicazione (che ho "ereditato") e non so come sistemare questa cosa.

    Purtroppo c'è stato un qui pro quo con il precendente programmatore ingaggiato per creare questa applicazione e così il sistema dei tag è stato investito di una funzionalità che in realtà non è proprio la sua.
    Infatti invece di mettere una coppia di selettori "primo/secondo/terzo piatto" e "fettuccine/pizza/lasagna", hanno usato il sistema dei tags pensando che questo bastasse a selezionare in maniera "completa".
    Esempio:

    Ogni ricetta ha 2 tags:
    - il primo tag riguarda il "numero di portata" (primo/secondo/contorno/dolce)
    - il secondo tag riguarda l'ingradiente (ad es. per i primi piatti è "pasta/pizza/lasagna")
    Ovviamente nel database i tag sono (PER FORTUNA!) categorizzati: cioé si può sapere se riguardano un primo piatto o un ingrediente.
    La ricerca dovrebbe funzionare in questa maniera:
    "crea un pranzo completo indicando cosa vuoi": si selezionano i tags delle portate ed eventualmente si aggiunge la tipologia di ingrediente che si vorrebbe.
    Aggiungo i tags "primo, secondo, fettuccine" e dovrei ottenere in uscita le ricette che riguardano tutti i secondi (perché non cìè specificato nessun tags selettivo) e le ricette dei primi che riguardano le fettuccine (perché c'è il filtro ingrediente sul primo piatto).


    Cerco di spiegarti meglio come funziona questo sistema dei tags: il committente voleva evitare di mettere tanti menù a tendina costringendo gli utenti a riempire form su form, così ha "ideato" un sistema di tagging delle ricette che doveva prelevare le ricette e filtrarle.
    In effetti il sistema di tagging funziona molto velocemente perché si apre una bella nuvoletta con tutti i tag suggeriti e basta cliccare al volo sui tag per aggiungerli.
    Il problema però è che quando il programmatore è andato a scrivere il codice MYSQL si è subito accorto che l'unica cosa che poteva fare era quella di trasformare l'elenco di tags in una bella STRINGA di parametri e di fare una RICERCA OR sui post del database (che sono RICETTE).
    Non ha sfruttato il fatto che i TAGS sono a loro divisi per macrocategorie (ci sono quelli che indicano il numero di portata e quelli che indicano gli ingredienti) e di creare un sistema di filtraggio avanzato.

    Saranno un paio di righe di codice da sistemare, ma io non so come sistemarlo...
    Non è che potresti darmi una mano?
    Grazie in anticipo!!
  • Re: Usare AND/OR nella ricerca dei post per Tags

    Giusto per dare a Cesare quel che e' di Cesare: il meccanismo dei tag e' ESATTAMENTE quello che serve per supportare la navigazione delle ricette.

    La caterorizzazione dei tag e' anch'essa CORRETTA.

    Il problema e' come fare le ricerche usando tag e loro categorizzazioni: e' qui' che gioca tutta la potenza espressiva dei tag/categorizzazioni.

    Solo che mettere in piedi il sistema che funzioni correttamente, non e' per nulla banale (ma si puo' fare e si fa) !

    NON SONO UN PAIO DI RIGHE DI CODICE !!!

    Lascia che a capire quante righe di codice siano necessarie per risolvere il problema lo faccia l'esperto.

    E no, non si risolve a suon di post: non ha senso scrivere lo statement SQL da usare direttamente con MySQL.
    Serve una soluzione MOLTO piu' raffinata/sofisticata, per SEMPLIFICARE l'utilizzo da parte dell'utente che accede al sito!
  • Re: Usare AND/OR nella ricerca dei post per Tags

    Migliorabile, grazie anche a te di aver risposto!!!

    Purtroppo non sono un programmatore di MySql e non conoscendo la "profondità" del linguaggio, non credevo fosse possibile eseguire anche codici "if then else" sulle stringhe di codice mysql. Ed infatti era la prima cosa che volevo capire.

    Concordo moltissimo sulla tua frase "Serve una soluzione MOLTO piu' raffinata/sofisticata, per SEMPLIFICARE l'utilizzo da parte dell'utente che accede al sito!": infatti secondo me è tutto lì che si gioca un buon sistema di categorizzazione coi tags... cioè nella capacità che diamo agli utenti di assegnarli. Se infatti un utente immette una ricetta e si scorda un tag, la sua ricetta non verrà mai tirata fuori.
    Ecco perché secondo me, quando si vogliono fare ricerche gerarchiche, o uno ha un'idea DA PAURA e graficamente ineccepibile su come gestire la categorizzazione coi tags, oppure è finita.

    Debbo però aggiungere una cosa: per non saper né leggere né scrivere, ed avendo parlato con il proprietario della app, credo che di aver avuto un'idea per mettere una "pezza" al codice, contando sul fatto che l'utilizzatore sarà avvertito di come inserire i tags e che se non li inserisce correttamente fa un casino. Il proprietario dell'APP ha detto che a lui va bene così.

    Quindi la mia idea di modifica era questa:
    Com'è adesso:
    - in questo momento c'è una funzione che prende dal campo ricerca i tag inseriti e li mette in un array (però non separandoli per categoria)
    - successivamente questo array viene mandato come semplice stringa di input per richiamare le ricette dal database

    Come lo vorrei modificare:
    - la funzione prende dal campo di ricerca i tag inseriti e controlla se appartengono al "numero del piatto" o all'"ingrediente" creando 2 stringhe separate
    Esempio:
    stringa1 "primo piatto, dolce"
    stringa2 "lasagne, bucatini, tiramisu"
    - successivamente queste due stringhe vengono mandate in input, ma applicando un CONDIZIONE sulla ricerca del tipo
    "Prendi tutte le ricette che abbiano come nei tags [(primo piatto OR dolce) AND (lasagne OR bucatini or tiramisu)]

    Ovviamente la condizione è che:
    a) chi ha creato le ricette metta entrambi i tag "numero" ed "ingrediente"
    b) che chi ricerca sia obbligato a specificare per ogni "numero del piatto" anche un ingrediente.

    In questo modo secondo me potrebbe funzionare....

    Tu che ne pensi?
  • Re: Usare AND/OR nella ricerca dei post per Tags

    Guarda questo meccanismo di "tag" (uso le " per non fare uno spiegone) puoi mantenerlo, al prezzo di basse prestazioni, usando un flag.
    In realtà c'è in mariadb (ultime versioni) un meccanismo per le colonne mooolto più evoluto, ma direi che siamo alla base.
    Siamo anche nella fascia ricerche full scan-non-sono-un-problema.
    Aggiungi un flag, ad esempio ; per terminare le stringhe (se ti basta la ricerca), poi ti servirà un decodificatore lato programma (se vuoi mantenere le associazioni)
    Così memorizzerai ad esempio
    campo ingredienti, string, "farina;acqua;vino;sale;"

    ora puoi cercare chi contiene il vino facendo ... select...from... where ingredienti like '%vino;%'


    Tra tutte le tue spiegazioni mi è venuta un po' di labirintite, posta più banalmente la struttura della tabella con qualche riga
  • Re: Usare AND/OR nella ricerca dei post per Tags

    M2 non so come ringraziarti!!!!


    Cerco di essere il più sintetico e chiaro possibile: ho ricostruito il percorso del codice eliminando tutte le righe inutili (secondo me)!

    1) Qui abbiamo il richiamo quando viene premuto il bottone che crea la "menu":
        
        onSaveMenu: function(){
             [...]
            this.sendCreateMenuRequest(this.createMenuFromInputData());
        },
        


    2) queste sono le funzioni richiamate dalla 1)
    In "CreateMenu c'è la stringa di codice MySql dove secondo me (non mi lapidate!!!!) andrebbe inserito il codice AND OR per selezionare "by tags" applicando una funzione [(primo piatto OR dolce) AND (fettuccine OR tiramisu)] che darebbe in uscita tutti i primi piatti che contengono in uscita l'ingrediente fettuccine e tutti i dolci che contengono il tiramisu. Il proprietario della applicazione ha detto che a lui va bene così...
    
    
    	sendCreateMenuRequest:function(menu){
            $.post( "ajax/ajaxHandler.php",{ rtype: "createMenu",uid: userId, data: menu }).done(function (data) {
             [...]
        },
    	
    	
        createMenuFromInputData: function () {
            var menu = {};
            menu.name = $("#menuname").val();
            menu.tagValues = this.getTagValues();
             [...]
            return menu;
        },
    	
    	
    		
    function createMenu(){
    	$menu = $_POST['data'];
    	$menus = array();
    	$where = "WHERE q.id is not NULL ".getWhereClauseByTags($menu);
    }
    	

    3) Queste sono le funzioni richiamate per estrarre i tags: viene creato un array monodimensionale che mette tutti i tags sullo stesso piano senza categorizzarli (però sul database i tags sono categorizzati, cioé ogni tag si sa se è un "numero" o un "ingrediente".
    La modifica che andrebbe fatta qui è proprio quella di richiamare i tags, ma separarli per categorie (io volevo creare un paio di stringhe, ma effettivamente forse sarebbe sempre meglio un array multidimesionale)
    
    getTagValues : function () {
            var tagValues = [];
            $('#questiontags option:selected').each(function(index,elem){
                var tagValueId = $(elem).attr("id").replace("tv_id_","");
                tagValues.push(tagValueId);
            });
            return tagValues;
        },
    	
    	
    
    function getWhereClauseByTags($menu)
    {
    	$where = "";
    	if(sizeof($menu[tagValues])>0)
    		$where=" AND t.idvalue in (".implode(",", $menu[tagValues]).")";
    	return $where;
    }
    
    GRAZIE PER L'AIUTO M2!!!!
    Qualsiasi aiuto è ben gradito, perché come ha detto Migliorabile, qui andrebbe riprogettato l'intero sistema dei tags, altrimenti gli utenti impazziscono. Però al momento io ci sto mettendo mano "per amicizia" e se alcune cose sono riuscite a sistemarle da solo, altre sono "inarrivabili" per me.
Devi accedere o registrarti per scrivere nel forum
6 risposte