Ricerca avanzata di più parole in una stringa

mercoledì 23 ottobre 2013 - 20.26
Tag Elenco Tags  Access (.mdb)  |  VBScript

thetmd Profilo | Newbie

Ciao,
sto tentando di realizzare una ricerca all'interno di una tabella utilizzando più parole per ottenere una tabella di 'possibili' corrispondenze

Nello specifico:
- ho una tabella tblNomi con 2 campi: IDtblNomi (contatore), NOME (stringa)
all'inerno di nome è contenuta una stringa composta da più parole separate da spazio

- ho una tabella tblSPLIT nella quale ho i campi: IDtblSPLIT, IDFoglio7, ed i campi nominati da Campo1 a Campo11
All'interno dei Campo1 ... Campo11 sono inserite singole parole, senza spazi iniziali o finali
I campi possono non essere tutti popolati, ma sono sicuramente popolati in progressione: ovvero se Campo3 ha un valore allora anche Campo2 ha un valore e Campo1 ha un valore.
Campo1 è SEMPRE popolato.

Il mio intento è quello di creare delle query / codice VBA per capire quali record di tblNomi contengono una o più parole del record di tblSPLIT

ESEMPIO:
tblNomi ha "Viaggio al centro della terra", "Viaggio nel centro della terra", "Viaggio in fondo al mare", "Viaggio nel sole", "Inferno di cristallo", "Nel centro dell'universo", "Un viaggio di inferno" (ed altro, ma penso sia chiaro la tipologia di esempio per i nomi di tblNomi)
tblSPLIT potrebbe avere un record contenente "Viaggio", "Centro", "Terra", "Inferno" (per semplicità ho già provveduto a popolare tblSPLIT SOLO con parole e nessun articolo/preposizione o quant'altro)
1) Dando in pasto alla procedura "Viaggio" otterrò un certo numero di risultati
2) Dando in pasto alla procedura "Centro" otterrò un certo numero di risultati
3) Dando in pasto alla procedura "Terra" otterrò un certo numero di risultati
4) Dando in pasto alla procedura "Inferno" otterrò un certo numero di risultati
A questo punto per capire a quale record di tblNomi le parole che ho a disposizinoe in tblSPLIT si avvicinano di più pensavo di creare una query che prendesse solo i valori identici (definiti da ID) delle 4 ricerche che ho fatto.
Pensavo di impostare la procedura in modo da fare prima il controllo con tutti i risultati a mia disposizione 4): se ottengo zero 8cosa che in questo esempio sarà) allora rieseguo la procedura solo con i primi 3 risultati, ottenendo una certa quantità di incroci (n 2, ovvero "viaggio al centro della terra" e "viaggio nel centro della terra").
Questi due ultimi risultati mi vanno bene e la procedura dovrebbe passare al record successivo di tblSPLIT

Spero di essere stato chiaro, perchè non sono sicuro di aver capito nemmeno io cosa ho scritto

Un grazie anticipato per qualunque aiuto (che tra parentesi va bene anche se mi dite che in Excel si fa più facilmente o che sul blocco note di windows c'è una funzinoa apposita )
Pierpaolo

renarig Profilo | Expert

la cosa piu semplice che mi viene in mente è 1 query SQL che usa la funzione "InStr"

Tabella "tblNomi"
- IDtblNomi ----- Key Autoincrementale
- NOME ---------- Testo

Tabella "tblSplit"
- IDtblSplit ---- Key Autoincrementale
- IDFiglio7 ---- Questo non so cosa sia ma non ci interessa
- RR ---- Testo -- Lunghezza 2 ---- Duplicati NON Ammessi ----- Valore predefinito = "RR" ---- Valido Se = "RR" --- Richiesto = Sì ---- Lunghezza zero = No ----
- Campo1 ---- Testo
.......
........
Campo11 ---- Testo

Il campo "RR" con i suoi vincoli ti serve ad impedire che ci sia piu di 1 record nella tabella

poi fai questa query:
SELECT tblNomi.IDtblNomi, tblNomi.NOME FROM tblNomi, tblSplit WHERE ((( Nz(InStr([NOME],[Campo1]),0) & Nz(InStr([NOME],[Campo2]),0) & Nz(InStr([NOME],[Campo3]),0) & Nz(InStr([NOME],[Campo4]),0) & Nz(InStr([NOME],[Campo5]),0) & Nz(InStr([NOME],[Campo6]),0) & Nz(InStr([NOME],[Campo7]),0) & Nz(InStr([NOME],[Campo8]),0) & Nz(InStr([NOME],[Campo9]),0) & Nz(InStr([NOME],[Campo10]),0) & Nz(InStr([NOME],[Campo11]),0) )<>"00000000000"));

Facci sapere

TOPOAMORE Profilo | Expert

Ciao,
utilizzando un db sql server risolveresti il tuo problema con le FULL TEXT
__.__.__.__.__.__

http://salvatorecervone.wordpress.com

ASP 2.0 - VB 2008

thetmd Profilo | Newbie

Grazie per le pronte risposte

mi spiace Topoamore ma non sarei capace di fare ciò che mi dici...se poi non ho capito male il suggerimento credo che sia qualcosa che mi aveva già detto un amico, ma poi lui ha proseguito dicendomi che dopo aver fatto il database in sql avrei dovuto avere una interfaccia web per utilizzarlo (o qualcosa del genere)....

la risposta di Renarig è quella più adatta alle mie conoscenze di SQL (e già dovrò dar fondo a tutte le mie risorse per - ed all'aiuto in linea - per capire le funzioni che mi ha scritto)
Ho creato la query, senza il campo RR comunque perchè non ne avevo bisogno (la tblSPLIT contiene già i records una sola vota senza doppioni, all'incirca 1600), ed ora ho un elenco di 55000 voci che dovrò scremare fino ad ottenere un rapporto di 1 a 1 (o quello più similare) tra tblSplit e tblNomi

Adesso proverò a proseguire da solo, se poi avrò problemi so che potrò rivolgermi a voi

Grazie
Pierpaolo

renarig Profilo | Expert

>Adesso proverò a proseguire da solo, se poi avrò problemi so
>che potrò rivolgermi a voi
Non vorrei sembrare un suocero invadente ma...
Se fai una ricerca contemporanea di 160 record della "tblSplit" rischi di ottenere in output migliaia di record nella query che ti renderebbe ingestibile il tutto
( ogniuno di quei 160 puo produrti decine/centinaia di record )

modifica la query proposta in questo modo
SELECT tblNomi.IDtblNomi, tblNomi.NOME, [tblSplit].[IDtblSplit] & " " & [tblSplit].[Campo1] & " " & [tblSplit].[Campo2] & " " & [tblSplit].[Campo3] & " " & [tblSplit].[Campo4] & " " & [tblSplit].[Campo5] & " " & [tblSplit].[Campo6] & " " & [tblSplit].[Campo7] & " " & [tblSplit].[Campo8] & " " & [tblSplit].[Campo9] & " " & [tblSplit].[Campo10] & " " & [tblSplit].[Campo11] AS Split FROM tblNomi, tblSplit WHERE ((( Nz(InStr([NOME],[Campo1]),0) & Nz(InStr([NOME],[Campo2]),0) & Nz(InStr([NOME],[Campo3]),0) & Nz(InStr([NOME],[Campo4]),0) & Nz(InStr([NOME],[Campo5]),0) & Nz(InStr([NOME],[Campo6]),0) & Nz(InStr([NOME],[Campo7]),0) & Nz(InStr([NOME],[Campo8]),0) & Nz(InStr([NOME],[Campo9]),0) & Nz(InStr([NOME],[Campo10]),0) & Nz(InStr([NOME],[Campo11]),0) )<>"00000000000"));
ottieni in piu di affiancare al record trovato della "tblNomi" il suo corrispettivo della "tblSplit"

thetmd Profilo | Newbie

Nessun problema con la suocera semplicemente non volevo disturbare troppo
Avevo già inserito nella query il campo completo e stavo procedendo, di fatto manualmente, alle cernita perchè non sono riuscito a trovare un modo di ridurre automaticamente i risultati.

Tramite la tua query sono arrivato ad avere una tabella che contiene
IDtabella - contatore
IDtblSplit - numerico, corrisponde al contatore della tblSplit originale
IDFoglio7 - che mi serve per fare riferimento sicuro al foglio di excel dal quale ho recuperato i dati: me lo porto appresso per sicurezza
NomeCartella - che ho recuperato dalla tblSplit....e qui faccio mea culpa perchè mi accorgo ora che non lo avevo indicato tra i campi di tblSplit nel primo messaggio
IDtblNomi - numerico, corrisponde al contatore della tblNomi
Nome - Nome all'interno del quale ho fatto la ricerca dei Campo1...Campo11

Analizzando i risultati mi sono accorto che per ogni record di tblSplit (anche quando composto da più di un campo compilato) ottengo in risultato una sola volta il corrispondente record di tblNomi corretto....mi sarei aspettato di trovarlo una volta per ogni corrispondenza dei campi di tblSplit...

Non so come andare avanti, ma prima di chiedere aiuto voglio sbatterci ben bene la testa
Se poi il problema suscita interesse son disposto a fornire tutte le informazioni del caso
(ad ogni buon conto il lavoro manuale non è poi così lungo, anche se ripetitivo...ieri in 1 ora ho ridotto i record della nuova tabella da 55000 a 48000, attraverso excel con il quale mi ritrovo più a mio agio...anceh se ovvio non è il metodo più corretto)

Pierpaolo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5