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

时间:2012-10-06 10:40:42

标签: sql-server full-text-search stop-words sql-server-2012-express

我希望能够搜索每个单词,所以我已经清除了单词列表。比我重建了索引。但不幸的是,如果我输入一个带有停用词的搜索表达式,它仍然不会返回任何行。如果我遗漏了停止词,我会得到结果。例如。 “双重磨损留在原地” - 没有结果,“双重磨损停留的地方” - 我得到的结果实际上也包含“in”。

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

非常感谢!

3 个答案:

答案 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缺少这些东西!