Domanda

Qui è il mio problema. Per esempio ho una tabella Prodotti che contiene un campo, Nome :

Products
ID | Name | ..
1  | "USB Key 10Go"
2  | "Intel computer"
3  | "12 inches laptop computer"
...

Al momento sto implementando un semplice motore di ricerca (SQL Server e ASP .NET, C #) per un iPhone web-app e vorrei utilizzare la funzione SOUNDEX() SQL Server.

Il fatto è che non posso utilizzare direttamente SOUNDEX sul campo Nome . (Questo sarebbe irrilevante, in quanto ci sono diverse parole del nome.) Vorrei applicare la funzione SOUNDEX ad ogni parola dal Nome campo, e poi vedere se qualcuno di loro corrisponde alla parola chiave ricercata.

Se qualcuno ha qualche idea di come fare questo, sarebbe fantastico.

È stato utile?

Soluzione

Hai guardato nella ricerca funzione full-text in SQL Server? So che questo non è esattamente quello che hai chiesto. Il suo solo che la funzione SOUNDEX () viene utilizzato per trovare i nomi dal suono simile (EX: SMITH e Smythe lo stesso suono). In un motore di ricerca, però, come una parola suona è meno importante che le parole di ricerca stessi. Ricerca full-text consente anche di utilizzare sinonimi (che consente di specificare alcune parole che significano la stessa cosa all'interno del contesto dell'applicazione), e li hanno automaticamente in considerazione durante la ricerca.

Guardate queste pagine per ulteriori informazioni sulla ricerca full-text in SQL Server:

Introduzione alla ricerca full-text

CONTIENE

CONTAINSTABLE

FREETEXT

FREETEXTTABLE

Altri suggerimenti

Invece di usare Soundex si potrebbe essere meglio calcolare la distanza Levenshtein tra le due stringhe. Vedere alle voci di Wikipedia Levenshtein distanza .

C'è un'implementazione TSQL dell'algoritmo distanza Levenshtein qui .

Condividere e godere.


EDIT 03-mag-2012

Dopo aver scritto la mia risposta originale ho imparato che Oracle include la distanza Levenshtein e diverse altre funzioni "stringa" somiglianza nel pacchetto UTL_MATCH, che credo sia una parte standard del database. Documentazione qui . Forse non direttamente legate al post originale (che era per SQL Server), ma forse utile come molti negozi utilizzano più database.

Se si deve fare tutto in RDBMS, un UDF sarebbe la migliore se si tratta di un'opzione.

In caso contrario, è possibile utilizzare questa tecnica per almeno SOUNDEX le prime quattro parole singolarmente utilizzando ParseName :

Come faccio a dividere una stringa in modo da poter accedere elemento x? :

PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 1)  --return computer
PARSENAME(REPLACE('12 inches laptop computer', ' ', '.'), 2)  --return laptop
...

Tuttavia: utilizzando ParseName in questo modo è un hack e una grave limitazione è che funziona solo per un massimo di 4 parti. Se ci sono 5 o più parole ParseName tornerà NULL, quindi bisogna controllare che con un condizionale e degradare con grazia.

Ecco un esempio semplificato (ancora una volta, senza i controlli NULL)

SELECT *
FROM Products 
WHERE SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 4))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 3))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 2))
  OR SOUNDEX(search_input) = SOUNDEX(PARSENAME(REPLACE(Name, ' ', '.'), 1))

Il SOUNDEX può essere una misura perfetta per la vostra purpuse, ma vi prego di ricordare che non può fornire buoni risultati per niente altro che parole pronunciate in inglese britannico o americano! Può anche essere utilizzato su fonetici parlato parole tedesche, ma non funziona bene con qualsiasi altra cosa.

Si potrebbe provare a memorizzare il metaphone di ogni parola concatenato con trattini. EG campo stored_metaphone potrebbe contenere qualcosa come '-AKTRF-SPLS-'. Poi creare una query come questa:

$where = '(';
$search_sql = array();
$search_terms = explode(' ',$search);
foreach ($search_terms as $term) {
    $search_sql[] = "`stored_metaphone` LIKE '%-".metaphone($term)."-%'";
}
$where .= implode(' OR ',$search_sql);
$where .= ')';

NB questa è solo la parte in cui della query.

Per quanto ne so metaphone funziona solo con l'inglese. Quanto sopra sql sta lavorando piuttosto bene su un certo numero di siti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top