2013-12-09 15 views
11

Ho una tabella di ricerca con, diciamo, 4 colonne di dati di testo da cercare.Ricerca FullText con CONTAINS su più colonne e predicato - E

faccio qualcosa di simile:

SELECT * FROM dbo.SearchTable 
WHERE CONTAINS((co1, col2, col3, col4), 'term1 AND term2') 

Sembra Contiene restituisce solo vero se term1 e term2 sono nella stessa colonna. C'è un modo per specificare che tutte le colonne dovrebbero essere incluse con un AND?

In caso contrario, la mia idea è di JSON tutte le colonne di ricerca e incollarle in una. In questo modo posso eseguire la ricerca nel testo completo, ma estrarre facilmente le singole colonne in .NET. Presumo che l'indicizzatore non abbia problemi con questo e farà a meno dei caratteri JSON e delle virgolette. È corretto?

Grazie

EDIT

Pensando all'idea JSON, il crawler potrebbe anche indicizzare i nomi delle proprietà quindi mi piacerebbe avere rinominare {nome}, {dettagli}, {} long_details a qualcosa come {x1}, {x2}, {x3} per garantire che non vengano scelti in una ricerca. Speriamo che se siano così brevi non sarebbero comunque indicizzati.

EDIT2

posso creare un Stoplist, basato sul sistema stoplist e mettere i nomi di proprietà in quello.

risposta

12

Questo dovrebbe funzionare:

SELECT * FROM dbo.SearchTable 
WHERE CONTAINS((co1, col2, col3, col4), 'term1') 
AND CONTAINS((co1, col2, col3, col4), 'term2'); 

In alternativa, è possibile aggiungere una nuova colonna calcolata con un indice testo completo su di esso. Aggiungere una colonna come questo:

computedCol AS col1 + ' ' + col2 + ' ' + col3 + ' ' + col4 

E creare l'indice testo completo:

CREATE FULLTEXT INDEX ON SearchTable (computedCol LANGUAGE 1033) 
KEY INDEX pk_SearchTable_yourPrimaryKeyName 

allora si può fare questo:

SELECT * FROM dbo.SearchTable 
WHERE CONTAINS(*, 'term1 AND term2') 
+0

Ciao, grazie. Non mi piace la prima opzione perché dovrei analizzare il termine di ricerca e creare la query dinamicamente (anche io penso di aver letto che, se possibile, le ricerche dovrebbero essere combinate in 1 CONTAINS). Avrei bisogno di leggere di più sulle colonne calcolate. Penso che possano essere persistenti, ma poi conserverei il doppio dei dati. Se non sono persistenti, avrebbe un impatto maggiore sul tempo di interrogazione? –

+4

Tenere presente che la concatenazione di stringhe in SQL in cui uno dei valori è null sostituirà l'intera espressione con null. Puoi risolvere questo problema avvolgendo ogni termine nullable con isnull come "isnull (col, '')". –

Problemi correlati