Come si fa a far funzionare le principali ricerche full-text con caratteri jolly in SQL Server?

StackOverflow https://stackoverflow.com/questions/3400

  •  08-06-2019
  •  | 
  •  

Domanda

Nota: IO Sono utilizzando le funzionalità di ricerca full-text di SQL, le clausole CONTAINS e tutto il resto: * è il carattere jolly nel testo full, % è solo per le clausole LIKE.

Ho letto in diversi posti ora che le ricerche con "caratteri jolly principali" (ad es.utilizzando "*overflow" per corrispondere a "stackoverflow") non è supportato in MS SQL.Sto pensando di utilizzare a Funzione CLR per aggiungere la corrispondenza regex, ma sono curioso di vedere quali altre soluzioni potrebbero avere le persone.

Ulteriori informazioni: Puoi aggiungere l'asterisco solo alla fine della parola o della frase. - insieme alla mia esperienza empirica:Quando si corrisponde a "myvalue", "my*" funziona, ma "(asterisk)value" non restituisce alcuna corrispondenza, quando si esegue una query semplice come:

SELECT * FROM TABLENAME WHERE CONTAINS(TextColumn, '"*searchterm"');

Quindi, la mia necessità di una soluzione alternativa.Utilizzo la ricerca nel mio sito solo su una pagina di ricerca effettiva, quindi deve funzionare sostanzialmente nello stesso modo in cui funziona Google (agli occhi di un utente tipo Joe Sixpack).Non altrettanto complicato, ma questo tipo di incontro non dovrebbe davvero fallire.

Nessuna soluzione corretta

Altri suggerimenti

Soluzione alternativa solo per i caratteri jolly iniziali:

  • memorizzare il testo invertito in un campo diverso (o nella vista materializzata)
  • creare un indice di testo completo su questa colonna
  • trova il testo invertito con un *

    SELECT * 
    FROM TABLENAME 
    WHERE CONTAINS(TextColumnREV, '"mrethcraes*"');
    

Naturalmente ci sono molti inconvenienti, solo per una soluzione rapida...

Per non parlare di CONTENIBILE...

Il problema con i caratteri jolly principali:Non possono essere indicizzati, quindi stai eseguendo una scansione completa della tabella.

È possibile utilizzare il carattere jolly "*" alla fine della parola o frase (ricerca del prefisso).

Ad esempio, questa query troverà tutti i "datab", "database", "databases"...

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"datab*"')

Purtroppo però non è possibile effettuare la ricerca con i caratteri jolly iniziali.

Ad esempio, questa query non troverà "database"

SELECT * FROM SomeTable WHERE CONTAINS(ColumnName, '"*abase"')

Forse per aggiungere chiarezza a questo thread, dai miei test sulla R2 2008, Franjo ha ragione sopra.Quando si ha a che fare con la ricerca del testo completo, almeno quando si utilizza la frase CONTAINS, non è possibile utilizzare un'interlinea , solo un finale funzionalmente.* è il carattere jolly, non % nel testo completo.

Alcuni hanno suggerito che * venga ignorato.Non sembra essere il caso, i miei risultati sembrano mostrare che la funzionalità * finale funziona.Penso che gli * iniziali vengano ignorati dal motore.

Il mio ulteriore problema, tuttavia, è che la stessa query, con un * finale, che utilizza il testo completo con caratteri jolly, ha funzionato relativamente velocemente nel 2005 (20 secondi) e ha rallentato fino a 12 minuti dopo la migrazione del db alla versione 2008 R2.Sembra che almeno un altro utente abbia ottenuto risultati simili e abbia avviato un post sul forum a cui ho aggiunto...FREETEXT funziona ancora velocemente, ma qualcosa "sembra" essere cambiato con il modo in cui 2008 elabora il * finale in CONTAINS.Forniscono tutti i tipi di avvertimenti nell'Upgrade Advisor che hanno "migliorato" il TESTO COMPLETO in modo che il tuo codice potrebbe rompersi, ma sfortunatamente non ti danno alcun avvertimento specifico su certi codici deprecati, ecc....solo una dichiarazione di non responsabilità che l'hanno cambiato, usalo a tuo rischio e pericolo.

http://social.msdn.microsoft.com/Forums/ar-SA/sqlsearch/thread/7e45b7e4-2061-4c89-af68-febd668f346c

Forse, questo è il caso più vicino alla SM correlato a questi problemi... http://msdn.microsoft.com/en-us/library/ms143709.aspx

Una cosa che vale la pena tenere a mente è che le principali query con caratteri jolly comportano un notevole vantaggio in termini di prestazioni, rispetto ad altri utilizzi di caratteri jolly.

Il carattere jolly in SQL Server è il % segno e funziona perfettamente, iniziale, finale o altro.

Detto questo, se intendi eseguire qualsiasi tipo di ricerca seria nel testo completo, prenderei in considerazione l'utilizzo delle funzionalità di indice del testo completo.Utilizzando % E _ i caratteri jolly causeranno un grave calo delle prestazioni del database.

Dalla documentazione in linea di SQL Server:

Per scrivere query full-text in Microsoft SQL Server 2005, è necessario imparare come utilizzare i predicati contiene e freeText Transact-SQL e le funzioni con valori di giri contenenti e freeTeTexTable.

Ciò significa che tutte le query scritte sopra con % e _ non sono query di testo completo valide.

Di seguito è riportato un esempio di come appare una query quando si chiama la funzione CONTAINSTABLE.

Seleziona il rango, *da tablename, contenente (tablename, *, '" *wildcard"') Searchtable dove [key] = tablename.pk ordine di searchtable.rank desc

Affinché la funzione CONTAINSTABLE sappia che sto utilizzando una ricerca con caratteri jolly, devo racchiuderla tra virgolette doppie.Posso usare il carattere jolly * all'inizio o alla fine.Ci sono molte altre cose che puoi fare quando crei la stringa di ricerca per la funzione CONTAINSTABLE.È possibile cercare una parola vicina a un'altra parola, cercare parole flessive (drive = drive, drive, driving e drive) e cercare il sinonimo di un'altra parola (il metallo può avere sinonimi come alluminio e acciaio).

Ho appena creato una tabella, inserito un indice di testo completo nella tabella e effettuato un paio di ricerche di prova e non ho riscontrato problemi, quindi la ricerca con caratteri jolly funziona come previsto.

[Aggiornamento]

Vedo che hai aggiornato la tua domanda e so che devi utilizzare una delle funzioni.

Puoi comunque cercare con il carattere jolly all'inizio, ma se la parola non è una parola intera dopo il carattere jolly, devi aggiungere un altro carattere jolly alla fine.

Example:  "*ildcar" will look for a single word as long as it ends with "ildcar".

Example:  "*ildcar*" will look for a single word with "ildcar" in the middle, which means it will match "wildcard".  [Just noticed that Markdown removed the wildcard characters from the beginning and ending of my quoted string here.]

[Aggiornamento n. 2]

Dave Ward - Usare un carattere jolly con una delle funzioni non dovrebbe essere un grande successo in termini di prestazioni.Se ho creato una stringa di ricerca solo con "*", non restituirà tutte le righe, nel mio test case ha restituito 0 record.

Per tua informazione, Google non esegue ricerche o troncamenti di sottostringhe, a destra o a sinistra.Hanno un carattere jolly * per trovare parole sconosciute in una frase, ma non una parola.

Google, insieme alla maggior parte dei motori di ricerca full-text, imposta un indice invertito basato sull'ordine alfabetico delle parole, con collegamenti ai documenti di origine.La ricerca binaria è incredibilmente veloce, anche per indici enormi.Ma in questo caso è davvero molto difficile eseguire un troncamento a sinistra, perché si perde il vantaggio dell'indice.

Come parametro in una procedura memorizzata puoi usarlo come:

ALTER procedure [dbo].[uspLkp_DrugProductSelectAllByName]
(
    @PROPRIETARY_NAME varchar(10)
)
as
    set nocount on
    declare @PROPRIETARY_NAME2 varchar(10) = '"' + @PROPRIETARY_NAME + '*"'

    select ldp.*, lkp.DRUG_PKG_ID
    from Lkp_DrugProduct ldp
    left outer join Lkp_DrugPackage lkp on ldp.DRUG_PROD_ID = lkp.DRUG_PROD_ID
    where contains(ldp.PROPRIETARY_NAME, @PROPRIETARY_NAME2)

Quando si tratta di ricerca del testo completo, per i miei soldi non c'è niente di meglio Lucene.C'è un Porta .Net disponibile compatibile con gli indici creati con la versione Java.

C'è un po' di lavoro da fare per creare/mantenere gli indici, ma la velocità di ricerca è fantastica e puoi creare tutti i tipi di query interessanti.Anche la velocità di indicizzazione è piuttosto buona: ricostruiamo completamente i nostri indici una volta al giorno e non ci preoccupiamo di aggiornarli.

Come esempio, questa funzionalità di ricerca è alimentato da Lucene.Net.

Forse il seguente collegamento fornirà la risposta definitiva a questo utilizzo dei caratteri jolly: Esecuzione di ricerche con caratteri jolly FTS.

Da notare il passaggio che afferma:"Tuttavia, se specifichi "Catena” o “Capain”, non otterrai il risultato atteso.L'asterisco verrà considerato un normale segno di punteggiatura e non un carattere jolly."

Se hai accesso all'elenco di parole del motore di ricerca a testo completo, puoi eseguire una ricerca "mi piace" su questo elenco e abbinare il database con le parole trovate, ad es.una tabella "parole" con le seguenti parole:

    pie
    applepie
    spies
    cherrypie
    dog
    cat

Per abbinare tutte le parole contenenti "torta" in questo database su una tabella fts "full_text" con il campo "testo":

    to-match <- SELECT word FROM words WHERE word LIKE '%pie%'
    matcher = ""
    a = ""
    foreach(m, to-match) {
      matcher += a
      matcher += m
      a = " OR "
    }
    SELECT text FROM full_text WHERE text MATCH matcher

% Corrisponde a qualsiasi numero di caratteri _ corrisponde a un singolo carattere

Non ho mai utilizzato l'indicizzazione di testo completo, ma puoi eseguire query di ricerca piuttosto complesse e veloci semplicemente utilizzando le funzioni di stringa T-SQL integrate.

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