如何使用全文索引查找以特定字符或单词开头的记录?
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 条记录按匹配排名排序,第二个 SELECT
将 JOIN
到 entity
table 获取以 John 开头的记录。
为了让它更快地工作,并且根据您 table 中的记录数量,如果您不需要 Full- 的那么多结果,您可以降低 CONTAINSTABLE
调用中的 9999 数字文本搜索。只是不要让它成为 20,因为前 20 个匹配行不一定以 John 开头。
HTH
我有以下查询 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 条记录按匹配排名排序,第二个 SELECT
将 JOIN
到 entity
table 获取以 John 开头的记录。
为了让它更快地工作,并且根据您 table 中的记录数量,如果您不需要 Full- 的那么多结果,您可以降低 CONTAINSTABLE
调用中的 9999 数字文本搜索。只是不要让它成为 20,因为前 20 个匹配行不一定以 John 开头。
HTH