Partial word match

5 contenuti / 0 new
Ultimo contenuto
Partial word match

Cercando la funzionalità per la ricerca parziale delle parole ("pane" -> restituisce anche risultati per "panettiere") sono arrivato a questa pagina su drupal.org: http://drupal.org/node/103548 dove c'è una patch da applicare e il cui stato è però "ignored" perché mi dicono sarà una funzionalità della versione 8 (!)

Ho provato ad usare una delle patch postate lungo la discussione e sembra funzionare. Sono però titubante nell'applicarla ad un portale che dovrà andare in produzione. Ci sono altre cose che mi sono sfuggite? Scusate, ma faccio un po' fatica a capire il meccanismo di funzionamento di drupal.org...

Hai ragione di essere preoccupato, come da commento #106 (!) sembra un patch non accettato per D7 - dava errori di testing. Sicuramente non per D6.

Dato che 'search' è un mistiere in se, personalmente eviterei di usare quello 'di default' di Drupal per operazioni sofisticati come la tua richiesta. Si può utilizza una personalizzazione di Google: http://www.google.com/cse/, o Apache Solr: http://crema2009.drupalcamp.it/talk/integrazione-drupal-e-apache-solr o forse lucene http://drupal.org/project/luceneapi

No non gli ho usati...

Più imparo, più dubito.

Grazie, ma quindi non ho capito, non esiste qualcosa per far matchare "pane" con "tostapane"? Non sono pratico col codice, ma non mi sembra una cosa impossibile. Eppure non lo trovo. Alla fine per la mia ricerca uso VIEWS con Filtri Esposti e il filtro esposto è proprio "Ricerca: Termini per la ricerca" e mi piacerebbe che evidenziasse anche i "match parziali".

Non è che devi essere pratico col codice - devi solo trovare l'algoritmo giusto. Cosa fa un motore di ricerca? Prende un documento e lo spezza in parole. Qui siamo già in difficoltà, come lo spezzi? Dove c'è uno spazio, o puntuazione (,;.:) e l'apostrofo - due parole l e apostrofo? E chinese (che non usa spazi o puntuazione)...

Superato questo piccolo problema, se cerco 'fare' devi anche restituire 'fai', 'facciamo', 'fatto'? Ah, stemming - per ogni lingua. Hmm.

Superato anche questo, mettiamoli questi parole in lista - alfabetico? OK. Teniamo conto del maiscolo minuscolo? Oops, Le nazioni unite (UN) diventano un articolo indeterminativo.

Teniamo conto anche della distanza da una parola all'altro (delta) nel documento per trovare una frase, non tre paragrafi ogniuno con uno delle parole ricercati. Bene. La lista velocizza notevolmente, le delta aiutono, ma santo cielo, quanti dati abbiamo adesso. Se pensi che usiamo un vocabolario media di 30,000 parole (non le stesse 30,000 ovvio) possiamo pensare su un sito 'corpulente' che ci sia 100,000 parole. Più qualche centinaio di delta per ogni documento. Hmm.

E' se non sei proprio pratico d'italiano? Scrivi 'adeso' devi suggerirti 'adesso'? Hmm.

------------------ Fin qui arrivano Google ma anche Solr e lucene (ma non il search di Drupal - che sappia io) ---------------------

Ma tu vuoi vedere come finise la parola, quindi quel elenco non serve. Guardiamo 100,000 parole nella speranza di... Hmm, un pò troppo costoso mi sa. Allora teniamo una lista alla rovescia, e cerciamo enap*. Meglio, ma un altro lista solo per quel scopo - che non la usa nessuno.

Vedi che, se ci pensi bene, è proprio un mistiere da se? FYI Google non fa nè pane* nè *pane - chi sa perchè? http://www.google.com/intl/it/help/features.html

Sembrerebbe che niente è impossibile con il software, invece certi cose sono proprio impossibile, mentre altri sono molto, ma molto difficile da risolvere (anche se sembra facile) - il classico travelling salesman problem.

Più imparo, più dubito.

Non ho idea di come fare, però se già la ricerca di Drupal prevede la wildcard '*', cioè trova 'fruttivendolo' cercando 'frutti*' penso che non dovrebbe essere difficile replicare il comportamento anche senza specificare '*', cioè inserirlo implicitamente in ogni ricerca all'inizio e alla fine del termine:
Se il codice è: search($parola_inserita) trasformarlo in qualcosa tipo search(tostring('*')+$parola_inserita+tostring('*')).

Comunque, niente stemming. La patch che ho linkato nel primo post applicava l' N-gram: n-Gram consiste nello spezzare le parole in porzioni lunghe n che saranno poi indicizzate. La funzione di ricerca semplicemente cercherà le porzioni di parole.
Per esempio, con N = 3, prende [email protected] e lo spezza in Bar, art, rt@, t@s... Allo stesso modo, saranno spezzate anche le parole ricercate con la search. Così, cercando Bart, la ricerca guarderà nell'indicizzazione per Bar, art, ritornando [email protected]. Dico che non mi sembra impossibile, semplicemente perché ho applicato la patch e funziona. L'unica è che non ho sicurezza che funzionerà anche domani e che sia sicuro.