Функция SQL CONTAINS не отображает записи со словом «под», даже если вы используете поиск по ключевым словам - PullRequest
2 голосов
/ 18 октября 2019

У меня проблемы с отображением записей, содержащих слово "under", с помощью функции SQL CONTAINS . Я прочитал документацию Microsoft для этого и на основе там примера с использованием базы данных AdventureWorks набор результатов, как и ожидалось, но с трудом, когда тот же пример применяется для поиска записей, имеющих слово " в ".

enter image description here

Вот мой сценарий, над которым я работаю, который вы также можете выполнить для моделирования сценария:

--Creating table
CREATE TABLE MyTable
(
   ID INT NOT NULL IDENTITY(1,1),
   [Description] NVARCHAR(200) NULL
   CONSTRAINT PK_ID PRIMARY KEY CLUSTERED (ID)
)

--Populating table
INSERT INTO MyTable
SELECT 'Testing'
UNION SELECT 'This is it'
UNION SELECT 'Under the name of whoever'
UNION SELECT 'I undergo surgery'
UNION SELECT 'Under Armour'
UNION SELECT 'Frequent under the table'
UNION SELECT 'I am underpaid too'
UNION SELECT 'Anything under the sun'
UNION SELECT 'What is the matter peanut butter'
UNION SELECT 'Underline'
UNION SELECT 'Chainring Bolts'
UNION SELECT 'Chaining Nut'
UNION SELECT 'Chainring'
UNION SELECT 'Chain Stays'
UNION SELECT 'Chain'
UNION SELECT 'Dummy Chain'
UNION SELECT 'Land Down Under'
UNION SELECT 'Many Underlings'
UNION SELECT 'Only Undo'

--One time setup to enable fulltext search
EXEC sp_fulltext_database 'enable'
GO
CREATE FULLTEXT CATALOG FTCSearch
GO
CREATE FULLTEXT INDEX ON MyTable([Description])
   KEY INDEX PK_ID ON FTCSearch
GO

Запрос:

--Query showing phrases that have c prefix
SELECT * FROM MyTable
WHERE CONTAINS([Description], ' "c*" ')
--Getting the expected result

enter image description here

--Query showing phrases that have u prefix
SELECT * FROM MyTable
WHERE CONTAINS([Description], ' "under*" ')
--Not getting expected result: Missing phrases that contains 'under' word
--Missing: Under the name of whoever
--Missing: Under Armour
--Missing: Frequent under the table
--Missing: Anything under the sun
--Missing: Land Down Under
--Missing: Under the name of whoever

enter image description here

Ответы [ 2 ]

1 голос
/ 18 октября 2019

У меня была такая же проблема. Я сделал ниже запрос, тогда он начал работать для меня.

ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = OFF

DECLARE @SearchWord varchar(200)='Under'

SELECT * FROM MyTable
WHERE CONTAINS(Description, @SearchWord);
0 голосов
/ 22 октября 2019

Получил идею из отзывов Roger Wolf и VBAGuy : 1. Создайте пользовательский стоп-лист на основе системы / по умолчанию 2. Удалите нижнее слово из пользовательского стоп-листа 3Примените созданный пользовательский стоп-лист к Mytable

--1. Create custom stoplist based on system stopwords
CREATE FULLTEXT STOPLIST myStoplist FROM SYSTEM STOPLIST;

--2. Remove 'under' stopword in stoplist
ALTER FULLTEXT STOPLIST myStoplist DROP 'under' LANGUAGE 'English';
ALTER FULLTEXT STOPLIST myStoplist DROP 'under' LANGUAGE 'British English';
ALTER FULLTEXT STOPLIST myStoplist DROP 'under' LANGUAGE 'Simplified Chinese';
ALTER FULLTEXT STOPLIST myStoplist DROP 'under' LANGUAGE 'Thai';
ALTER FULLTEXT STOPLIST myStoplist DROP 'under' LANGUAGE 'Swedish';
ALTER FULLTEXT STOPLIST myStoplist DROP 'under' LANGUAGE 'Japanese';
ALTER FULLTEXT STOPLIST myStoplist DROP 'under' LANGUAGE 'Traditional Chinese';
ALTER FULLTEXT STOPLIST myStoplist DROP 'under' LANGUAGE 'Neutral';

--Check if successfully removed
SELECT * FROM sys.fulltext_stopwords WHERE stopword = 'under'

--3. Apply the custom stoplist to the table instead of the 'SYSTEM' as the default
ALTER FULLTEXT INDEX ON MyTable SET STOPLIST = myStoplist
...