【问题标题】:Full text search CONTAINSTABLE全文搜索 CONTAINSTABLE
【发布时间】:2012-02-03 13:22:24
【问题描述】:

我有很多字段的表。为了在此表中搜索信息,我使用全文搜索。当我尝试查找电话号码或 Skype 姓名字段中存在三个零的行时,我也使用正确的记录,获取包含一些带有点和数字的字符串的记录(例如 string.87)

我使用下面的查询

DECLARE @SearchCondition nvarchar(100) = '"000*"'

SELECT e.Id, e.FirstName, e.LastName, e.PhoneNumber, e.SkypeName
FROM dbo.Employee e
    INNER JOIN CONTAINSTABLE([dbo].[Employee], *, @SearchCondition, Language 0) as fti ON e.Id = fti.[KEY]

我得到以下结果:

Id  FirstName   LastName     PhoneNumber    SkypeName
14  name1       name1      3903749282      000skypename
20  name90      name.90    3906773464      skypename_str
21  name2       name2      3906769539      skypename.87

有办法解决吗? 谢谢!

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql


    【解决方案1】:

    您可以在分词器完成后看到您的搜索词的样子:

    SELECT display_term FROM sys.dm_fts_parser('"000*"', 0, NULL, 0);
    

    获取:

    000
    nn0
    

    (有关文档,请参阅 http://msdn.microsoft.com/en-us/library/cc280463.aspx。)

    第二个术语 0 是您为分词器指定的语言。您正在指定中性分词器,它似乎将多个零四舍五入。

    将其更改为英文 (1033):

    SELECT display_term FROM sys.dm_fts_parser('"000*"', 1033, NULL, 0);
    

    ...使查询执行您想要的操作,但您可能有其他原因使用语言 0。如果您未在 CONTAINSTABLE 中指定语言,它将使用该列被索引的语言。

    CONTAINSTABLE([dbo].[Employee], *, @SearchCondition)
    

    ..为你工作?

    编辑

    在玩了一会儿之后,看起来中性断词器也在尝试以科学记数法查找数字参数:

    SELECT * FROM sys.dm_fts_parser('850000000000000', 0, NULL, 0);
    
    850000000000000
    nn8d5e+014
    

    【讨论】:

      【解决方案2】:

      如果您不想匹配除 PhoneNumber 和 SkypeName 之外的列中的数据,请将列从“*”更改为您想要的列。

      CONTAINSTABLE([dbo].[Employee], (PhoneNumber, SkypeName), @SearchCondition, Language 0)
      

      此外,如果它尚未启动,请查看索引的后台更新。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-08-16
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多