2016-06-28 4 views
6

Мы добавили свободный текстовый поиск по следующей таблице:SQL Azure СОДЕРЖИТ не возвращает все результаты

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

Но только

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

возвращается:

| 1 | kayer-meyar | 

While,

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

возвращается как:

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

когда мы бежим:

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

возвращается:

ka-me 
ka 
me 

ответ

3

После поиска и настройки вашей проблемы я нашел две основные неисправности в полнотекстового поиска:

  1. Дефис может рассматриваться как слово разорвать. Он возвращает только | 1 | kayer-meyar |, когда я использую '"ME*"'. он не возвращает | 2 | KA-ME |. Проблема заключается в том, что в вашем состоянии разрешено только начало слова (не end with или in a middle) ME + at least one character. Вы можете сказать, ", тогда как он возвращается | 1 | kayer-meyar | как строка me находится посреди этого слова?". Хорошо, что это потому, что полнотекстовый serach не считает это словом слова, он рассматривает это как два отдельных слова (что-то вроде kayer meyar), таким образом он заполняет запрос (me*). Опять же в случае KA-ME его признают KA ME, а не одно слово, и он также не в состоянии (хотя это звезда с ME, но нет никаких дополнительных символов после этого)
  2. Вы пробовали восстанавливать свой полнотекстовый индекс? ,

Теперь РЕШЕНИЕ является: Я Выключайте список Stop для полнотекстового поиска Query Используйте этот запрос для этого (мое имя таблицы MyTable):

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF 

, тогда запустите свой запрос. на этот раз вы получите результат своего желания. enter image description here

И ВОТ МОЙ ПОЛНЫЙ ЗАПРОС:

--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

спасибо, отличный ответ! –

0

Попробуйте выполнить запрос: SELECT * из sys.dm_fts_parser ('»kayer- meyar ", 1033, NULL, 0)

ME is ни слова в Kayer-meyar и hecne вы не можете получить результаты.

+0

Пожалуйста, прочитайте вопрос, единственный результат, который я получаю, это «kayer-meyar», так как вы можете видеть, что я «me *», чтобы найти все слова префиксы –

2

поведение вы описали, является следствием использования системного списка игнорируемых слов правильно. Это ожидаемое поведение. «Me» - это стоп-слово, которое существует в списке остановок системы. Список системных столов, используемый по умолчанию процессом индексирования данных.

Вы можете проверить себя с помощью этого сценария:

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

Третий параметр здесь идентификатор списка стоп-слов. Когда вы передаете NULL, при разборе не идентифицируются стоп-слова, и вы видите «ME» типа «Точное совпадение». Когда вы передаете 0 в качестве третьего параметра, используется список системных столов, а «ME» будет иметь тип «Шумное слово». Это означает, что SQL Server не сохранит его в индексе FTS для поиска.

Как упоминал Райхан, вы можете отключить список системных столов, но, как и для меня, полностью отключить стоп-слова - это слишком большой молот, особенно для базы данных Azure SQL, потому что вы должны заплатить за дополнительное пространство (индексы FTS хранятся в одна и та же база данных во внутренних таблицах). Создание нового (меньшего) списка заметок и использование его для FTS может быть лучшим решением.

Смежные вопросы