Полнотекстовый поиск не работает, если стоп-слово включено, даже если список стоп-слов пуст

Я хотел бы иметь возможность искать каждое слово, поэтому я очистил список стоп-слов. Чем я перестроил index. Но, к сожалению, если я ввожу поисковое выражение со стоп-словом, оно все равно не возвращает строку. Если я пропущу только стоп-слово, я получу результаты. Например. "двойное ношение остается на месте" - нет результата, "двойное ношение остается на месте" - я получаю результаты, которые на самом деле также содержат "in".

Кто-нибудь знает, почему это может быть? Я использую SQL Server 2012 Express.

Большое спасибо!


person apolka    schedule 06.10.2012    source источник


Ответы (3)


Тем временем мне удалось решить проблему. Проблема была в том, что у меня был свой стоп-лист, который действительно был пуст, но мой полнотекстовый каталог был привязан не к моему стоп-листу, а к системному. Вот несколько полезных запросов для решения проблем со стоп-словами и полнотекстовым поиском:

Запросить стоп-слова (системные не возвращает!):

select * from sys.fulltext_stopwords

Запросить стоп-листы (не возвращает системный список!):

select * from sys.fulltext_stoplists

Проверьте, какие слова входят в каталог:

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

Проверьте ассоциацию:

select fulltext_catalog_id,stoplist_id, * from sys.fulltext_indexes;

Отключить стоп-лист:

ALTER FULLTEXT INDEX ON CremeSearchFT SET STOPLIST = OFF

Я надеюсь, что это поможет кому-то. :)

person apolka    schedule 06.10.2012
comment
Вы имеете в виду, что ваш «полнотекстовый каталог» не был связан с стоп-листом или вашим «полнотекстовым указателем»? У меня проблема с моим собственным стоп-листом. - person Ruud van de Beeten; 06.12.2012
comment
можно ли посмотреть системный список и системные! - person canbax; 28.09.2018

Основываясь на моих исследованиях, это связано с опцией стоп-листа полнотекстового индекса, одним из основных свойств полнотекстового индекса. Если вы установите для этого параметра значение «Система», все ключевые слова, включенные в «Список остановки системы», будут недоступны для ваших предложений CONTAINS(), и, к сожалению, для таких случаев не будет наборов результатов. Решение;

Чтобы установить эту опцию в положение «ВЫКЛ», это позволит обойти проверку стоп-листа в вашем языковом наборе. Например, you на английском, sen на турецком. Они помечены как стоп-слова, и для SQL Server Engine имеет смысл исключить их из таких поисков, если только вы не установите параметр «система». Поэтому не используйте опцию «Система». Для этого запустите следующий скрипт в базе данных, в которой существует ваша таблица:

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = OFF

Для создания собственного стоп-листа. В этом случае вы можете определить свои специальные стоп-слова и создать специальные стоп-листы. Таким образом, будут обрабатываться только эти, поскольку они не будут иметь никакого смысла для SQL Server Engine. Как только вы создадите его, вы можете начать использовать его, запустив следующие скрипты:

CREATE FULLTEXT STOPLIST myStoplist

GO

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

GO

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = [myStoplist]

GO

Надеюсь, это поможет :) Удачи...

person Seyit    schedule 30.07.2015

Если кому-то интересно, я конкретизировал запрос проверки ассоциации в ответе apolka, чтобы получить более четкие результаты:

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

Так глупо, что этот материал отсутствует в SSMS!

person richardwvm    schedule 06.07.2017