热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer全文搜索/全文索引

全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类型的基于标记的功能

SQL Server 全文搜索/全文索引

全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类型的基于标记的功能性索引,它是由 SQL Server 全文引擎生成和维护的。生成全文索引的过程不同于生成其他类型的索引。全文引擎并非基于特定行中存储的值来构造 B 树结构,而是基于要编制索引的文本中的各个标记来生成倒排、堆积且压缩的索引结构。

概述

全文引擎使用全文索引中的信息来编译可快速搜索表中的特定词或词组的全文查询。全文索引将有关重要的词及其位置的信息存储在数据库表的一列或多列中。全文索引是一种特殊类型的基于标记的功能性索引,它是由 SQL Server 全文引擎生成和维护的。生成全文索引的过程不同于生成其他类型的索引。全文引擎并非基于特定行中存储的值来构造 B 树结构,而是基于要编制索引的文本中的各个标记来生成倒排、堆积且压缩的索引结构。

  • 全文索引是针对数据表,只能对表创建全文索引,不能对数据库创建全文索引。
  • 每个数据库可以不包含全文目录或包含多个全文目录,一个全文目录可以包含多个全文索引,但一个全文索引只能用于构成一个全文目录。
  • 一个数据表只能创建一个全文索引,一个全文索引可以包含多个字段。
  • 创建全文索引的表必须要有一个唯一的非空索引,并且这个唯一的非空的索引只能是一个字段,不能是组合字段。
  • 每个表只允许有一个全文索引。
  • 可以对以下类型的列创建全文索引:charvarcharncharnvarchartextntextimagexmlvarbinary 和 varbinary(max),从而可对这些列进行全文搜索。对数据类型为 varbinaryvarbinary(max)imagexml的列创建全文索引需要您指定类型列,类型列是用来存储每行中文档的文件扩展名(.doc、.pdf、xls 等)的表列。

注意:全文搜索是 SQL Server 数据库引擎的一个可选组件, 如果你在安装 SQL Server 时没有选择全文搜索,请再次运行 SQL Server 安装程序来添加它。

如果已安装了全文搜索组件,可在服务中查看对应的服务是否有运行:

 

 

可以使用以下查询语句来查看对应的数据库是否已开启全文搜索:

SELECT DATABASEPROPERTY("{DatabaseName}", "isfulltextenabled");

 

如果返回结果是 0,可以使用以下脚本进行启用:

EXEC sp_fulltext_database "enable"

 

全文搜索查询与 LIKE 谓词的对比

LIKE与全文搜索不同,LIKE仅对字符模式有效。另外,不能使用LIKE来查询格式化的二进制数据。此外,对大量非结构化的文本数据执行LIKE查询要比对相同数据执行同样的全文查询慢得多。对数百万行文本数据进行的LIKE查询可能需要几分钟的时间才能返回结果;而对于同样的数据,全文查询只需要几秒甚至更少的时间,具体取决于返回的行数。

创建全文目录

全文目录用来存储全文索引。可以直接使用以下脚本进行创建:

CREATE FULLTEXT CATALOG DefaultFullTextCatalog;

 

或者使用管理工具的图形化界面进行创建:

 

 

为数据库表创建全文索引

为数据库表创建全文索引的时候需要指定对应的语言。因为不同的语言的分词都有所差异,SQL Server将会使用对应语言的分词器处理表中的数据。SQL Server的全文搜索支持大约 50 种不同语言,可通过查询sys.fulltext_languages表来查看所有支持的语言。

下面我们对Shop表的ShopName和ShopAddress两个字段添加简体中文的全文索引:

CREATE FULLTEXT INDEX ON [dbo].[Shop]
(  
    [ShopName] LANGUAGE 2052,
	[ShopAddress] LANGUAGE 2052
)  
KEY INDEX [PK_Shop] ON DefaultFullTextCatalog
WITH CHANGE_TRACKING AUTO

  

同样也可以使用管理工具的图形化界面进行创建:

 

 

全文搜索谓词/函数

全文查询使用全文谓词(CONTAINSFREETEXT)以及全文函数(CONTAINSTABLEFREETEXTTABLE)。它们支持复杂的 Transact-SQL 语法,这种语法支持各种形式的查询词。

CONTAINS

CONTAINS用于在 SQL Server 中搜索单个词和短语的精确或模糊(不太精确的)匹配项、在一定差别范围内的相近词或加权匹配项。

  • CONTAINS 文档

例如,查询商铺名或者地址中有福田的商铺:

SELECT * FROM dbo.Shop WHERE CONTAINS((ShopName, ShopAddress),N"福田")

 

CONTAINSTABLE

在查询方式上与CONTAINS几乎一样。但CONTAINSTABLE返回的是符合查询条件的表,在 SQL 语句中我们可以把它当作一个普通的表来使用,并且使用CONTAINSTABLE的查询对每一行返回一个相关性排名值 (RANK) 和全文键 (KEY)。RANK用于表示相关性的匹配程度,它的值在0~1000之间,KEY就是主表的ID。

  • CONTAINSTABLE 文档

所以我们的查询的时候可以使用RANK进行排序,将相关性高的排在前面:

SELECT T0.ShopID,
       T0.ShopName,
       T0.ShopAddress,
       T1.RANK
FROM dbo.Shop T0
    INNER JOIN CONTAINSTABLE
               (Shop, ShopAddress, N"福田") T1
        ON T0.ShopID = T1.[KEY]
ORDER BY T1.RANK DESC;

 

 

 

 

 

FREETEXT/FREETEXTTABLE

FREETEXT/FREETEXTTABLE的用法与 CONTAINS/CONTAINSTABLE一致。不同的在于FREETEXT/FREETEXTTABLE会先把要查询的词句先进行分词然后再查询匹配。

  • FREETEXT 文档
  • FREETEXTTABLE 文档

例如可以直接查询:福田的邮局,查询时SQL Server会自动拆分。

SELECT T0.ShopID,
       T0.ShopName,
       T0.ShopAddress,
       T1.RANK
FROM dbo.Shop T0
    INNER JOIN FREETEXTTABLE
               (Shop, (ShopName, ShopAddress), N"福田的邮局") T1
        ON T0.ShopID = T1.[KEY]
ORDER BY T1.RANK DESC;

 

 

 

另外,可以通过查询sys.dm_fts_parser来查看分词结果:

SELECT * FROM sys.dm_fts_parser (""福田的邮局"", 2052, 0, 0);

 

 

 

更多

以上只列举了SQL Server全文搜索的一些基本知识和简单的用法,更详细的内容可以查看微软的官方文档

  • 全文搜索文档

推荐阅读
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 为了确保数据库的高效运行,本文介绍了一种方法,通过编写定时任务脚本来自动清理 `order` 表中状态为 0 或为空的无效订单记录。该脚本使用 PHP 编写,并设置时区为中国标准时间,每 10 分钟执行一次,以保持数据库的整洁和性能优化。此外,还详细介绍了如何配置定时任务以及脚本的具体实现步骤。 ... [详细]
  • 在使用 Cacti 进行监控时,发现已运行的转码机未产生流量,导致 Cacti 监控界面显示该转码机处于宕机状态。进一步检查 Cacti 日志,发现数据库中存在 SQL 查询失败的问题,错误代码为 145。此问题可能是由于数据库表损坏或索引失效所致,建议对相关表进行修复操作以恢复监控功能。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 本文详细介绍了在MySQL中如何高效利用EXPLAIN命令进行查询优化。通过实例解析和步骤说明,文章旨在帮助读者深入理解EXPLAIN命令的工作原理及其在性能调优中的应用,内容通俗易懂且结构清晰,适合各水平的数据库管理员和技术人员参考学习。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在HTML布局中,即使将 `top: 0%` 和 `left: 0%` 设置为元素的定位属性,浏览器中仍然会出现空白填充。这个问题通常与默认的浏览器样式、盒模型或父元素的定位方式有关。为了消除这些空白,可以考虑重置浏览器的默认样式,确保父元素的定位方式正确,并检查是否有其他CSS规则影响了元素的位置。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 在 Mac 上查看隐藏文件和文件夹的详细指南。通过终端命令,您可以轻松地显示或隐藏这些文件。具体步骤如下:输入 `defaults write com.apple.finder AppleShowAllFiles -bool true` 以显示所有隐藏文件,或使用 `defaults write com.apple.finder AppleShowAllFiles -bool false` 以重新隐藏它们。此方法适用于各种版本的 macOS,帮助用户更好地管理和访问系统文件。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 在关系型数据库中,数据约束是指在向数据表中插入数据时必须遵循的限制条件。在MySQL和MariaDB中,常见的数据约束包括主键约束、唯一键约束、外键约束以及非空约束等。这些约束确保了数据的完整性和一致性,是数据库管理中的重要组成部分。通过合理设置和使用这些约束,可以有效防止数据冗余和错误,提升数据库的可靠性和性能。 ... [详细]
author-avatar
一号香久山日氵冥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有