9

Vorrei poter cercare ogni parola, quindi ho cancellato l'elenco delle parole di arresto. Di quanto ho ricostruito l'indice. Ma sfortunatamente se scrivo un'espressione di ricerca con la parola stop al suo interno, non restituisce ancora alcuna riga. Se tralascio solo la parola stop, ottengo i risultati. Per esempio. "il doppio wear rimane sul posto" - nessun risultato, "double wear stay place" - Ottengo anche i risultati che contengono effettivamente "in".La ricerca a testo integrale non funziona se la parola di arresto è inclusa anche se l'elenco delle parole di arresto è vuoto

Qualcuno sa perché questo può essere? Sto usando SQL Server 2012 Express.

Grazie mille!

risposta

23

Nel frattempo sono riuscito a risolvere il problema. Il problema era che avevo una mia lista di stop che era davvero vuota ma il mio catalogo di testo completo non era associato alla mia lista personale ma a quella di sistema. Qui ci sono un paio di domande utili per la risoluzione di stopword e pieno temi di ricerca del testo: (! Non restituire quelli di sistema)

stopwords Query:

select * from sys.fulltext_stopwords 

liste di arresto di query (non restituisce il sistema elencare):!

select * from sys.fulltext_stoplists 

controllare quello che le parole sono inclusi nel catalogo:

SELECT * FROM sys.dm_fts_index_keywords(DB_ID('dbname'), OBJECT_ID('tablename')) 

Verificare l'associazione:

select fulltext_catalog_id,stoplist_id, * from sys.fulltext_indexes; 

Accendere STOPLIST off:

ALTER FULLTEXT INDEX ON CremeSearchFT SET STOPLIST = OFF 

Spero che aiuta qualcuno. :)

+0

Vuoi dire che il tuo "catalogo di testo completo" non è stato associato alla lista di stop o al tuo "indice di testo completo"? Sto avendo un problema con la mia lista personale. –

3

In base alle mie ricerche, è correlato all'opzione Elenco di indice completo di testo, una delle proprietà principali dell'indice full-text. Se si imposta questa opzione su "Sistema", tutte le parole chiave incluse in "Elenco interruzioni di sistema" non saranno disponibili per le clausole CONTAINS() e sfortunatamente non ci saranno set di risultati per tali casi. Soluzione;

Per impostare questa opzione su "OFF" che ignorerà il controllo dell'elenco di stop nella lingua impostata. Ad esempio in inglese, sen in turco. Questi sono contrassegnati come parole di arresto e sarà logico escludere SQL Server in tali ricerche, a meno che non si imposti l'opzione "sistema". Quindi, non utilizzare l'opzione "Sistema". Per fare questo, i pls eseguire il seguente script sui db cui la vostra tabella esiste:

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = OFF 

Per creare la tua lista di arresto. In questo caso, è possibile definire le parole di arresto speciali e creare elenchi di stop specifici. In questo modo, solo questi verranno trattati in quanto non hanno alcun senso per SQL Server Engine. Una volta creato, è possibile iniziare a utilizzare questo eseguendo i seguenti script:

CREATE FULLTEXT STOPLIST myStoplist 

GO 

ALTER FULLTEXT STOPLIST [myStoplist] ADD 'you' LANGUAGE 'English' 

GO 

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = [myStoplist] 

GO 

Spero che questo aiuta :) Buona fortuna ...

0

Nel caso in cui qualcuno è interessato, io concretizzati la query associazione check-in risposta di apolka per dare risultati più leggibili:

--Check the association: 
SELECT 
    ft_c.name AS [Catalog], 
    s.name AS [Schema], 
    o.name AS [Table], 
    [StopList] = 
    CASE 
     WHEN ft_i.stoplist_id IS NULL THEN 'None' 
     ELSE ISNULL(ft_sl.NAME, 'System') 
    END 
FROM 
    sys.fulltext_indexes AS ft_i LEFT OUTER JOIN 
    sys.fulltext_stoplists AS ft_sl ON ft_sl.stoplist_id = ft_i.stoplist_id INNER JOIN 
    sys.fulltext_catalogs AS ft_c ON ft_c.fulltext_catalog_id = ft_i.fulltext_catalog_id INNER JOIN 
    sys.objects AS o ON o.object_id = ft_i.object_id INNER JOIN 
    sys.schemas AS s ON s.schema_id = o.schema_id 

Allora stupido questa roba non è presente SSMS!

Problemi correlati