我希望能够搜索每个单词,所以我已经清除了单词列表。比我重建了索引。但不幸的是,如果我输入一个带有停用词的搜索表达式,它仍然不会返回任何行。如果我遗漏了停止词,我会得到结果。例如。 “双重磨损留在原地” - 没有结果,“双重磨损停留的地方” - 我得到的结果实际上也包含“in”。
有谁知道为什么会这样?我正在使用SQL Server 2012 Express。
非常感谢!
答案 0 :(得分:29)
与此同时,我设法解决了这个问题。问题是我有自己的停止列表,确实是空的,但是我的全文目录与我自己的停止列表无关,而是与系统关联。以下是一些解决停用词和全文搜索问题的有用查询:
查询停用词(不回馈系统词!):
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
我希望它有助于某人。 :)
答案 1 :(得分:4)
根据我的研究,它与全文索引停止列表选项相关,全文索引是全文索引的主要属性之一。
如果您将此选项设置为" System",则"系统停止列表"中包含的所有关键字将不适用于您的CONTAINS()
条款,遗憾的是,此类案例不会有任何结果集。
解;
将此选项设置为" OFF"这将绕过您的语言集中的停止列表检查。 例如你用英语, sen 用土耳其语。这些标记为停用词,除非您设置" system"否则将在此类搜索中排除SQL Server引擎。选项。所以,不要使用" System"选项。 为此,请在您的表存在的db上运行以下脚本:
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
我希望这有帮助:) 祝你好运......
答案 2 :(得分:1)
如果有人有兴趣,我在apolka的答案中充实了支票关联查询,以便提供更清晰的结果:
class MainViewModel:INotifyPropertyChanged
{
private ObservableCollection<TreeItem> _arbol =
new ObservableCollection<TreeItem>(
new List<TreeItem>
{
new TreeItem("Remedys")
} );
public ObservableCollection<TreeItem> Arbol
{
set
{
_arbol = value;
OnPropertyChanged("Arbol");
}
get { return _arbol; }
}
public MainViewModel()
{
//Populate Arbol
...
}
}
SSMS缺少这些东西!