Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如果包含停止字,即使停止字列表为空,全文搜索也不起作用_Sql Server_Full Text Search_Stop Words_Sql Server 2012 Express - Fatal编程技术网

Sql server 如果包含停止字,即使停止字列表为空,全文搜索也不起作用

Sql server 如果包含停止字,即使停止字列表为空,全文搜索也不起作用,sql-server,full-text-search,stop-words,sql-server-2012-express,Sql Server,Full Text Search,Stop Words,Sql Server 2012 Express,我想能够搜索每个单词,所以我已经清除了停止词列表。然后我重建了索引。但不幸的是,如果我在搜索表达式中键入stop单词,它仍然不会返回任何行。如果我只漏掉停止词,我会得到结果。例如,“双磨损固定位置”-无结果,“双磨损固定位置”-我得到的结果实际上也包含“in” 有人知道为什么会这样吗?我正在使用SQL Server 2012 Express 非常感谢 与此同时,我设法解决了这个问题。问题是,我有自己的停止列表,它确实是空的,但我的全文目录并没有与我自己的停止列表关联,而是与系统列表关联。以下是解

我想能够搜索每个单词,所以我已经清除了停止词列表。然后我重建了索引。但不幸的是,如果我在搜索表达式中键入stop单词,它仍然不会返回任何行。如果我只漏掉停止词,我会得到结果。例如,“双磨损固定位置”-无结果,“双磨损固定位置”-我得到的结果实际上也包含“in”

有人知道为什么会这样吗?我正在使用SQL Server 2012 Express


非常感谢

与此同时,我设法解决了这个问题。问题是,我有自己的停止列表,它确实是空的,但我的全文目录并没有与我自己的停止列表关联,而是与系统列表关联。以下是解决stopword和全文搜索问题的两个有用查询:

查询停止字(不返回系统字!):

查询停止列表(不返回系统列表!):

检查目录中包含的单词:

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

我希望它能帮助别人

根据我的研究,它与全文索引的主要属性之一的全文索引停止列表选项有关。 如果将此选项设置为“系统”,则“系统停止列表”中包含的所有关键字将无法用于
CONTAINS()
子句,不幸的是,对于此类情况,将没有结果集。 解决方案

若要将此选项设置为“关闭”,将绕过语言集中的停止列表检查。 例如,你用英语,森用土耳其语。这些词被标记为停止词,在此类搜索中排除SQL Server引擎是有意义的,除非您设置了“系统”选项。因此,不要使用“系统”选项。 为此,请在您的表所在的数据库上运行以下脚本:

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = OFF
创建自己的停止列表。在这种情况下,您可以定义特殊的停止词并创建特定的停止列表。因此,只有这些将被处理,因为它们对SQL Server引擎没有任何意义。 创建后,您可以通过运行以下脚本开始使用它:

CREATE FULLTEXT STOPLIST myStoplist

GO

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

GO

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = [myStoplist]

GO
我希望这有帮助:)
祝你好运…

如果有人感兴趣,我在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中缺少这些东西

您的意思是您的“全文目录”与停止列表或“全文索引”没有关联吗?我自己的停止列表有问题。是否可以查看系统列表和系统列表!
CREATE FULLTEXT STOPLIST myStoplist

GO

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

GO

ALTER FULLTEXT INDEX ON table_name SET STOPLIST = [myStoplist]

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