【问题标题】:Full-Text Catalog unable to search Primary Key全文目录无法搜索主键
【发布时间】:2011-09-28 10:13:56
【问题描述】:

我已经创建了这个小样本表人。

Id是主键,是identity = True

现在,当我尝试创建全文目录时,我无法搜索 ID。

如果我按照这个向导进行操作,我最终会得到一个目录,它只能在其中搜索人名。我真的很想知道,如何才能对 Id 和 Name 进行全文搜索。

编辑

SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, 'anders' );

SELECT *
FROM [TestDB].[dbo].[Person]
WHERE FREETEXT (*, '1' );

我希望它们返回相同的结果,第一个返回 id = 1 name = Anders,而第二个查询不返回任何内容。

编辑 2

看起来问题出在使用 int,但不能欺骗 FullText 来支持它吗?

编辑 3

创建了一个视图,我将 int 转换为 nvarchar。 CONVERT(nvarchar(50), Id) AS PersonId 这确实使我可以在创建全文目录时选择该列,但它仍然无法让我在搜索 Id 时找到它。

【问题讨论】:

    标签: sql sql-server full-text-search sql-server-2008-r2


    【解决方案1】:

    通过阅读您的问题,我不确定您是否理解全文索引的目的。全文索引旨在搜索表上的 TEXT(一个或多个列)。而不仅仅是作为替代品:

    SELECT *
    FROM table
    WHERE col1 LIKE 'Bob''s Pizzaria%'
    OR col2 LIKE 'Bob''s Pizzaria%'
    OR col3 LIKE 'Bob''s Pizzaria%'
    

    它还允许您搜索“Bob's Pizzaria”的变体,例如“Bobs Pizzeria”(以防有人拼错 Pizzeria 或忘记输入 ' 或过度热心的反 SQL - 注入代码去除了 ') 或“Robert's Pizza”或“Bob's Pizzeria”或“Bob's Pizza”等。它还允许您在文本列(char、varchar、nchar、nvarchar 等)的“中间”搜索.) 没有可怕的“%Bob%Pizza%”,它消除了使用传统索引的任何机会。

    不过,讲座已经够了。为了回答您的具体问题,我将创建一个单独的列(不是“计算列”)“IdText varchar(10)”,然后创建一个 AFTER INSERT 触发器,如下所示:

    UPDATE t
    SET IdText = CAST(Id AS varchar(10))
    FROM table AS t
    INNER JOIN inserted i ON i.Id = t.Id
    

    如果您不知道“插入”是什么,请参阅MSDN article 或在 Stack Overflow 中搜索“已插入触发器”。然后,您可以在全文索引中包含 IdText 列。

    再次,从您的示例中,我不确定您是否应该在此处使用全文索引,但是您的实际情况可能会有所不同,您刚刚为该问题创建了此示例。此外,全文索引相对“昂贵”,因此请务必进行成本效益分析。这是一个关于全文索引使用的Stack Overflow 问题。

    【讨论】:

      【解决方案2】:

      为什么不直接做这样的查询。

      SELECT *
      FROM [TestDB].[dbo].[Person]
      WHERE FREETEXT (*, '1' )
      OR ID = 1
      

      如果首先检查搜索词是否为数字,则可以省略“OR ID = 1”部分。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多