【问题标题】:How can i use full text index to find records which begin with a specific character or word?如何使用全文索引查找以特定字符或单词开头的记录?
【发布时间】:2017-02-24 08:32:32
【问题描述】:

我有以下带有LIKE 条件的查询:

Select top 20 * from entity with(NOLOCK) where first like 'john%'

上述查询将返回名字以 John 开头的员工。 现在使用全文索引搜索进行相同的查询:

Select top 20 * from entity with(NOLOCK) WHERE Contains(First,'John').

以上代码返回名字中包含phase john的所有记录。

如何使第二个查询返回完全匹配的记录,即以John开头的记录。

想要的结果如下图所示:

【问题讨论】:

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


    【解决方案1】:

    你可以这样做:

    WITH cte AS (
        SELECT * FROM entity WHERE Contains(First,'John')
    ) 
    SELECT TOP 20 * FROM cte WHERE cte.First like 'John%'
    

    这样,全文搜索将选择包含 John 的所有记录,而外部 SELECT ... LIKE 将仅选择以 John 开头的记录。

    更新:您还可以通过匹配排名来排序内部全文搜索结果,然后像这样加入您的entity 表:

    WITH cte AS (
        SELECT [KEY],[Rank] from CONTAINSTABLE(entity, First, 'John', 9999)
    ) 
    SELECT TOP 20 e.* from cte
        INNER JOIN entity e on cte.[Key]=e.PK_Entity
    WHERE e.First like 'John%' 
    

    将 e.PK_Entity 替换为实体表主键。

    注意,上面的查询将首先选择包含字符串 John 的前 9999 条记录,按匹配 Rank 排序,第二个 SELECTJOINentity 表中以获取以 John 开头的那些记录。

    如果您不需要来自全文搜索的这么多结果,为了使其更快地工作并且根据您表中的记录数,您可以降低CONTAINSTABLE 调用中的 9999 数字。只是不要将其设为 20,因为前 20 个匹配行不一定以 John 开头。

    HTH

    【讨论】:

    • 谢谢安德鲁斯!这对更大的数据库(大数据)是否有效。
    • @Avi 嗯,您可能需要调整初始 FTS 搜索结果。如果您不能在单个页面视图中显示所有 9999 条记录,您可以将此值更改为 1000,例如并观察执行时间。
    • @Avi,您的表在First 列上是否有适当的非聚集索引?如果是,您使用 LIKE 的原始查询是否需要花费太多时间才能完成?
    • 是的,你是对的,我不会一次性显示 10000 条记录,而是使用 typeahead js 搜索并显示 50 条记录。
    • @Avi entity 表的大小是多少?你有我前面提到的索引吗?您绝对应该尝试 1. LIKE 只查询索引 2. 将 FTS TOP 记录阈值从 9999 更改为 200-300。请接受我对您仍待解决的问题的修改。
    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多