2016-06-28 34 views
6

Abbiamo aggiunto una ricerca libera del testo nella seguente tabella:SQL Azure non CONTIENE tornare tutti i risultati

| 1 | kayer-meyar | 
| 2 | KA-ME | 

Ma,

select * 
from Names 
where CONTAINS(name, '"ME*"') 

solo rendimenti:

| 1 | kayer-meyar | 

Mentre,

select * 
from Names 
where CONTAINS(name, '"KA*"') 

rendimenti sia:

| 1 | kayer-meyar | 
| 2 | KA-ME | 

quando si corre:

select * 
from sys.dm_fts_parser('"KA-ME"', 1033, NULL, 0) 

rendimenti:

ka-me 
ka 
me 

risposta

3

Dopo la ricerca e la messa a punto il vostro problema Ho trovato due errore grave nella ricerca full-text:

  1. Il trattino può essere trattato come una parola rompere. Restituisce solo | 1 | kayer-meyar | quando uso '"ME*"'. non restituisce | 2 | KA-ME |. Il problema è dovuto al fatto che le condizioni consentono solo l'inizio della parola (non end with o in a middle) ME + at least one character. Puoi dire, "allora come viene restituito | 1 | kayer-meyar | come stringa me è nel mezzo di questa parola?". Bene, è perché il full-text serbo non lo considera come una parola di silice, lo considera come una parola separata (qualcosa come kayer meyar), quindi riempie la richiesta (me*). Anche in questo caso, nel caso di KA-ME essa riconosce come KA ME piuttosto che una sola parola e anche fallire la condizione (anche se stella con ME ma non v'è alcun carattere in più dopo che)
  2. Hai provato ricostruzione di un indice full-text? .

Ora il SOLUZIONE è: Ho Spegnere l'Elenco Stop per il testo completo Ricercare utilizzare questa query per questo (il mio nome della tabella è MyTable):

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

quindi eseguire la query. questa volta otterrai il risultato desiderato. enter image description here

Ed ecco la mia domanda completa:

--CREATE TABLE MyTable 
--(
--Id INT IDENTITY(1,1), 
--Name varchar(max) Not Null 
--) 

---- To see if FULLTEXT installed or not 
--SELECT SERVERPROPERTY('IsFullTextInstalled') 

---- http://stackoverflow.com/questions/2306825/why-cant-i-create-this-sql-server-full-text-index 
---- https://technet.microsoft.com/en-us/library/ms187317.aspx 
---- http://stackoverflow.com/questions/2306825/why-cant-i-create-this-sql-server-full-text-index 
---- http://stackoverflow.com/questions/2315577/sql-server-2008-full-text-search-on-a-table-with-a-composite-primary-key 

--CREATE UNIQUE INDEX ui_MyTable ON MyTable(Id); 
--select name from sysindexes where object_id('MyTable') = id; 

--CREATE FULLTEXT CATALOG ft AS DEFAULT; 

--CREATE FULLTEXT INDEX ON MyTable(Name) 
-- KEY INDEX ui_MyTable 
-- WITH STOPLIST = SYSTEM; 
--GO 

--INSERT INTO MyTable(Name) VALUES('kayer-meyar'),('KA-ME'); 


ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

select * 
from MyTable 
where CONTAINS(Name, '"ME*"') 

select * 
from MyTable 
where CONTAINS(Name, '"KA*"') 
+0

grazie, ottima risposta! –

0

Provare a eseguire la query: SELECT * da sys.dm_fts_parser ('" kayer- meyar "", 1033, NULL, 0)

ME è non una parola in Kayer-meyar e hecne potresti non ottenere i risultati.

+0

Si prega di leggere la domanda, l'unico risultato che sto ottenendo è "kayer-meyar", come potete vedere io sono "me *" per trovare tutte le parole prefissi –

2

Il comportamento che hai descritto è una conseguenza dell'utilizzo di lista sistema stopword è corretta. Questo è un comportamento previsto. "Io" è una parola d'arresto, che esiste nell'elenco delle parole d'arresto del sistema. Elenco di stopword di sistema utilizzato per impostazione predefinita dal processo di indicizzazione dei dati.

Potete verificare voi stessi con questo script:

select * from sys.dm_fts_parser('"KA-ME"', 1033, 0, 0) 

Il terzo parametro qui è identificatore lista stopword. Quando si passa NULL, le stopword non vengono identificate durante l'analisi e viene visualizzato "ME" di tipo "Corrispondenza esatta". Quando si passa 0 come terzo parametro, viene utilizzato l'elenco di stopword di sistema e "ME" sarà di tipo "Word Noise". Ciò significa che SQL Server non lo salverà nell'indice FTS per la ricerca.

Come accennato da Raihan, è possibile disattivare l'elenco delle parole d'arresto del sistema, ma per quanto mi riguarda, disattivare completamente le stopword è un martello troppo grande, soprattutto per il database SQL di Azure, perché è necessario pagare spazio aggiuntivo (gli indici FTS sono memorizzati in lo stesso database nelle tabelle interne). Creare una nuova (più piccola) lista di parole chiave e usarla per FTS potrebbe essere una soluzione migliore.