Domanda

Stiamo utilizzando SQL Server 2005 in un progetto.Gli utenti del sistema hanno la possibilità di cercare alcuni oggetti utilizzando "parole chiave".Il modo in cui lo implementiamo è creando un catalogo full-text per le colonne significative in ciascuna tabella che può contenere queste "parole chiave" e quindi utilizzando CONTAINS per cercare le parole chiave immesse dall'utente nella casella di ricerca in quell'indice.

Quindi, ad esempio, supponiamo che tu abbia l'oggetto Movie e desideri consentire all'utente di cercare parole chiave nel titolo e nel corpo dell'articolo, quindi indicizzeremo sia la colonna Titolo che quella Trama, quindi faremo qualcosa del tipo:

SELECT * FROM Movies WHERE CONTAINS(Title, keywords) OR CONTAINS(Plot, keywords)

(In realtà è un po' più avanzato di così, ma niente di terribilmente complesso)

Alcuni utenti aggiungono numeri alla loro ricerca, quindi ad esempio vogliono trovare "Terminator 2".Il problema qui è che, per quanto ne so, per impostazione predefinita SQL Server non indicizzerà le parole brevi, quindi eseguendo una ricerca come questa:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator 2"')

in realtà è equivalente a fare questo:

SELECT * FROM Movies WHERE CONTAINS(Title, '"Terminator"') <-- notice the missing '2'

e stiamo ottenendo una miriade di risultati spuri.

Esiste un modo per forzare SQL Server a indicizzare parole piccole?Preferibilmente, preferirei solo indicizzare numeri come 1, 2, 21, ecc.Non so dove definire i criteri di indicizzazione, e nemmeno se sia possibile essere così specifici.


Bene, l'ho fatto, ho rimosso le "parole non significative" dall'elenco e ora il comportamento è leggermente diverso, ma non è ancora quello che ti aspetteresti.

Non sarà possibile cercare "Terminator 2" (me lo sto inventando, il mio datore di lavoro potrebbe non essere molto contento se rivelo cosa stiamo facendo...comunque i termini sono un po' diversi ma il principio lo stesso), non capisco nulla, ma so che ci sono oggetti che contengono le due parole.

Forse sto facendo qualcosa di sbagliato?Ho rimosso tutti i numeri 1...9 dalla mia configurazione del rumore per ENG, ENU e NEU (neutro), ho rigenerato gli indici e ho provato la ricerca.

È stato utile?

Soluzione

Queste "parole piccole" sono considerate "parole non significative" dall'indice del testo completo.È possibile personalizzare l'elenco delle parole non significative.Questo post sul blog fornisce maggiori dettagli.È necessario ripopolare l'indice di testo completo quando si modifica il file delle parole non significative.

Altri suggerimenti

Sapevo del file delle parole non significative, ma non capisco il motivo per cui il tuo esempio "Terminator 2" ti dà ancora problemi.Potresti provare a chiederlo su Forum del motore di database MSDN dove si ritrovano persone specializzate in questo genere di cose.

Puoi combinare CONTAINS (o CONTAINSTABLE) con semplici condizioni where:

SELEZIONA * DA Film DOVE CONTIENE(Titolo, '"Terminator 2"') e Titolo come '%Terminator 2%'

Mentre CONTIENE trova tutti i Terminator dove eliminerà "Terminator 1".

Ovviamente il motore è abbastanza intelligente da avviarsi in condizioni non simili.

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