0

我在 Windows Server 2003 R2 上使用 SQL Server 2008 R2 作为文章数据库。我有一个带有该文章名称的字段。这里有些例子:

  • NYM-J 3X1,5 格劳环 100 m
  • NYM-O 3X1,5 格劳滚筒
  • NYM-O 3X1,5 格劳环 100 m
  • NYM-J 3X1,5 格劳环 50 m
  • NYM-J 3X1,5 格劳滚筒 500 m
  • INSTALLATIONSLEITUNG NYM-J 3X1,5

当我使用以下 sql 命令时

SELECT Name FROM Articles WHERE CONTAINS(Name, '"NYM-J 3X1,5"');

我希望只有带有 NYM- J 3X1,5 的文章会被退回,但以上所有带有 NYM- O的文章也会被退回。那么我做错了什么?

谢谢!

4

1 回答 1

0

您可以使用sys.dm_fts_parser解析两个字符串:

select * from sys.dm_fts_parser('"NYM-J 3X1,5"', 1033, 0, 0)
select * from sys.dm_fts_parser('"NYM-O 3X1,5"', 1033, 0, 0)

解释结果有点尴尬,因为文档没有涵盖所有细节(例如,a phrase_idof zero 是什么意思?)。但我最好的理解是 FTS 解析器已将“nym”识别为匹配项,并且“nymo”和“nymj”都被认为是“nym”的替代形式(因为它们具有相同group_id但不同的phrase_id)。因此,两个搜索词是相同的,因为 FTS 认为“nym”、“nymj”和“nymo”在全文搜索中是等价的。

由于关于 FTS 解析器的文档很少,很难说一个解决方案可能是什么,尽管最明显的一个是因为你想要一个精确的匹配,你可以使用LIKE. 全文搜索实际上是用于使用单词和短语搜索自然语言文本,它不是通用文本解析器。

于 2013-05-08T16:06:20.723 回答