如何使用全文索引查找以特定字符或单词开头的记录?

How can i use full text index to find records which begin with a specific character or word?

我有以下查询 LIKE 条件:

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

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

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

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

如何使第二个查询 return 完全匹配的记录,即以 John.

开头的记录

想要的结果如下图所示:

你可以这样做:

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

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

开头的记录

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

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 替换为实体 table 主键。

注意,上面的查询将首先 select 包含字符串 John 的前 9999 条记录按匹配排名排序,第二个 SELECTJOINentity table 获取以 John 开头的记录。

为了让它更快地工作,并且根据您 table 中的记录数量,如果您不需要 Full- 的那么多结果,您可以降低 CONTAINSTABLE 调用中的 9999 数字文本搜索。只是不要让它成为 20,因为前 20 个匹配行不一定以 John 开头。

HTH