Un'altra risposta è quella di utilizzare un CTE per togliere il codice HTML prima di fare una ricerca.
Il seguente CTE estratti probabili righe che soddisfano i criteri di ricerca e ricorsivamente strisce fuori il codice HTML. Query utilizza quindi i risultati del CTE per filtrare le righe ancora contenenti HTML e quelle che non corrispondono esattamente ai criteri di ricerca.
Il CTE non è così complicato come sembra. La maggior parte del giocherellare è quello di far fronte con PATINDEX ritorno 0.
--** Test table
DECLARE @HTML TABLE (id INT IDENTITY, html VARCHAR(max))
INSERT INTO @HTML SELECT 'This is a <span style="font-weight: bold; ">nice</span> question';
INSERT INTO @HTML SELECT 'The cat sat <span style="font-weight: bold; ">on the</span> mat';
--** Search criteria
DECLARE @Search VARCHAR(50) = 'is a nice';
--** CTE to return the matching rows ignoring the HTML
;WITH Search_CTE (html_id, html_text)
AS (
SELECT h.id AS 'html_id'
, LEFT(h.html,REPLACE(PATINDEX('%<%',h.html)-1,-1,999999)) + SUBSTRING(h.html,CONVERT(INT,REPLACE(PATINDEX('%>%',h.html)+1,1,999999)),LEN(h.html)) AS 'html_text'
FROM @HTML AS h
WHERE h.html LIKE '%' + REPLACE(@Search,' ','%') + '%'
UNION ALL
SELECT c.html_id AS 'html_id'
, LEFT(c.html_text,REPLACE(PATINDEX('%<%',c.html_text)-1,-1,999999)) + SUBSTRING(c.html_text,CONVERT(INT,REPLACE(PATINDEX('%>%',c.html_text)+1,1,999999)),LEN(c.html_text)) AS 'html_text'
FROM Search_CTE AS c
WHERE PATINDEX('%<%',c.html_text) > 0
)
SELECT h.html AS 'Original HTML'
, cte.html_text AS 'HTML Text'
FROM Search_CTE AS cte
JOIN @HTML AS h
ON h.id = cte.html_id
WHERE PATINDEX('%<%',cte.html_text) = 0 --** Filter out rows still containing HTML
AND html_text LIKE '%' + @Search + '%'; --** Filter out rows not matching the search criteria
Questa query ha la limitazione che non gestisce la situazione in cui> o < è nel testo, ma questo può essere codificato in giro, se necessario.
Il collegamento sopra indicato ha diverse opzioni e tutto ha Upsides/Downsides quindi qual è il miglior metodo finale e migliore –
@ SOF: Questa è una domanda giusta. Temo che dovrai valutare i vantaggi e gli svantaggi nel tuo scenario specifico per decidere se questa implementazione è ragionevole. Credo che sia. Le clausole 'LIKE' sono estremamente limitate, come dimostra la tua domanda in modo eloquente. Un indice full-text attentamente implementato potrebbe non essere perfetto, ma estende i limiti oltre ciò che è possibile con indici e query più semplici. – kbrimington